Support exit using ^D - 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 8728b1f94663cfc4f8c6eb664263e8b216f8b3e5
 (DIR) parent 57ee48248441d6a164067c9652f20721a284757a
 (HTM) Author: Solene Rapenne <solene@perso.pw>
       Date:   Sat, 27 Jan 2018 23:36:53 +0100
       
       Support exit using ^D
       
       Diffstat:
         M README.md                           |       3 +--
         M clic.lisp                           |      69 +++++++++++++++++--------------
       
       2 files changed, 39 insertions(+), 33 deletions(-)
       ---
 (DIR) diff --git a/README.md b/README.md
       @@ -73,8 +73,7 @@ Keyboard bindings
        + p : previous page
        + h : display history
        + r : reload the page
       -+ x : quit shell mode
       -+ q : quit shell mode
       ++ x or q or ^D : quit
        + / pattern : redisplay the menu only with lines containing pattern (no regex)
        + d : display the raw response
        
 (DIR) diff --git a/clic.lisp b/clic.lisp
       @@ -386,16 +386,16 @@
        
        (defun help-shell()
          "show help for the shell"
       -  (format t "number      : go to link n~%")
       -  (format t "p or /      : go to previous page~%")
       -  (format t "h           : display history~%")
       -  (format t "b or -      : display bookmarks and choose a link from it~%")
       -  (format t "a or +      : add a bookmark~%")
       -  (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~%"))
       +  (format t "number            : go to link n~%")
       +  (format t "p or /            : go to previous page~%")
       +  (format t "h                 : display history~%")
       +  (format t "b or -            : display bookmarks and choose a link from it~%")
       +  (format t "a or +            : add a bookmark~%")
       +  (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 "^D or x or q or . : quit clic~%"))
        
        (defun parse-url(url)
          "parse a gopher url and return a location"
       @@ -481,6 +481,7 @@
        
            ;; exit
            ((or
       +      (eql nil input)
              (string= "." input)
              (string= "exit" input)
              (string= "x" input)
       @@ -573,15 +574,20 @@
                                    (get-color 'bg-black)
                                    (get-color 'reset))
                            (force-output)
       -                    (let ((first-input (read-char)))
       -                      (if (char= #\NewLine first-input)
       -                          ;; we hide previous line (prompt)
       -                          (format t "'~C[A~C[K~C" #\Escape #\Escape #\return)
       -                        (progn
       -                          (unread-char first-input)
       -                          (let ((input-text (format nil "~a" (read-line nil nil))))
       -                            (setf input input-text)
       -                            (loop-finish)))))))
       +                    (let ((first-input (read-char *standard-input* nil nil t)))
       +                      (cond
       +                       ((not first-input)
       +                        (format t "~%") ;; display a newline
       +                        (setf input "x") ;; we exit
       +                        (loop-finish))
       +                       ((char= #\NewLine first-input)
       +                        ;; we hide previous line (prompt)
       +                        (format t "'~C[A~C[K~C" #\Escape #\Escape #\return))
       +                       (t
       +                        (unread-char first-input)
       +                        (let ((input-text (format nil "~a" (read-line nil nil))))
       +                          (setf input input-text)
       +                          (loop-finish)))))))
        
                     ;; in case of shell command, do it
                     (if input
       @@ -649,14 +655,15 @@
        
          ;; we loop until X or Q is typed
          (loop for input = (format nil "~a" (read-line nil nil))
       -     while (not (or
       -                 (string= "exit" input)
       -                 (string= "x" input)
       -                 (string= "q" input)))
       -     do
       -       (when (eq 'end (user-input input))
       -         (loop-finish))
       -       (display-prompt)))
       +        while (not (or
       +                    (string= "NIL" input) ;; ^D
       +                    (string= "exit" input)
       +                    (string= "x" input)
       +                    (string= "q" input)))
       +        do
       +        (when (eq 'end (user-input input))
       +          (loop-finish))
       +        (display-prompt)))
        
        (defun main()
          "fetch argument, display page and go to shell if type is 1"
       @@ -675,10 +682,10 @@
        
                ;; if user want to drop from first page we need
                ;; to look it here
       -        (when (not (eq 'end (visit destination)))
       -          ;; we continue to the shell if we are in a terminal
       -          (when (ttyp)
       -            (shell))))))
       +      (when (not (eq 'end (visit destination)))
       +        ;; we continue to the shell if we are in a terminal
       +        (when (ttyp)
       +          (shell))))))
        
        ;; we allow ecl to use a new kind of argument
        ;; not sure how it works but that works