X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?p=elpher.git;a=blobdiff_plain;f=elpher.el;h=3e71cae9d031f52666af7488d8d25c3322ed42d4;hp=867868e60efe08c2797403ea265293b6f42d8fae;hb=b3364328aec2d3164ce30ff65a0ddce3e698a281;hpb=f4e62a878412258f1f84c2115f6af90d4f8a9963 diff --git a/elpher.el b/elpher.el index 867868e..3e71cae 100644 --- a/elpher.el +++ b/elpher.el @@ -156,7 +156,7 @@ (defcustom elpher-open-urls-with-eww nil "If non-nil, open URL selectors using eww. -Otherwise, use the system browser via the BROWSE-URL function." +Otherwise, use the system browser via the `browse-url' function." :type '(boolean)) (defcustom elpher-use-header t @@ -399,6 +399,11 @@ requiring gopher-over-TLS." "Create an ADDRESS object corresponding to the given special address symbol TYPE." type) +(defun elpher-make-start-page () + "Create the start page." + (elpher-make-page "Elpher Start Page" + (elpher-make-special-address 'start))) + (defun elpher-address-to-url (address) "Get string representation of ADDRESS, or nil if ADDRESS is special." (if (elpher-address-special-p address) @@ -1271,6 +1276,11 @@ that the response was malformed." (error "Gemini server response unknown: %s %s" response-code response-meta)))))) +(unless (fboundp 'read-answer) + (defun read-answer (question answers) + "Backfill for the new read-answer code." + (completing-read question (mapcar 'identity answers)))) + (defun elpher-choose-client-certificate () "Prompt for a client certificate to use to establish a TLS connection." (let* ((read-answer-short t)) @@ -1487,7 +1497,12 @@ width defined by `elpher-gemini-max-fill-width'." (propertize text-line 'face 'elpher-gemini-quoted)) (t text-line)) text-line)) - (adaptive-fill-mode nil)) + (adaptive-fill-mode t) + ;; fill-prefix is important for adaptive-fill-mode: without + ;; it, multi-line list items are not indented correct + (fill-prefix (if (match-string 2 text-line) + (replace-regexp-in-string "[>\*]" " " (match-string 0 text-line)) + nil))) (insert (elpher-process-text-for-display processed-text-line)) (newline))) @@ -1779,6 +1794,13 @@ If ADDRESS is already bookmarked, update the label only." ;;; Integrations ;; +;;; Org + +;; Avoid byte compilation warnings. +(eval-when-compile + (declare-function org-link-store-props "ol") + (declare-function org-link-set-parameters "ol")) + (defun elpher-org-export-link (link description format protocol) "Export a LINK with DESCRIPTION for the given PROTOCOL and FORMAT. @@ -1796,8 +1818,6 @@ of gemini, gopher or finger." url (format "%s (%s)" desc url)))))) -;; Avoid byte compilation warnings. -(declare-function org-link-store-props "ol") (defun elpher-org-store-link () "Store link to an `elpher' page in Org." (when (eq major-mode 'elpher-mode) @@ -1817,15 +1837,13 @@ of gemini, gopher or finger." (defun elpher-org-follow-link (link protocol) "Visit a LINK for the given PROTOCOL. -PROTOCOL may be one of gemini, gopher or finger. This method also support old -paramter elpher, where link is self-contained." +PROTOCOL may be one of gemini, gopher or finger. This method also +supports the old protocol elpher, where the link is self-contained." (let ((url (if (equal protocol "elpher") (string-remove-prefix "elpher:" link) (format "%s:%s" protocol link)))) (elpher-go url))) -;; Avoid byte compilation warnings. -(declare-function org-link-set-parameters "ol") (with-eval-after-load 'org (org-link-set-parameters "elpher" @@ -1849,6 +1867,12 @@ paramter elpher, where link is self-contained." (elpher-org-export-link link description format "finger")) :follow (lambda (link _arg) (elpher-org-follow-link link "finger")))) +;;; Browse URL + +;; Avoid byte compilation warnings. +(eval-when-compile + (defvar thing-at-point-uri-schemes)) + ;;;###autoload (defun elpher-browse-url-elpher (url &rest _args) "Browse URL using Elpher. This function is used by `browse-url'." @@ -1856,32 +1880,34 @@ paramter elpher, where link is self-contained." (elpher-go url)) ;; Use elpher to open gopher, finger and gemini links -(with-eval-after-load 'browse-url - ;; For recent version of `browse-url' package - (if (boundp 'browse-url-default-handlers) - (add-to-list - 'browse-url-default-handlers - '("^\\(gopher\\|finger\\|gemini\\)://" . elpher-browse-url-elpher)) - ;; Patch browse-url-default-browser for older ones - (advice-add 'browse-url-default-browser :before-while - (lambda (url &rest _args) - (let ((scheme (downcase (car (split-string url ":" t))))) - (if (member scheme '("gemini" "gopher" "finger")) - ;; `elpher-go' always returns nil, which will stop the - ;; advice chain here in a before-while - (elpher-go url) - ;; chain must continue, then return t. - t)))))) - -;; Avoid byte compilation warnings. -(eval-when-compile - (defvar thing-at-point-uri-schemes) - (defvar mu4e~view-beginning-of-url-regexp)) +;; For recent version of `browse-url' package +(if (boundp 'browse-url-default-handlers) + (add-to-list + 'browse-url-default-handlers + '("^\\(gopher\\|finger\\|gemini\\)://" . elpher-browse-url-elpher)) + ;; Patch `browse-url-browser-function' for older ones. The value of + ;; that variable is `browse-url-default-browser' by default, so + ;; that's the function that gets advised. + (advice-add browse-url-browser-function :before-while + (lambda (url &rest _args) + "Handle gemini, gopher, and finger schemes using Elpher." + (let ((scheme (downcase (car (split-string url ":" t))))) + (if (member scheme '("gemini" "gopher" "finger")) + ;; `elpher-go' always returns nil, which will stop the + ;; advice chain here in a before-while + (elpher-go url) + ;; chain must continue, then return t. + t))))) ;; Register "gemini://" as a URI scheme so `browse-url' does the right thing (with-eval-after-load 'thingatpt (add-to-list 'thing-at-point-uri-schemes "gemini://")) +;;; Mu4e: + +(eval-when-compile + (defvar mu4e~view-beginning-of-url-regexp)) + (with-eval-after-load 'mu4e-view ;; Make mu4e aware of the gemini world (setq mu4e~view-beginning-of-url-regexp @@ -1914,7 +1940,8 @@ When run interactively HOST-OR-URL is read from the minibuffer." (address (elpher-address-from-url cleaned-host-or-url)) (page (elpher-make-page cleaned-host-or-url address))) (switch-to-buffer elpher-buffer-name) - (elpher-visit-page page) + (elpher-with-clean-buffer + (elpher-visit-page page)) nil)) (defun elpher-go-current () @@ -1974,9 +2001,7 @@ When run interactively HOST-OR-URL is read from the minibuffer." (interactive) (setq-local elpher-current-page nil) (setq-local elpher-history nil) - (let ((start-page (elpher-make-page "Elpher Start Page" - (elpher-make-special-address 'start)))) - (elpher-visit-page start-page))) + (elpher-visit-page (elpher-make-start-page))) (defun elpher-download () "Download the link at point." @@ -2272,10 +2297,7 @@ to create a new session. Returns the buffer selected (or created)." (pop-to-buffer-same-window buf) (unless (buffer-modified-p) (elpher-mode) - (let ((start-page (elpher-make-page - "Elpher Start Page" - (elpher-make-special-address 'start)))) - (elpher-visit-page start-page)) + (elpher-visit-page (elpher-make-start-page)) "Started Elpher."))); Otherwise (elpher) evaluates to start page string. ;;; elpher.el ends here