summaryrefslogtreecommitdiff
path: root/lib/editor.ml
diff options
context:
space:
mode:
authorFederico Igne <undyamon@disroot.org>2024-01-26 20:39:04 +0100
committerFederico Igne <undyamon@disroot.org>2024-01-26 20:39:04 +0100
commit722a3d4d2d0d0630f57cfbfdddc229dee341505b (patch)
tree9c78f86190b4722b57640bd352516e574eefbead /lib/editor.ml
parentbabeb42c12a3f1bffaefd87d9f2b18e8ae2e8939 (diff)
downloadsandy-722a3d4d2d0d0630f57cfbfdddc229dee341505b.tar.gz
sandy-722a3d4d2d0d0630f57cfbfdddc229dee341505b.zip
feat: yank text to registers when yanking, changing or deleting
Diffstat (limited to 'lib/editor.ml')
-rw-r--r--lib/editor.ml322
1 files changed, 183 insertions, 139 deletions
diff --git a/lib/editor.ml b/lib/editor.ml
index 3368966..043c00e 100644
--- a/lib/editor.ml
+++ b/lib/editor.ml
@@ -95,12 +95,12 @@ module Action = struct
95 include Applicative.Make (struct 95 include Applicative.Make (struct
96 type 'a t = 'a action 96 type 'a t = 'a action
97 97
98 let return a s = (a, s) 98 let return a e = (a, e)
99 99
100 let apply f a e = 100 let apply f a e =
101 let f, e' = f e in 101 let g, e = f e in
102 let x, e'' = a e' in 102 let x, e = a e in
103 (f x, e'') 103 (g x, e)
104 104
105 let map = `Define_using_apply 105 let map = `Define_using_apply
106 end) 106 end)
@@ -108,7 +108,7 @@ module Action = struct
108 include Monad.Make (struct 108 include Monad.Make (struct
109 type 'a t = 'a action 109 type 'a t = 'a action
110 110
111 let return x s = (x, s) 111 let return x e = (x, e)
112 112
113 let bind a ~f x = 113 let bind a ~f x =
114 let y, a' = a x in 114 let y, a' = a x in
@@ -117,6 +117,8 @@ module Action = struct
117 let map = `Define_using_bind 117 let map = `Define_using_bind
118 end) 118 end)
119 119
120 let ( let* ) e f = bind e ~f
121 let ( and* ) = both
120 let get e = (e, e) 122 let get e = (e, e)
121 let put e _ = ((), e) 123 let put e _ = ((), e)
122 let modify ~f e = ((), f e) 124 let modify ~f e = ((), f e)
@@ -136,30 +138,30 @@ module Action = struct
136 let get_focused_buffer e = (e.buffer, e) 138 let get_focused_buffer e = (e.buffer, e)
137 let set_focused_buffer b e = ((), { e with buffer = b }) 139 let set_focused_buffer b e = ((), { e with buffer = b })
138 140
141 let on_focused_buffer f =
142 let* b = get_focused_buffer in
143 let out, b = f b in
144 let* () = set_focused_buffer b in
145 let* () = update_cursor in
146 return out
147
148 let simulate f =
149 let* b = get_focused_buffer in
150 return (f b |> fst)
151
139 let get_mode e = (e.mode, e) 152 let get_mode e = (e.mode, e)
140 let set_mode m e = ((), { e with mode = m }) 153 let set_mode m e = ((), { e with mode = m })
141 let get_terminal_size e = (e.term.size, e) 154 let get_terminal_size e = (e.term.size, e)
142 155
143 let get_register r e = 156 let get_register ?(r = '"') e =
144 assert (Char.('!' <= r && r <= '~')); 157 assert (Char.('!' <= r && r <= '~'));
145 (e.registers.(Char.to_int r), e) 158 (e.registers.(Char.to_int r), e)
146 159
147 let set_register r z e = 160 let set_register ?(r = '"') s e =
148 assert (Char.('!' <= r && r <= '~')); 161 assert (Char.('!' <= r && r <= '~'));
149 e.registers.(Char.to_int '"') <- z; 162 e.registers.(Char.to_int r) <- s;
150 e.registers.(Char.to_int r) <- z;
151 ((), e) 163 ((), e)
152 164
153 let on_focused_buffer f =
154 let f e = { e with buffer = Option.map ~f e.buffer } in
155 modify ~f *> update_cursor
156
157 let on_focused_buffer_or_new f =
158 (get_focused_buffer
159 >>| Option.value ~default:Buffer.empty
160 >>| f >>= set_focused_buffer)
161 *> update_cursor
162
163 let render = 165 let render =
164 let aux e = 166 let aux e =
165 let x, y = e.offset 167 let x, y = e.offset
@@ -228,30 +230,29 @@ let handle_insert_command =
228 | Simple Arrow_right -> Buffer.Action.move_right |> on_focused_buffer 230 | Simple Arrow_right -> Buffer.Action.move_right |> on_focused_buffer
229 | Simple Arrow_up -> Buffer.Action.move_up |> on_focused_buffer 231 | Simple Arrow_up -> Buffer.Action.move_up |> on_focused_buffer
230 | Simple Backspace -> 232 | Simple Backspace ->
231 Buffer.Action.delete_before ~cross_lines:true ~n:1 |> on_focused_buffer 233 Buffer.Action.delete_before ~cross_lines:true ~n:1
234 |> on_focused_buffer |> ignore_m
232 | Simple (Ctrl 'Q') -> quit 0 235 | Simple (Ctrl 'Q') -> quit 0
233 | Simple Delete -> 236 | Simple Delete ->
234 Buffer.Action.delete_after ~cross_lines:true ~n:1 |> on_focused_buffer 237 Buffer.Action.delete_after ~cross_lines:true ~n:1
238 |> on_focused_buffer |> ignore_m
235 | Simple Enter -> Buffer.Action.newline |> on_focused_buffer 239 | Simple Enter -> Buffer.Action.newline |> on_focused_buffer
236 | Simple Esc -> 240 | Simple Esc ->
237 (Buffer.Action.move_left |> on_focused_buffer) *> set_mode Normal 241 let* () = Buffer.Action.move_left |> on_focused_buffer in
242 set_mode Normal
238 | Simple Page_down | Simple (Ctrl 'F') -> 243 | Simple Page_down | Simple (Ctrl 'F') ->
239 fun e -> 244 (* TODO consider using the buffer window size (i.e., subtract status_size) *)
240 (* TODO consider using the buffer window size (i.e., subtract status_size) *) 245 let* n, _ = get_terminal_size in
241 let (n, _), e = get_terminal_size e in 246 Buffer.Action.move_down ~n |> on_focused_buffer
242 on_focused_buffer (Buffer.Action.move_down ~n) e
243 | Simple Page_up | Simple (Ctrl 'B') -> 247 | Simple Page_up | Simple (Ctrl 'B') ->
244 fun e -> 248 let* n, _ = get_terminal_size in
245 let (n, _), e = get_terminal_size e in 249 Buffer.Action.move_up ~n |> on_focused_buffer
246 on_focused_buffer (Buffer.Action.move_up ~n) e
247 | Simple (Ctrl 'D') -> 250 | Simple (Ctrl 'D') ->
248 fun e -> 251 let* r, _ = get_terminal_size in
249 let (r, _), e = get_terminal_size e in 252 Buffer.Action.move_down ~n:(r / 2) |> on_focused_buffer
250 on_focused_buffer (Buffer.Action.move_down ~n:(r / 2)) e
251 | Simple (Ctrl 'U') -> 253 | Simple (Ctrl 'U') ->
252 fun e -> 254 let* r, _ = get_terminal_size in
253 let (r, _), e = get_terminal_size e in 255 Buffer.Action.move_up ~n:(r / 2) |> on_focused_buffer
254 on_focused_buffer (Buffer.Action.move_up ~n:(r / 2)) e
255 | Simple Home -> Buffer.Action.bol |> on_focused_buffer 256 | Simple Home -> Buffer.Action.bol |> on_focused_buffer
256 | Simple End -> Buffer.Action.eol |> on_focused_buffer 257 | Simple End -> Buffer.Action.eol |> on_focused_buffer
257 | Simple Tab -> Buffer.Action.insert '\t' |> on_focused_buffer 258 | Simple Tab -> Buffer.Action.insert '\t' |> on_focused_buffer
@@ -277,128 +278,172 @@ let handle_normal_command c =
277 | Chord (_, n, Noop, _, Up) -> Buffer.Action.move_up ?n |> on_focused_buffer 278 | Chord (_, n, Noop, _, Up) -> Buffer.Action.move_up ?n |> on_focused_buffer
278 | Chord (_, n, Noop, _, To_bol) -> 279 | Chord (_, n, Noop, _, To_bol) ->
279 let n = Option.value ~default:1 n - 1 in 280 let n = Option.value ~default:1 n - 1 in
280 Buffer.Action.(move_down ~n &> bol) |> on_focused_buffer 281 Buffer.Action.bol ~n |> on_focused_buffer
281 | Chord (_, n, Noop, _, To_eol) -> 282 | Chord (_, n, Noop, _, To_eol) ->
282 let n = Option.value ~default:1 n - 1 in 283 let n = Option.value ~default:1 n - 1 in
283 Buffer.Action.(move_down ~n &> eol) |> on_focused_buffer 284 Buffer.Action.eol ~n |> on_focused_buffer
284 | Simple Page_down | Simple (Ctrl 'F') -> 285 | Simple Page_down | Simple (Ctrl 'F') ->
285 fun e -> 286 let* n, _ = get_terminal_size in
286 let (n, _), e = get_terminal_size e in 287 Buffer.Action.move_down ~n |> on_focused_buffer
287 on_focused_buffer (Buffer.Action.move_down ~n) e
288 | Simple Page_up | Simple (Ctrl 'B') -> 288 | Simple Page_up | Simple (Ctrl 'B') ->
289 fun e -> 289 let* n, _ = get_terminal_size in
290 let (n, _), e = get_terminal_size e in 290 Buffer.Action.move_up ~n |> on_focused_buffer
291 on_focused_buffer (Buffer.Action.move_up ~n) e
292 | Simple (Ctrl 'D') -> 291 | Simple (Ctrl 'D') ->
293 fun e -> 292 let* r, _ = get_terminal_size in
294 let (r, _), e = get_terminal_size e in 293 Buffer.Action.move_down ~n:(r / 2) |> on_focused_buffer
295 on_focused_buffer (Buffer.Action.move_down ~n:(r / 2)) e
296 | Simple (Ctrl 'U') -> 294 | Simple (Ctrl 'U') ->
297 fun e -> 295 let* r, _ = get_terminal_size in
298 let (r, _), e = get_terminal_size e in 296 Buffer.Action.move_up ~n:(r / 2) |> on_focused_buffer
299 on_focused_buffer (Buffer.Action.move_up ~n:(r / 2)) e 297 (* Yank *)
300 (* Change *) 298 | Shortcut (r, n, Yank) ->
301 | Shortcut (_, n, Change) ->
302 let n = Option.value ~default:1 n - 1 in 299 let n = Option.value ~default:1 n - 1 in
303 (Buffer.Action.( 300 let* out = Buffer.Action.delete_to_eol ~n |> simulate in
304 delete_to_eol &> move_down &> delete_lines ~n &> move_up &> eol) 301 set_register ?r (Glyphwise out)
305 |> on_focused_buffer_or_new) 302 | Chord (r, n1, Yank, n2, Line) ->
306 *> set_mode Insert
307 | Chord (_, n1, Change, n2, Line) ->
308 let n = Option.((value ~default:1 n1 * value ~default:1 n2) - 1) in
309 (Buffer.Action.(delete_lines ~n &> bol &> delete_to_eol)
310 |> on_focused_buffer_or_new)
311 *> set_mode Insert
312 | Chord (_, n1, Change, n2, Down) ->
313 let n = Option.(value ~default:1 n1 * value ~default:1 n2) in 303 let n = Option.(value ~default:1 n1 * value ~default:1 n2) in
314 (Buffer.Action.(delete_lines ~n &> bol &> delete_to_eol) 304 let* out = Buffer.Action.delete_lines ~n |> simulate in
315 |> on_focused_buffer_or_new) 305 set_register ?r (Linewise out)
316 *> set_mode Insert 306 | Chord (r, n1, Yank, n2, Down) ->
317 | Chord (_, n1, Change, n2, Left) -> 307 let n = Option.((value ~default:1 n1 * value ~default:1 n2) + 1) in
308 let* out = Buffer.Action.delete_lines ~n |> simulate in
309 set_register ?r (Linewise out)
310 | Chord (r, n1, Yank, n2, Left) ->
318 let n = Option.(value ~default:1 n1 * value ~default:1 n2) in 311 let n = Option.(value ~default:1 n1 * value ~default:1 n2) in
319 (Buffer.Action.delete_before ~n |> on_focused_buffer_or_new) 312 let* out = Buffer.Action.delete_before ~n |> simulate in
320 *> set_mode Insert 313 set_register ?r (Glyphwise out)
321 | Chord (_, n1, Change, n2, Right) -> 314 | Chord (r, n1, Yank, n2, Right) ->
322 let n = Option.(value ~default:1 n1 * value ~default:1 n2) in 315 let n = Option.(value ~default:1 n1 * value ~default:1 n2) in
323 (Buffer.Action.delete_after ~n |> on_focused_buffer_or_new) 316 let* out = Buffer.Action.delete_after ~n |> simulate in
324 *> set_mode Insert 317 set_register ?r (Glyphwise out)
325 | Chord (_, n1, Change, n2, Up) -> 318 | Chord (r, n1, Yank, n2, Up) ->
326 let n = Option.(value ~default:1 n1 * value ~default:1 n2) in 319 let n = Option.(value ~default:1 n1 * value ~default:1 n2) in
327 (Buffer.Action.(bol &> delete_to_eol &> delete_lines_before ~n) 320 let* out =
328 |> on_focused_buffer_or_new) 321 Buffer.Action.(move_up ~n *> delete_lines ~n:(n + 1)) |> simulate
329 *> set_mode Insert 322 in
330 | Chord (_, n1, Change, n2, To_bol) -> 323 set_register ?r (Linewise out)
324 | Chord (r, _, Yank, _, To_bol) ->
325 let* out = Buffer.Action.delete_to_bol |> simulate in
326 set_register ?r (Glyphwise out)
327 | Chord (r, n1, Yank, n2, To_eol) ->
331 let n = Option.((value ~default:1 n1 * value ~default:1 n2) - 1) in 328 let n = Option.((value ~default:1 n1 * value ~default:1 n2) - 1) in
332 (Buffer.Action.( 329 let* out = Buffer.Action.delete_to_eol ~n |> simulate in
333 delete_to_bol &> move_down &> delete_lines ~n &> move_up &> bol) 330 set_register ?r (Glyphwise out)
334 |> on_focused_buffer_or_new) 331 (* Change *)
335 *> set_mode Insert 332 | Shortcut (r, n, Change) ->
336 | Chord (_, n1, Change, n2, To_eol) -> 333 let n = Option.value ~default:1 n - 1 in
334 let* out = Buffer.Action.delete_to_eol ~n |> on_focused_buffer in
335 let* () = set_register ?r (Glyphwise out) in
336 set_mode Insert
337 | Chord (r, n1, Change, n2, Line) ->
338 let n = Option.(value ~default:1 n1 * value ~default:1 n2) in
339 let act =
340 let open Buffer.Action in
341 let* out = delete_lines ~n
342 and* () = insert_line ~before:true *> move_up in
343 return out
344 in
345 let* out = act |> on_focused_buffer in
346 let* () = set_register ?r (Linewise out) in
347 set_mode Insert
348 | Chord (r, n1, Change, n2, Down) ->
349 let n = Option.(value ~default:1 n1 * value ~default:1 n2) + 1 in
350 let act =
351 let open Buffer.Action in
352 let* out = delete_lines ~n
353 and* () = insert_line ~before:true *> move_up in
354 return out
355 in
356 let* out = act |> on_focused_buffer in
357 let* () = set_register ?r (Linewise out) in
358 set_mode Insert
359 | Chord (r, n1, Change, n2, Left) ->
360 let n = Option.(value ~default:1 n1 * value ~default:1 n2) in
361 let* out = Buffer.Action.delete_before ~n |> on_focused_buffer in
362 let* () = set_register ?r (Glyphwise out) in
363 set_mode Insert
364 | Chord (r, n1, Change, n2, Right) ->
365 let n = Option.(value ~default:1 n1 * value ~default:1 n2) in
366 let* out = Buffer.Action.delete_after ~n |> on_focused_buffer in
367 let* () = set_register ?r (Glyphwise out) in
368 set_mode Insert
369 | Chord (r, n1, Change, n2, Up) ->
370 let n = Option.(value ~default:1 n1 * value ~default:1 n2) in
371 let act =
372 let open Buffer.Action in
373 let* out = move_up ~n *> delete_lines ~n:(n + 1)
374 and* () = insert_line ~before:true *> move_up in
375 return out
376 in
377 let* out = act |> on_focused_buffer in
378 let* () = set_register ?r (Linewise out) in
379 set_mode Insert
380 | Chord (r, _, Change, _, To_bol) ->
381 let* out = Buffer.Action.delete_to_bol |> on_focused_buffer in
382 let* () = set_register ?r (Glyphwise out) in
383 set_mode Insert
384 | Chord (r, n1, Change, n2, To_eol) ->
337 let n = Option.((value ~default:1 n1 * value ~default:1 n2) - 1) in 385 let n = Option.((value ~default:1 n1 * value ~default:1 n2) - 1) in
338 (Buffer.Action.( 386 let* out = Buffer.Action.delete_to_eol ~n |> on_focused_buffer in
339 delete_to_eol &> move_down &> delete_lines ~n &> move_up &> eol) 387 let* () = set_register ?r (Glyphwise out) in
340 |> on_focused_buffer_or_new) 388 set_mode Insert
341 *> set_mode Insert
342 (* Delete *) 389 (* Delete *)
343 | Shortcut (_, n, Delete) -> 390 | Shortcut (r, n, Delete) ->
344 let n = Option.value ~default:1 n - 1 in 391 let n = Option.value ~default:1 n - 1 in
345 Buffer.Action.( 392 let* out = Buffer.Action.delete_to_eol ~n |> on_focused_buffer in
346 delete_to_eol &> move_down &> delete_lines ~n &> move_up &> eol) 393 set_register ?r (Glyphwise out)
347 |> on_focused_buffer_or_new 394 | Chord (r, n1, Delete, n2, Line) ->
348 | Chord (_, n1, Delete, n2, Line) ->
349 let n = Option.(value ~default:1 n1 * value ~default:1 n2) in 395 let n = Option.(value ~default:1 n1 * value ~default:1 n2) in
350 Buffer.Action.delete_lines ~n |> on_focused_buffer_or_new 396 let* out = Buffer.Action.delete_lines ~n |> on_focused_buffer in
351 | Chord (_, n1, Delete, n2, Down) -> 397 set_register ?r (Linewise out)
398 | Chord (r, n1, Delete, n2, Down) ->
352 let n = Option.((value ~default:1 n1 * value ~default:1 n2) + 1) in 399 let n = Option.((value ~default:1 n1 * value ~default:1 n2) + 1) in
353 Buffer.Action.delete_lines ~n |> on_focused_buffer_or_new 400 let* out = Buffer.Action.delete_lines ~n |> on_focused_buffer in
354 | Chord (_, n1, Delete, n2, Left) -> 401 set_register ?r (Linewise out)
402 | Chord (r, n1, Delete, n2, Left) ->
355 let n = Option.(value ~default:1 n1 * value ~default:1 n2) in 403 let n = Option.(value ~default:1 n1 * value ~default:1 n2) in
356 Buffer.Action.delete_before ~n |> on_focused_buffer_or_new 404 let* out = Buffer.Action.delete_before ~n |> on_focused_buffer in
357 | Shortcut (_, n, Erase_before) -> 405 set_register ?r (Glyphwise out)
358 let n = Option.(value ~default:1 n) in 406 | Chord (r, n1, Delete, n2, Right) ->
359 Buffer.Action.delete_before ~n |> on_focused_buffer_or_new
360 | Chord (_, n1, Delete, n2, Right) ->
361 let n = Option.(value ~default:1 n1 * value ~default:1 n2) in 407 let n = Option.(value ~default:1 n1 * value ~default:1 n2) in
362 Buffer.Action.delete_after ~n |> on_focused_buffer_or_new 408 let* out = Buffer.Action.delete_after ~n |> on_focused_buffer in
363 | Shortcut (_, n, Erase_after) -> 409 set_register ?r (Glyphwise out)
364 let n = Option.(value ~default:1 n) in 410 | Chord (r, n1, Delete, n2, Up) ->
365 Buffer.Action.delete_after ~n |> on_focused_buffer_or_new
366 | Chord (_, n1, Delete, n2, Up) ->
367 let n = Option.(value ~default:1 n1 * value ~default:1 n2) in 411 let n = Option.(value ~default:1 n1 * value ~default:1 n2) in
368 Buffer.Action.(delete_lines ~n:1 &> delete_lines_before ~n) 412 let* out =
369 |> on_focused_buffer_or_new 413 Buffer.Action.(move_up ~n *> delete_lines ~n:(n + 1))
370 | Chord (_, n1, Delete, n2, To_bol) -> 414 |> on_focused_buffer
371 let n = Option.((value ~default:1 n1 * value ~default:1 n2) - 1) in 415 in
372 Buffer.Action.( 416 set_register ?r (Linewise out)
373 delete_to_bol &> move_down &> delete_lines ~n &> move_up &> bol) 417 | Shortcut (r, n, Erase_before) ->
374 |> on_focused_buffer_or_new 418 let n = Option.value ~default:1 n in
375 | Chord (_, n1, Delete, n2, To_eol) -> 419 let* out = Buffer.Action.delete_before ~n |> on_focused_buffer in
420 set_register ?r (Glyphwise out)
421 | Shortcut (r, n, Erase_after) ->
422 let n = Option.value ~default:1 n in
423 let* out = Buffer.Action.delete_after ~n |> on_focused_buffer in
424 set_register ?r (Glyphwise out)
425 | Chord (r, _, Delete, _, To_bol) ->
426 let* out = Buffer.Action.delete_to_bol |> on_focused_buffer in
427 set_register ?r (Glyphwise out)
428 | Chord (r, n1, Delete, n2, To_eol) ->
376 let n = Option.((value ~default:1 n1 * value ~default:1 n2) - 1) in 429 let n = Option.((value ~default:1 n1 * value ~default:1 n2) - 1) in
377 Buffer.Action.( 430 let* out = Buffer.Action.delete_to_eol ~n |> on_focused_buffer in
378 delete_to_eol &> move_down &> delete_lines ~n &> move_up &> eol) 431 set_register ?r (Glyphwise out)
379 |> on_focused_buffer_or_new
380 (* Paste *) 432 (* Paste *)
381 | Shortcut (r, n, Paste_after) -> 433 | Shortcut (r, n, Paste_after) -> (
382 let r = Option.value ~default:'"' r in 434 get_register ?r >>= function
383 let paste = function 435 | Empty -> noop
384 | Empty -> noop 436 | Glyphwise z -> Buffer.Action.paste ?n z |> on_focused_buffer
385 | Glyphwise z -> Buffer.Action.paste ?n z |> on_focused_buffer_or_new 437 | Linewise z ->
386 | Linewise z -> 438 Buffer.Action.paste ~linewise:true ?n z |> on_focused_buffer)
387 Buffer.Action.paste ~linewise:true ?n z 439 | Shortcut (r, n, Paste_before) -> (
388 |> on_focused_buffer_or_new 440 get_register ?r >>= function
389 in 441 | Empty -> noop
390 get_register r >>= paste 442 | Glyphwise z ->
391 | Shortcut (r, n, Paste_before) -> 443 Buffer.Action.paste ~before:true ?n z |> on_focused_buffer
392 let r = Option.value ~default:'"' r in 444 | Linewise z ->
393 let paste = function 445 Buffer.Action.paste ~before:true ~linewise:true ?n z
394 | Empty -> noop 446 |> on_focused_buffer)
395 | Glyphwise z ->
396 Buffer.Action.paste ~before:true ?n z |> on_focused_buffer_or_new
397 | Linewise z ->
398 Buffer.Action.paste ~before:true ~linewise:true ?n z
399 |> on_focused_buffer_or_new
400 in
401 get_register r >>= paste
402 (* Join *) 447 (* Join *)
403 | Shortcut (_, n, Join) -> 448 | Shortcut (_, n, Join) ->
404 let n = Option.(value ~default:2 n) in 449 let n = Option.(value ~default:2 n) in
@@ -407,13 +452,12 @@ let handle_normal_command c =
407 | Simple (Ctrl 'Q') -> quit 0 452 | Simple (Ctrl 'Q') -> quit 0
408 (* Misc *) 453 (* Misc *)
409 | Simple (Key 'A') -> 454 | Simple (Key 'A') ->
410 (Buffer.Action.eol |> on_focused_buffer_or_new) *> set_mode Insert 455 (Buffer.Action.eol |> on_focused_buffer) *> set_mode Insert
411 | Simple (Key 'a') -> 456 | Simple (Key 'a') ->
412 (Buffer.Action.move_right |> on_focused_buffer_or_new) 457 (Buffer.Action.move_right |> on_focused_buffer) *> set_mode Insert
413 *> set_mode Insert
414 (* | Key 'G' -> Buffer.Action.eof |> on_focused_buffer_or_new *) 458 (* | Key 'G' -> Buffer.Action.eof |> on_focused_buffer_or_new *)
415 (* | Key 'I' -> noop *) 459 (* | Key 'I' -> noop *)
416 | Simple (Key 'i') -> (Fn.id |> on_focused_buffer_or_new) *> set_mode Insert 460 | Simple (Key 'i') -> set_mode Insert
417 (* | Key 's' -> *) 461 (* | Key 's' -> *)
418 (* (Buffer.Action.delete_after |> on_focused_buffer_or_new) *) 462 (* (Buffer.Action.delete_after |> on_focused_buffer_or_new) *)
419 (* *> set_mode Insert *) 463 (* *> set_mode Insert *)