diff options
| -rw-r--r-- | lib/command.ml | 2 | ||||
| -rw-r--r-- | lib/editor.ml | 322 |
2 files changed, 184 insertions, 140 deletions
diff --git a/lib/command.ml b/lib/command.ml index a55fb9e..9ab36f6 100644 --- a/lib/command.ml +++ b/lib/command.ml | |||
| @@ -70,7 +70,7 @@ let to_scope = function | |||
| 70 | let is_simple_movement k = List.mem ~equal:Poly.equal simple_movements k | 70 | let is_simple_movement k = List.mem ~equal:Poly.equal simple_movements k |
| 71 | 71 | ||
| 72 | let instant_operation = | 72 | let instant_operation = |
| 73 | [ Key 'C'; Key 'D'; Key 'J'; Key 'P'; Key 'X'; Key 'p'; Key 'x' ] | 73 | [ Key 'C'; Key 'D'; Key 'Y'; Key 'J'; Key 'P'; Key 'X'; Key 'p'; Key 'x' ] |
| 74 | 74 | ||
| 75 | let chord_operation = [ Key 'c'; Key 'd'; Key 'y' ] | 75 | let chord_operation = [ Key 'c'; Key 'd'; Key 'y' ] |
| 76 | 76 | ||
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 *) |
