summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFederico Igne <undyamon@disroot.org>2024-01-12 14:15:52 +0100
committerFederico Igne <undyamon@disroot.org>2024-01-12 14:15:52 +0100
commit0042ffe8ee737c89b66a566b4bf71b78b0836249 (patch)
tree3bb2fbdc3991bc6c8922751cdeb3cb4c0cf33814
parent2f6150f7e549836df78d91d6cf42d4a75d310930 (diff)
downloadsandy-0042ffe8ee737c89b66a566b4bf71b78b0836249.tar.gz
sandy-0042ffe8ee737c89b66a566b4bf71b78b0836249.zip
feat: allow backspace and delete to span multiple lines in insert mode
-rw-r--r--lib/editor.ml8
-rw-r--r--lib/editorBuffer.ml23
2 files changed, 26 insertions, 5 deletions
diff --git a/lib/editor.ml b/lib/editor.ml
index 9078a09..2e031e1 100644
--- a/lib/editor.ml
+++ b/lib/editor.ml
@@ -186,13 +186,15 @@ let handle_insert_command =
186 let open Command in 186 let open Command in
187 let open Action in 187 let open Action in
188 function 188 function
189 | Simple Backspace -> Buffer.Action.delete_before ~n:1 |> on_focused_buffer
190 | Simple Arrow_down -> Buffer.Action.move_down |> on_focused_buffer 189 | Simple Arrow_down -> Buffer.Action.move_down |> on_focused_buffer
191 | Simple Arrow_left -> Buffer.Action.move_left |> on_focused_buffer 190 | Simple Arrow_left -> Buffer.Action.move_left |> on_focused_buffer
192 | Simple Arrow_right -> Buffer.Action.move_right |> on_focused_buffer 191 | Simple Arrow_right -> Buffer.Action.move_right |> on_focused_buffer
193 | Simple Arrow_up -> Buffer.Action.move_up |> on_focused_buffer 192 | Simple Arrow_up -> Buffer.Action.move_up |> on_focused_buffer
193 | Simple Backspace ->
194 Buffer.Action.delete_before ~cross_lines:true ~n:1 |> on_focused_buffer
194 | Simple (Ctrl 'Q') -> quit 0 195 | Simple (Ctrl 'Q') -> quit 0
195 | Simple Delete -> Buffer.Action.delete_after ~n:1 |> on_focused_buffer 196 | Simple Delete ->
197 Buffer.Action.delete_after ~cross_lines:true ~n:1 |> on_focused_buffer
196 | Simple Enter -> Buffer.Action.newline |> on_focused_buffer 198 | Simple Enter -> Buffer.Action.newline |> on_focused_buffer
197 | Simple Esc -> 199 | Simple Esc ->
198 (Buffer.Action.move_left |> on_focused_buffer) *> set_mode Normal 200 (Buffer.Action.move_left |> on_focused_buffer) *> set_mode Normal
@@ -223,7 +225,7 @@ let handle_normal_command =
223 (* | Key 's' -> *) 225 (* | Key 's' -> *)
224 (* (Buffer.Action.delete_after |> on_focused_buffer_or_new) *) 226 (* (Buffer.Action.delete_after |> on_focused_buffer_or_new) *)
225 (* *> set_mode Insert *) 227 (* *> set_mode Insert *)
226 (* | Key 'x' -> Buffer.Action.delete_after |> on_focused_buffer_or_new *) 228 (* | Key 'x' | Delete -> Buffer.Action.delete_after |> on_focused_buffer_or_new *)
227 (* | Key 'X' -> Buffer.Action.delete_before |> on_focused_buffer_or_new *) 229 (* | Key 'X' -> Buffer.Action.delete_before |> on_focused_buffer_or_new *)
228 (* | Key '$' -> Buffer.Action.eol |> on_focused_buffer_or_new *) 230 (* | Key '$' -> Buffer.Action.eol |> on_focused_buffer_or_new *)
229 | Shortcut (_, n, Change, Line) -> 231 | Shortcut (_, n, Change, Line) ->
diff --git a/lib/editorBuffer.ml b/lib/editorBuffer.ml
index 2e2b4b6..b682116 100644
--- a/lib/editorBuffer.ml
+++ b/lib/editorBuffer.ml
@@ -29,8 +29,27 @@ module Action = struct
29 let bof = far_left |> on_content 29 let bof = far_left |> on_content
30 let eof = far_right |> on_content 30 let eof = far_right |> on_content
31 let insert k = map_focus (push k) |> on_content 31 let insert k = map_focus (push k) |> on_content
32 let delete_after ~n = Fn.apply_n_times ~n (map_focus pop_after) |> on_content 32
33 let delete_before ~n = Fn.apply_n_times ~n (map_focus pop) |> on_content 33 let delete_after ?(cross_lines = false) ~n =
34 let aux z =
35 let line = focus_or ~default:Zipper.empty z in
36 if cross_lines && is_far_right line && not (is_far_right z) then
37 (* let next = right z |> focus_or ~default:Zipper.empty |> far_left in *)
38 (* right z |> pop_after |> left |> map_focus (Fn.flip join next) *)
39 pop_after z |> map_focus_or ~default:line (far_left &> join line)
40 else map_focus pop_after z
41 in
42 Fn.apply_n_times ~n aux |> on_content
43
44 let delete_before ?(cross_lines = false) ~n =
45 let aux z =
46 let line = focus_or ~default:Zipper.empty z in
47 if cross_lines && is_far_left line && not (is_far_left z) then
48 pop_after z |> left |> map_focus (far_right &> Fn.flip join line)
49 else map_focus pop z
50 in
51 Fn.apply_n_times ~n aux |> on_content
52
34 let delete_to_eol = map_focus (split &> fst) |> on_content 53 let delete_to_eol = map_focus (split &> fst) |> on_content
35 let delete_to_bol = map_focus (split &> snd) |> on_content 54 let delete_to_bol = map_focus (split &> snd) |> on_content
36 let delete_lines ~n = Fn.apply_n_times ~n pop_after |> on_content 55 let delete_lines ~n = Fn.apply_n_times ~n pop_after |> on_content