[UP] use ion3-plus haha.
[arrow.git] / archlinux_conf / etc / ion3 / old / vim-bindings.lua
blobfb0088f5bc7670546b46b0f73a9b574cec1748bb
1 -- vim-bindings.lua
2 --
3 -- This only affects queries.
4 --
5 -- Features:
6 -- Vi-keys for normal and insert modes.
7 -- Vim-style highlighting.
8 -- Numbered prefixes work for most maneuvers.
9 --
10 -- Limitations:
11 -- All WEdln objects share the same mode and undo history.
12 -- No r replace
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, _)"),
27 submap("c", {
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)"),
36 }),
37 kpress("Shift+c", "vim.yank(_, 'D', true, true)"),
38 submap("d", {
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)"),
47 }),
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),"
65 .."WEdln.back(_)}"),
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
117 edln:clear_mark()
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()
174 local first,last
175 local n=1
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
180 edln:set_mark()
181 for i=1,n do
182 if how=="b" then
183 edln:bskip_word()
184 elseif how=="D" then
185 edln:eol()
186 elseif how=="d" then
187 edln:bol()
188 edln:set_mark()
189 edln:eol()
190 elseif how=="h" then
191 edln:back()
192 elseif how=="l" then
193 edln:forward()
194 elseif how=="w" then
195 edln:skip_word()
196 elseif how=="0" then
197 edln:bol()
201 first=edln:mark()+1
202 last=edln:point()
203 if first>last then
204 first=last+1
205 last=edln:mark()
207 vim.clip=string.sub(edln:contents(), first, last)
208 if kill then
209 edln:cut()
210 else
211 edln:copy()
213 edln:clear_mark() -- just in case?
214 vim.cleardigit()
215 if insert then
216 vim.insert_mode()
220 function vim.undo(edln)
221 local str=edln:contents()
222 edln:kill_line()
223 edln:insstr(vim.old)
224 vim.old=str
225 edln:bol()
226 for i=1,vim.oldpoint do
227 edln:forward()
231 function vim.savehist(edln)
232 vim.old=edln:contents()
233 vim.oldpoint=edln:point()
236 function vim.zero(edln)
237 if vim.digit1 then
238 vim.dodigit(0)
239 else
240 edln:bol()
241 vim.cleardigit()
245 function vim.x(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)
249 else
250 vim.yank(edln, 'l', true)
254 function vim.highlight(edln)
255 if edln:mark() > -1 then
256 edln:clear_mark()
257 else
258 edln:set_mark()
260 vim.cleardigit()
263 function vim.paste(edln)
264 -- if something is highlighted, replace it.
265 local clip2=vim.clip
266 if edln:mark() > -1 then
267 first=edln:mark()+1
268 last=edln:point()
269 if first>last then
270 first=last+1
271 last=edln:mark()
273 vim.clip=string.sub(edln:contents(), first, last)
274 edln:cut()
276 edln:insstr(clip2)
277 vim.cleardigit()
280 function vim.multiply(f, edln, addtohistory)
281 if edln and addtohistory then
282 vim.old=edln:contents()
283 vim.oldpoint=edln:point()
285 local n=1
286 if vim.digit1 then n=vim.digit1 end
287 if vim.digit10 then n=n+10*vim.digit10 end
288 for i=1,n do
289 f(edln)
291 vim.cleardigit()
294 function vim.dodigit(digit)
295 vim.digit10=vim.digit1
296 vim.digit1=digit
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.
302 vim.digit1=nil
303 vim.digit10=nil
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
309 edln:delete()
310 edln:insstr(string.lower(c))
311 elseif string.find(c, "%l") then
312 edln:delete()
313 edln:insstr(string.upper(c))
314 else
315 edln:forward()
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
322 edln:delete()
323 c=c-1
324 if c==-1 then c=9 end
325 edln:insstr(tostring(c))
326 edln:back()
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
333 edln:delete()
334 c=c+1
335 if c==10 then c=0 end
336 edln:insstr(tostring(c))
337 edln:back()
341 vim.normal_mode()
342 vim.insert_mode()