Command to filter a menu with a pattern - clic - Clic is an command line interactive client for gopher written in Common LISP
 (HTM) 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
 (HTM) 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*