aboutsummaryrefslogtreecommitdiff
path: root/lib/stitched_article.ml
diff options
context:
space:
mode:
Diffstat (limited to 'lib/stitched_article.ml')
-rw-r--r--lib/stitched_article.ml37
1 files changed, 35 insertions, 2 deletions
diff --git a/lib/stitched_article.ml b/lib/stitched_article.ml
index 41efa75..bbdf7f4 100644
--- a/lib/stitched_article.ml
+++ b/lib/stitched_article.ml
@@ -6,7 +6,8 @@ module Input_screen = Input_screen
type state =
{ pos : int * int
; scroll : int
- ; content : (string * int * string) array
+ ; content : (string * int * string * int) array
+ ; go_back : unit -> unit
; content_pretty : Grep.display_type array
}
@@ -26,7 +27,7 @@ let render_line size_x y scroll (el : Grep.display_type) i =
else I.strf "%s" el |> I.pad ~l:0 ~t:i
-let rec render t ({ pos; scroll; content_pretty; _ } as state) =
+let rec render t ({ pos; scroll; content_pretty; go_back; content } as state) =
let size_x, size_y = Common.Term.size t in
let x, y = pos in
let img =
@@ -56,10 +57,42 @@ let rec render t ({ pos; scroll; content_pretty; _ } as state) =
| `Down -> scroll_down ()
| `Up -> scroll_up ())
| `Resize _ -> render t state
+ | `Key (`ASCII '@', []) -> go_back ()
| `Mouse ((`Press _ | `Drag), (_, y), _) ->
render t { state with pos = 0, min y content_length }
| `Key (`ASCII 'j', []) | `Key (`ASCII 'N', [ `Ctrl ]) -> scroll_down ()
| `Key (`ASCII 'k', []) | `Key (`ASCII 'P', [ `Ctrl ]) -> scroll_up ()
+ | `Key (`ASCII 'e', []) | `Key (`Enter, []) ->
+ (* Editor might be set with extra args, in that case we need to separate these *)
+ let[@warning "-8"] (editor :: args) =
+ String.split_on_char ' ' (Sys.getenv "EDITOR")
+ in
+ let selected_file, line_number, _, file_number_offset = Array.get content y in
+ let full_path_file = Grep.execution_directory ^ "/" ^ selected_file in
+ let line_number_arg = "+" ^ Int.to_string (line_number - file_number_offset) in
+ let full_args =
+ Array.append (Array.of_list args) [| line_number_arg; full_path_file |]
+ in
+ Common.Term.cursor t (Some (0, 0));
+ let _ =
+ Unix.create_process_env
+ editor
+ full_args
+ (Unix.environment ())
+ Unix.stdin
+ Unix.stdout
+ Unix.stderr
+ in
+ let rec run_editor () =
+ match Unix.wait () with
+ | _, _ ->
+ Common.Term.cursor t None;
+ render t state
+ (* Capture resizing events *)
+ | exception Unix.Unix_error (Unix.EINTR, _, _) -> run_editor ()
+ | exception Unix.Unix_error (_, _, _) -> failwith "ERROR"
+ in
+ run_editor ()
| `Key (`Arrow d, _) ->
(match d with
| `Up -> scroll_up ()