stitch

Note taking for messy minimalists

git clone git://mccd.space/stitch
commit 613b17e9f30b4def18e014993576a4324d9b11a4
parent e1bdc8f64a16b233a2633b05c2b073169a4c42c4
Author: Marc Coquand <marc@mccd.space>
Date:   Wed, 15 May 2024 14:18:05 -0500

Add regexp search for done and todo

Diffstat:
Mlib/done.ml | 15++++++++++-----
Mlib/grep.ml | 24++++++++++++++++++++++++
Mlib/todos.ml | 39++++++++++++++++++++++-----------------
3 files changed, 56 insertions(+), 22 deletions(-)
diff --git a/lib/done.ml b/lib/done.ml
@@ -73,17 +73,22 @@ let rec render
   | `Mouse ((`Press _ | `Drag), (_, y), _) ->
     render t { state with pos = 0, min y content_end }
   | `Key (`ASCII '?', []) -> Help_screen.render t { go_back = (fun () -> render t state) }
-  | `Key (`ASCII 's', []) ->
+  | `Key (`ASCII 'r', []) ->
     let (input_state : Input_screen.state) =
       { screen = img
       ; user_input = ""
-      ; prompt = "GREP: "
+      ; prompt = "REGEXP: "
       ; on_enter =
           (fun tag ->
-            let content = Grep.get_tagged_headlines tag () |> Grep.parse_headlines in
-            let content_pretty = Grep.pretty_format content in
+            let content = Grep.get_tagged_done tag () |> Grep.parse_todo_string in
+            let content_pretty = Grep.pretty_format_todo content in
             Common.Term.cursor t None;
-            render t { state with content; content_pretty })
+            render
+              t
+              { state with
+                content = content |> Array.of_list
+              ; content_pretty = content_pretty |> Array.of_list
+              })
       ; on_cancel =
           (fun _ ->
             Common.Term.cursor t None;
diff --git a/lib/grep.ml b/lib/grep.ml
@@ -99,6 +99,30 @@ let pretty_format_todo parsed_headlines =
     parsed_headlines
 
 
+let get_tagged_done tag () =
+  let open Shexp_process in
+  let open Shexp_process.Infix in
+  eval
+    (chdir
+       execution_directory
+       (call done_get_args
+        |- call [ grep_cmd; "--no-messages"; "-E"; tag ]
+        |- call [ "sort"; "-n"; "-r" ]
+        |- read_all))
+
+
+let get_tagged_todo tag () =
+  let open Shexp_process in
+  let open Shexp_process.Infix in
+  eval
+    (chdir
+       execution_directory
+       (call todo_get_args
+        |- call [ grep_cmd; "--no-messages"; "-E"; tag ]
+        |- call [ "sort"; "-n"; "-r" ]
+        |- read_all))
+
+
 let toggle_done file_name =
   let open Shexp_process in
   run_calls
diff --git a/lib/todos.ml b/lib/todos.ml
@@ -73,17 +73,34 @@ let rec render
   | `Mouse ((`Press _ | `Drag), (_, y), _) ->
     render t { state with pos = 0, min y content_end }
   | `Key (`ASCII '?', []) -> Help_screen.render t { go_back = (fun () -> render t state) }
-  | `Key (`ASCII 's', []) ->
+  | `Key (`ASCII '1', []) -> goto_headlines (fun () -> render t state)
+  | `Key (`ASCII '3', []) -> goto_done (fun () -> render t state)
+  | `Key (`ASCII 'g', []) ->
+    let content, content_pretty = load_todos () in
+    let y = min (List.length content_pretty + content_start) y in
+    render
+      t
+      { state with
+        pos = x, y
+      ; content = content |> Array.of_list
+      ; content_pretty = Array.of_list content_pretty
+      }
+  | `Key (`ASCII 'r', []) ->
     let (input_state : Input_screen.state) =
       { screen = img
       ; user_input = ""
-      ; prompt = "GREP: "
+      ; prompt = "REGEXP: "
       ; on_enter =
           (fun tag ->
-            let content = Grep.get_tagged_headlines tag () |> Grep.parse_headlines in
-            let content_pretty = Grep.pretty_format content in
+            let content = Grep.get_tagged_todo tag () |> Grep.parse_todo_string in
+            let content_pretty = Grep.pretty_format_todo content in
             Common.Term.cursor t None;
-            render t { state with content; content_pretty })
+            render
+              t
+              { state with
+                content = content |> Array.of_list
+              ; content_pretty = content_pretty |> Array.of_list
+              })
       ; on_cancel =
           (fun _ ->
             Common.Term.cursor t None;
@@ -91,18 +108,6 @@ let rec render
       }
     in
     Input_screen.render t input_state
-  | `Key (`ASCII '1', []) -> goto_headlines (fun () -> render t state)
-  | `Key (`ASCII '3', []) -> goto_done (fun () -> render t state)
-  | `Key (`ASCII 'g', []) ->
-    let content, content_pretty = load_todos () in
-    let y = min (List.length content_pretty + content_start) y in
-    render
-      t
-      { state with
-        pos = x, y
-      ; content = content |> Array.of_list
-      ; content_pretty = Array.of_list content_pretty
-      }
   | `Key (`ASCII 'j', []) | `Key (`ASCII 'N', [ `Ctrl ]) -> scroll_down ()
   | `Key (`ASCII 'k', []) | `Key (`ASCII 'P', [ `Ctrl ]) -> scroll_up ()
   | `Key (`ASCII 't', []) ->