Command to filter a menu with a pattern - clic - Clic is an command line interactive client for gopher written in Common LISP HTML git clone git://bitreich.org/clic/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/clic/ DIR Log DIR Files DIR Refs DIR Tags DIR README DIR LICENSE --- DIR commit f8678efc9938f34c2d873fe85c9d41015b1c7c4f DIR parent 638e894fcacbdc975eac7b6d6f90b7a1b894106a HTML Author: Solene Rapenne <solene@perso.pw> Date: Tue, 23 Jan 2018 19:19:19 +0100 Command to filter a menu with a pattern Diffstat: M README.md | 1 + M clic.lisp | 45 +++++++++++++++++++++++-------- 2 files changed, 35 insertions(+), 11 deletions(-) --- DIR diff --git a/README.md b/README.md @@ -75,6 +75,7 @@ Keyboard bindings + r : reload the page + x : quit shell mode + q : quit shell mode ++ / pattern : redisplay the menu only with lines containing pattern (no regex) + d : display the raw response In addition to the previous keybinding, a different layout coexists, DIR diff --git a/clic.lisp b/clic.lisp @@ -318,6 +318,23 @@ (uiop:run-program (list "xdg-open" (subseq destination 4)))))))) +(defun filter-line(text) + "display only lines containg text" + (setf *previous-buffer* (copy-array *buffer*)) + (setf *buffer* (make-array 200 + :fill-pointer 0 + :initial-element nil + :adjustable t)) + ;; we create a new buffer from the current + ;; with only lines matching the string (no regex) + (loop for line across *previous-buffer* + do + (when (search text line :test #'char-equal) + (vector-push line *buffer*))) + + (display-buffer "1")) + + (defun p() "browse to the previous link" (when (<= 2 (length *history*)) @@ -377,6 +394,7 @@ (format t "r or * : reload the page~%") (format t "help : show this help~%") (format t "d : dump the raw reponse~%") + (format t "/ text : display online lines matching text~%") (format t "x or q or . : exit the shell, go back to REPL~%")) (defun parse-url(url) @@ -443,6 +461,11 @@ (string= "p" input)) (p)) + ;; search a pattern in a menu + ;; search should return 0 if we use it + ((= 0 (or (search "/ " input) 1)) + (filter-line (subseq input 2))) + ;; dump raw informations ((string= "d" input) (loop for c across *buffer* @@ -481,17 +504,17 @@ ;;; generate a string from *buffer* array (let* ((uri (location-uri (car *history*))) (filename (subseq uri (1+ (position #\/ uri :from-end t)))) - (path (concatenate 'string "/tmp/" filename))) - (with-open-file (output path - :direction :output - :if-does-not-exist :create - :if-exists :supersede) - (loop for line across *buffer* - do - (format output "~a~%" line))) - (uiop:run-program (list (or (uiop:getenv "PAGER") "less") path) - :input :interactive - :output :interactive)) + (path (concatenate 'string "/tmp/" filename))) + (with-open-file (output path + :direction :output + :if-does-not-exist :create + :if-exists :supersede) + (loop for line across *buffer* + do + (format output "~a~%" line))) + (uiop:run-program (list (or (uiop:getenv "PAGER") "less") path) + :input :interactive + :output :interactive)) ;; display last menu (pop *history*) (when *previous-buffer*