From 43bf616d8e58adf393762b13663cbff5ffb84ce3 Mon Sep 17 00:00:00 2001 From: Federico Igne Date: Mon, 22 Jan 2024 23:42:56 +0100 Subject: feat(mappings): Page Up/Down, Ctrl-F/B/D/U, Home, End --- lib/command.ml | 6 ++++-- lib/editor.ml | 40 ++++++++++++++++++++++++++++++++++++++-- 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/lib/command.ml b/lib/command.ml index a68c723..31e2ca2 100644 --- a/lib/command.ml +++ b/lib/command.ml @@ -53,6 +53,8 @@ let simple_movements = Arrow_left; Arrow_right; Backspace; + End; + Home; ] let to_scope = function @@ -60,8 +62,8 @@ let to_scope = function | Key 'h' | Arrow_left | Backspace -> Left | Key 'l' | Key ' ' | Arrow_right -> Right | Key 'k' | Arrow_up -> Up - | Key '0' -> To_bol - | Key '$' -> To_eol + | Key '0' | Home -> To_bol + | Key '$' | End -> To_eol | _ -> failwith "Invalid motion." let is_simple_movement k = List.mem ~equal:Poly.equal simple_movements k diff --git a/lib/editor.ml b/lib/editor.ml index 96623f2..f91e66d 100644 --- a/lib/editor.ml +++ b/lib/editor.ml @@ -78,10 +78,11 @@ module Action = struct in modify ~f:aux - let get_mode s = (s.mode, s) - let set_mode m s = ((), { s with mode = m }) + let get_mode e = (e.mode, e) + let set_mode m e = ((), { e with mode = m }) let get_focused_buffer e = (e.buffer, e) let set_focused_buffer b e = ((), { e with buffer = Some b }) + let get_terminal_size e = (e.term.size, e) let on_focused_buffer f = let f e = { e with buffer = Option.map ~f e.buffer } in @@ -198,6 +199,25 @@ let handle_insert_command = | Simple Enter -> Buffer.Action.newline |> on_focused_buffer | Simple Esc -> (Buffer.Action.move_left |> on_focused_buffer) *> set_mode Normal + | Simple Page_down | Simple (Ctrl 'F') -> + fun e -> + let (n, _), e = get_terminal_size e in + on_focused_buffer (Buffer.Action.move_down ~n) e + | Simple Page_up | Simple (Ctrl 'B') -> + fun e -> + let (n, _), e = get_terminal_size e in + on_focused_buffer (Buffer.Action.move_up ~n) e + | Simple (Ctrl 'D') -> + fun e -> + let (r, _), e = get_terminal_size e in + on_focused_buffer (Buffer.Action.move_down ~n:(r / 2)) e + | Simple (Ctrl 'U') -> + fun e -> + let (r, _), e = get_terminal_size e in + on_focused_buffer (Buffer.Action.move_up ~n:(r / 2)) e + | Simple Home -> Buffer.Action.bol |> on_focused_buffer + | Simple End -> Buffer.Action.eol |> on_focused_buffer + | Simple Tab -> Buffer.Action.insert '\t' |> on_focused_buffer | Type k -> Buffer.Action.insert k |> on_focused_buffer | _ -> noop @@ -219,6 +239,22 @@ let handle_normal_command = | Chord (_, n, Noop, _, To_eol) -> let n = Option.value ~default:1 n - 1 in Buffer.Action.(move_down ~n &> eol) |> on_focused_buffer + | Simple Page_down | Simple (Ctrl 'F') -> + fun e -> + let (n, _), e = get_terminal_size e in + on_focused_buffer (Buffer.Action.move_down ~n) e + | Simple Page_up | Simple (Ctrl 'B') -> + fun e -> + let (n, _), e = get_terminal_size e in + on_focused_buffer (Buffer.Action.move_up ~n) e + | Simple (Ctrl 'D') -> + fun e -> + let (r, _), e = get_terminal_size e in + on_focused_buffer (Buffer.Action.move_down ~n:(r / 2)) e + | Simple (Ctrl 'U') -> + fun e -> + let (r, _), e = get_terminal_size e in + on_focused_buffer (Buffer.Action.move_up ~n:(r / 2)) e (* Change *) | Shortcut (_, n, Change) -> let n = Option.value ~default:1 n - 1 in -- cgit v1.2.3