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