Merge.
authorplugd <plugd@thelambdalab.xyz>
Thu, 29 Jul 2021 10:08:05 +0000 (12:08 +0200)
committerplugd <plugd@thelambdalab.xyz>
Thu, 29 Jul 2021 10:08:07 +0000 (12:08 +0200)
1  2 
elpher.el

diff --combined elpher.el
+++ b/elpher.el
@@@ -19,7 -19,7 +19,7 @@@
  
  ;; Author: Tim Vaughan <plugd@thelambdalab.xyz>
  ;; Created: 11 April 2019
 -;; Version: 3.0.0
 +;; Version: 3.1.0
  ;; Keywords: comm gopher
  ;; Homepage: https://thelambdalab.xyz/elpher
  ;; Package-Requires: ((emacs "27.1"))
  ;;
  
  (require 'seq)
 -(require 'pp)
  (require 'shr)
  (require 'url-util)
  (require 'subr-x)
 -(require 'dns)
  (require 'nsm)
  (require 'gnutls)
  (require 'socks)
 +(require 'bookmark)
  
  ;;; Global constants
  ;;
  
 -(defconst elpher-version "3.0.0"
 +(defconst elpher-version "3.1.0"
    "Current version of elpher.")
  
  (defconst elpher-margin-width 6
      (telnet elpher-get-telnet-page nil "tel" elpher-telnet)
      (other-url elpher-get-other-url-page nil "url" elpher-other-url)
      ((special start) elpher-get-start-page nil "E" elpher-index)
 +    ((special bookmarks) elpher-get-bookmarks-page nil "E" elpher-index)
      ((special history) elpher-get-history-page nil "E" elpher-index)
      ((special visited-pages) elpher-get-visited-pages-page nil "E" elpher-index))
    "Association list from types to getters, renderers, margin codes and index faces.")
    (defvar ansi-color-context)
    (defvar bookmark-make-record-function)
    (defvar mu4e~view-beginning-of-url-regexp)
 -  (defvar thing-at-point-uri-schemes))
 +  (defvar thing-at-point-uri-schemes)
 +  (defvar xterm-color-preserve-properties))
  
  
  ;;; Customization group
@@@ -216,12 -215,6 +216,12 @@@ some servers which do not support IPv6 
  Otherwise, the SOCKS proxy is only used for connections to onion services."
    :type '(boolean))
  
 +(defcustom elpher-use-emacs-bookmark-menu nil
 +  "If non-nil, elpher will only use the native Emacs bookmark menu.
 +Otherwise, \\[elpher-show-bookmarks] will visit a special elpher bookmark
 +page within which all of the standard elpher keybindings are active."
 +  :type '(boolean))
 +
  ;; Face customizations
  
  (defgroup elpher-faces nil
@@@ -587,7 -580,6 +587,7 @@@ previously-visited pages,unless NO-HIST
  
  (defmacro elpher-with-clean-buffer (&rest args)
    "Evaluate ARGS with a clean *elpher* buffer as current."
 +  (declare (debug (body))) ;; Allow edebug to step through body
    `(with-current-buffer elpher-buffer-name
       (unless (eq major-mode 'elpher-mode)
         ;; avoid resetting buffer-local variables
@@@ -722,7 -714,7 +722,7 @@@ ERROR can be either an error object or 
        (cancel-timer elpher-network-timer)))
  
  (defun elpher-make-network-timer (thunk)
 -  "Creates a timer to run the THUNK after `elpher-connection-timeout' seconds.
 +  "Create a timer to run the THUNK after `elpher-connection-timeout' seconds.
  This is just a wraper around `run-at-time' which additionally sets the
  buffer-local variable `elpher-network-timer' to allow
  `elpher-process-cleanup' to also clear the timer."
@@@ -1673,12 -1665,12 +1673,12 @@@ The result is rendered using RENDERER.
                                 (elpher-address-from-url "gemini://geminispace.info/search"))
     (insert "\n"
             "Your bookmarks are stored in your ")
 -   (let ((help-string "RET,mouse-1: Open Emacs bookmark list"))
 -     (insert-text-button "Emacs bookmark list"
 +   (let ((help-string "RET,mouse-1: Open bookmark list"))
 +     (insert-text-button "bookmark list"
                           'face 'link
                           'action (lambda (_)
                                     (interactive)
 -                                   (call-interactively #'elpher-open-bookmarks))
 +                                   (call-interactively #'elpher-show-bookmarks))
                           'follow-link t
                           'help-echo help-string))
     (insert ".\n")
                         'help-echo help-string))
     (insert "\n")
     (insert (propertize
 -            (concat "  (These documents should be available if you have installed Elpher \n"
 -                    "   using MELPA. Otherwise you may have to install the manual yourself.)\n")
 +            (concat "(These documents should be available if you have installed Elpher \n"
 +                    " using MELPA. Otherwise you may have to install the manual yourself.)\n")
              'face 'shadow))
     (elpher-restore-pos)))
  
@@@ -1758,7 -1750,7 +1758,7 @@@ This is rendered using `elpher-get-visi
  
  (defun elpher-display-history-links (pages title)
    "Show all PAGES in an Elpher buffer with a given TITLE."
 -  (let* ((title-line (concat "---- " title " ----"))
 +  (let* ((title-line (concat " ---- " title " ----"))
           (footer-line (make-string (length title-line) ?-)))
      (elpher-with-clean-buffer
       (insert title-line "\n\n")
                   (address (elpher-page-address page)))
                 (elpher-insert-index-record display-string address))))
         (insert "No history items found.\n"))
 -     (insert "\n" footer-line "\n"
 -             "Select and entry or press 'u' to return to the previous page.")
 +     (insert "\n " footer-line "\n"
 +             "Select an entry or press 'u' to return to the previous page.")
       (elpher-restore-pos))))
  
  
@@@ -1845,6 -1837,7 +1845,6 @@@ To bookmark the link at point use \\[el
                       (read-file-name "Old Elpher bookmarks: "
                                       user-emacs-directory nil t
                                       "elpher-bookmarks"))))
 -  (require 'bookmark)
    (dolist (bookmark (with-temp-buffer
                      (insert-file-contents file)
                      (read (current-buffer))))
        (bookmark-store display-string (cdr record) t)))
    (bookmark-save))
  
 -(defun elpher-open-bookmarks ()
 +(defun elpher-get-bookmarks-page (renderer)
 +  "Getter which displays the history page (RENDERER must be nil)."
 +  (when renderer
 +    (elpher-visit-previous-page)
 +    (error "Command not supported for bookmarks page"))
 +  (elpher-with-clean-buffer
 +   (insert " ---- Elpher Bookmarks ---- \n\n")
 +   (bookmark-maybe-load-default-file)
 +   (dolist (bookmark (bookmark-maybe-sort-alist))
 +     (when (eq #'elpher-bookmark-jump (alist-get 'handler (cdr bookmark)))
 +       (let* ((name (car bookmark))
 +              (url (alist-get 'location (cdr bookmark)))
 +              (address (elpher-address-from-url url)))
 +         (elpher-insert-index-record name address))))
 +   (when (<= (line-number-at-pos) 3)
 +     (insert "No bookmarked pages found.\n"))
 +   (insert "\n --------------------------\n\n"
 +           "Select an entry or press 'u' to return to the previous page.\n\n"
 +           "Bookmarks can be renamed or deleted via the ")
 +   (insert-text-button "Emacs bookmark menu"
 +                       'action (lambda (_)
 +                                 (interactive)
 +                                 (call-interactively #'bookmark-bmenu-list))
 +                       'follow-link t
 +                       'help-echo "RET,mouse-1: open Emacs bookmark menu")
 +   (insert (substitute-command-keys
 +            ",\nwhich can also be opened from anywhere using '\\[bookmark-bmenu-list]'."))
 +   (elpher-restore-pos)))
 +
 +(defun elpher-show-bookmarks ()
    "Display the current list of elpher bookmarks.
 -This is just a call to `bookmark-bmenu-list', but we also check for a legacy
 -bookmark file and offer to import it."
 +This will also check for a legacy bookmark file and offer to import it."
    (interactive)
    (let ((old-bookmarks-file (or (and (boundp 'elpher-bookmarks-file)
                                       elpher-bookmarks-file)
                                   "\" found. Import now?")))
        (elpher-bookmark-import old-bookmarks-file)
        (rename-file old-bookmarks-file (concat old-bookmarks-file "-legacy"))))
 -  (call-interactively #'bookmark-bmenu-list))
 +  (if elpher-use-emacs-bookmark-menu
 +      (call-interactively #'bookmark-bmenu-list)
 +    (elpher-visit-page
 +     (elpher-make-page "Elpher Bookmarks"
 +                     (elpher-make-special-address 'bookmarks)))))
  
  
  ;;; Integrations
@@@ -2017,6 -1978,12 +2017,12 @@@ supports the old protocol elpher, wher
  (setq mu4e~view-beginning-of-url-regexp
        "\\(?:https?\\|gopher\\|finger\\|gemini\\)://\\|mailto:")
  
+ ;;; eww:
+ ;; Let elpher handle gemini, gopher links in eww buffer.
+ (setq eww-use-browse-url
+       "\\`mailto:\\|\\(\\`gemini\\|\\`gopher\\|\\`finger\\)://")
  ;;; Interactive procedures
  ;;
  
@@@ -2244,7 -2211,7 +2250,7 @@@ When run interactively HOST-OR-URL is r
      (define-key map (kbd "C") 'elpher-copy-current-url)
      (define-key map (kbd "a") 'elpher-bookmark-link)
      (define-key map (kbd "A") 'elpher-bookmark-current)
 -    (define-key map (kbd "B") 'elpher-open-bookmarks)
 +    (define-key map (kbd "B") 'elpher-show-bookmarks)
      (define-key map (kbd "!") 'elpher-set-gopher-coding-system)
      (define-key map (kbd "F") 'elpher-forget-current-certificate)
      (when (fboundp 'evil-define-key*)
         (kbd "C") 'elpher-copy-current-url
         (kbd "a") 'elpher-bookmark-link
         (kbd "A") 'elpher-bookmark-current
 -       (kbd "B") 'elpher-open-bookmarks
 +       (kbd "B") 'elpher-show-bookmarks
         (kbd "!") 'elpher-set-gopher-coding-system
         (kbd "F") 'elpher-forget-current-certificate))
      map)