3 -- This only affects queries.
6 -- Vi-keys for normal and insert modes.
7 -- Vim-style highlighting.
8 -- Numbered prefixes work for most maneuvers.
11 -- All WEdln objects share the same mode and undo history.
13 -- No . repeat last action
14 -- No character search.
15 -- 3cw will work; c3w won't.
16 -- Not all unused symbols are silenced in normal mode
17 -- (so don't type them)
18 -- Use Shift+Insert to paste from other apps, p to paste yanked text.
20 vim
={clip
="",old
="",oldpoint
=0}
21 function vim
.normal_mode()
22 defbindings("WEdln", {
23 kpress("a", "{WEdln.forward(_), vim.insert_mode(), vim.savehist(_)}"),
24 kpress("Shift+a", "{WEdln.eol(_), vim.insert_mode(), vim.savehist(_)}"),
25 kpress("b", "vim.multiply(WEdln.bskip_word, _)"),
26 kpress("Shift+b", "vim.multiply(WEdln.bskip_word, _)"),
28 kpress("b", "vim.yank(_, 'b', true, true)"),
29 kpress("c", "vim.yank(_, 'd', true, true)"),
30 kpress("h", "vim.yank(_, 'h', true, true)"),
31 kpress("l", "vim.yank(_, 'l', true, true)"),
32 kpress("w", "vim.yank(_, 'w', true, true)"),
33 kpress("0", "vim.yank(_, '0', true, true)"),
34 kpress("Shift+6", "vim.yank(_, '0', true, true)"),
35 kpress("Shift+4", "vim.yank(_, 'D', true, true)"),
37 kpress("Shift+c", "vim.yank(_, 'D', true, true)"),
39 kpress("b", "vim.yank(_, 'b', true)"),
40 kpress("d", "vim.yank(_, 'd', true)"),
41 kpress("h", "vim.yank(_, 'h', true)"),
42 kpress("l", "vim.yank(_, 'l', true)"),
43 kpress("w", "vim.yank(_, 'w', true)"),
44 kpress("0", "vim.yank(_, '0', true)"),
45 kpress("Shift+6", "vim.yank(_, '0', true)"),
46 kpress("Shift+4", "vim.yank(_, 'D', true)"),
48 kpress("Shift+d", "vim.yank(_, 'D', true)"),
49 kpress("e", "{_:forward(), vim.multiply(WEdln.skip_word,_), _:back()}"),
50 kpress("Shift+e", "{_:forward(), vim.multiply(WEdln.skip_word,_), _:back()}"),
51 kpress("f", "vim.cleardigit()"),
52 kpress("g", "vim.cleardigit()"),
53 kpress("h", "vim.multiply(WEdln.back,_)"),
54 kpress("i", "{vim.insert_mode(), vim.savehist(_)}"),
55 kpress("Shift+i", "{WEdln.bol(_), vim.insert_mode(), vim.savehist(_)}"),
56 kpress("j", "vim.multiply(WEdln.history_next, _)"),
57 kpress("k", "vim.multiply(WEdln.history_prev, _)"),
58 kpress("Control+n", "vim.multiply(WEdln.history_next, _)"),
59 kpress("Control+p", "vim.multiply(WEdln.history_prev, _)"),
60 kpress("l", "vim.multiply(WEdln.forward, _)"),
61 kpress("m", "vim.cleardigit()"),
62 kpress("n", "vim.cleardigit()"),
63 kpress("o", "vim.cleardigit()"),
64 kpress("p", "{WEdln.forward(_), vim.multiply(vim.paste,_,true),"
66 kpress("Shift+p", "vim.multiply(vim.paste,_,true)"),
67 kpress("q", "vim.cleardigit()"),
68 kpress("r", "vim.cleardigit()"),
69 kpress("s", "vim.yank(_, 'l', true, true)"),
70 kpress("Shift+s", "vim.yank(_, 'd', true, true)"),
71 kpress("t", "vim.cleardigit()"),
72 kpress("u", "vim.undo(_)"),
73 kpress("v", "vim.highlight(_)"),
74 kpress("w", "vim.multiply(WEdln.skip_word, _)"),
75 kpress("Shift+w", "vim.multiply(WEdln.skip_word, _)"),
76 kpress("x", "vim.x(_)"),
77 kpress("Shift+x", "vim.yank(_, 'h', true)"),
78 kpress("y", "vim.yank(_)"),
79 kpress("Shift+y", "vim.yank(_, 'd')"),
80 kpress("z", "vim.cleardigit()"),
81 kpress("0", "vim.zero(_)"),
82 kpress("1", "vim.dodigit(1)"),
83 kpress("2", "vim.dodigit(2)"),
84 kpress("3", "vim.dodigit(3)"),
85 kpress("4", "vim.dodigit(4)"),
86 kpress("5", "vim.dodigit(5)"),
87 kpress("6", "vim.dodigit(6)"),
88 kpress("7", "vim.dodigit(7)"),
89 kpress("8", "vim.dodigit(8)"),
90 kpress("9", "vim.dodigit(9)"),
91 kpress("Shift+6", "{vim.cleardigit(), WEdln.bol(_)}"),
92 kpress("Shift+4", "{vim.cleardigit(), WEdln.eol(_)}"),
93 kpress("BackSpace", "vim.multiply(WEdln.back, _)"),
94 kpress("space", "vim.multiply(WEdln.forward, _)"),
95 kpress("Shift+grave", "vim.multiply(vim.switchcase,_,true)"),
96 kpress("Control+A", "vim.multiply(vim.increment, _)"),
97 kpress("Control+X", "vim.multiply(vim.decrement, _)"),
99 kpress("Shift+f", "vim.cleardigit()"),
100 kpress("Shift+g", "vim.cleardigit()"), kpress("Shift+h", "vim.cleardigit()"),
101 kpress("Shift+j", "vim.cleardigit()"), kpress("Shift+k", "vim.cleardigit()"),
102 kpress("Shift+l", "vim.cleardigit()"), kpress("Shift+m", "vim.cleardigit()"),
103 kpress("Shift+n", "vim.cleardigit()"), kpress("Shift+o", "vim.cleardigit()"),
104 kpress("Shift+q", "vim.cleardigit()"), kpress("Shift+r", "vim.cleardigit()"),
105 kpress("Shift+t", "vim.cleardigit()"), kpress("Shift+u", "vim.cleardigit()"),
106 kpress("Shift+v", "vim.cleardigit()"),
107 kpress("Shift+z", "vim.cleardigit()"), kpress("Shift+0", "vim.cleardigit()"),
108 kpress("Shift+1", "vim.cleardigit()"), kpress("Shift+2", "vim.cleardigit()"),
109 kpress("Shift+3", "vim.cleardigit()"), kpress("Shift+5", "vim.cleardigit()"),
110 kpress("Shift+7", "vim.cleardigit()"), kpress("Shift+8", "vim.cleardigit()"),
111 kpress("Shift+9", "vim.cleardigit()"),
115 function vim
.insert_mode()
116 for _
,edln
in pairs(ioncore
.region_list("WEdln")) do
119 defbindings("WEdln", {
120 kpress("Control+w", "WEdln.bkill_word(_)"),
121 kpress("Control+n", "WEdln.next_completion(_, true)"),
122 kpress("Control+p", "WEdln.prev_completion(_, true)"),
123 kpress("Escape", "vim.normal_mode()"),
124 kpress("Control+bracketleft", "vim.normal_mode()"),
126 kpress("BackSpace", "WEdln.backspace(_)"),
127 kpress("Mod1+BackSpace", "WEdln.bkill_word(_)"),
128 kpress("a", nil), kpress("b", nil), kpress("c", nil),
129 kpress("d", nil), kpress("e", nil), kpress("f", nil),
130 kpress("g", nil), kpress("h", nil), kpress("i", nil),
131 kpress("j", nil), kpress("k", nil), kpress("l", nil),
132 kpress("m", nil), kpress("n", nil), kpress("o", nil),
133 kpress("p", nil), kpress("q", nil), kpress("r", nil),
134 kpress("s", nil), kpress("t", nil), kpress("u", nil),
135 kpress("v", nil), kpress("w", nil), kpress("x", nil),
136 kpress("y", nil), kpress("z", nil), kpress("0", nil),
137 kpress("1", nil), kpress("2", nil), kpress("3", nil),
138 kpress("4", nil), kpress("5", nil), kpress("6", nil),
139 kpress("7", nil), kpress("8", nil), kpress("9", nil),
140 kpress("Shift+a", nil), kpress("Shift+b", nil), kpress("Shift+c", nil),
141 kpress("Shift+d", nil), kpress("Shift+e", nil), kpress("Shift+f", nil),
142 kpress("Shift+g", nil), kpress("Shift+h", nil), kpress("Shift+i", nil),
143 kpress("Shift+j", nil), kpress("Shift+k", nil), kpress("Shift+l", nil),
144 kpress("Shift+m", nil), kpress("Shift+n", nil), kpress("Shift+o", nil),
145 kpress("Shift+p", nil), kpress("Shift+q", nil), kpress("Shift+r", nil),
146 kpress("Shift+s", nil), kpress("Shift+t", nil), kpress("Shift+u", nil),
147 kpress("Shift+v", nil), kpress("Shift+w", nil), kpress("Shift+x", nil),
148 kpress("Shift+y", nil), kpress("Shift+z", nil), kpress("Shift+0", nil),
149 kpress("Shift+1", nil), kpress("Shift+2", nil), kpress("Shift+3", nil),
150 kpress("Shift+4", nil), kpress("Shift+5", nil), kpress("Shift+6", nil),
151 kpress("Shift+7", nil), kpress("Shift+8", nil), kpress("Shift+9", nil),
152 kpress("space", nil),
153 kpress("Shift+grave", nil),
154 kpress("Control+A", nil),
155 kpress("Control+X", nil),
159 defbindings("WInput", {
160 kpress("Control+C", "{vim.cleardigit(), WInput.cancel(_)}"),
161 kpress("Control+F", "WInput.scrollup(_)"),
162 kpress("Control+B", "WInput.scrolldown(_)"),
163 kpress("Page_Up", "WInput.scrollup(_)"),
164 kpress("Page_Down", "WInput.scrolldown(_)"),
166 defbindings("WEdln", {
167 kpress("Shift+Insert", "WEdln.paste(_)"),
168 kpress("Return", "{vim.cleardigit(), WEdln.finish(_)}"),
171 function vim
.yank(edln
, how
, kill
, insert
)
172 vim
.old
=edln
:contents()
173 vim
.oldpoint
=edln
:point()
176 if vim
.digit1
then n
=vim
.digit1
end
177 if vim
.digit10
then n
=n
+10*vim
.digit10
end
179 if edln
:mark() < 0 then
207 vim
.clip
=string.sub(edln
:contents(), first
, last
)
213 edln
:clear_mark() -- just in case?
220 function vim
.undo(edln
)
221 local str
=edln
:contents()
226 for i
=1,vim
.oldpoint
do
231 function vim
.savehist(edln
)
232 vim
.old
=edln
:contents()
233 vim
.oldpoint
=edln
:point()
236 function vim
.zero(edln
)
246 -- x is only a backspace when there is nothing ahead.
247 if string.len(edln
:contents()) == edln
:point() then
248 vim
.yank(edln
, 'h', true)
250 vim
.yank(edln
, 'l', true)
254 function vim
.highlight(edln
)
255 if edln
:mark() > -1 then
263 function vim
.paste(edln
)
264 -- if something is highlighted, replace it.
266 if edln
:mark() > -1 then
273 vim
.clip
=string.sub(edln
:contents(), first
, last
)
280 function vim
.multiply(f
, edln
, addtohistory
)
281 if edln
and addtohistory
then
282 vim
.old
=edln
:contents()
283 vim
.oldpoint
=edln
:point()
286 if vim
.digit1
then n
=vim
.digit1
end
287 if vim
.digit10
then n
=n
+10*vim
.digit10
end
294 function vim
.dodigit(digit
)
295 vim
.digit10
=vim
.digit1
299 function vim
.cleardigit()
300 -- This function needs to go almost everywhere. Doing the wrong thing
301 -- 10 times because a number was pressed ages ago, would be bad.
306 function vim
.switchcase(edln
)
307 local c
=string.sub(edln
:contents(), edln
:point()+1, edln
:point()+1)
308 if string.find(c
, "%u") then
310 edln
:insstr(string.lower(c
))
311 elseif string.find(c
, "%l") then
313 edln
:insstr(string.upper(c
))
319 function vim
.decrement(edln
)
320 local c
=string.sub(edln
:contents(), edln
:point()+1, edln
:point()+1)
321 if string.find(c
, "%d") then
324 if c
==-1 then c
=9 end
325 edln
:insstr(tostring(c
))
330 function vim
.increment(edln
)
331 local c
=string.sub(edln
:contents(), edln
:point()+1, edln
:point()+1)
332 if string.find(c
, "%d") then
335 if c
==10 then c
=0 end
336 edln
:insstr(tostring(c
))