X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?a=blobdiff_plain;f=elpher.el;h=a24d0569914ffe740674bcf7fb1d1d6fac7afd28;hb=006a983c5e051bdda257cc6a5bc39ba82be5faf9;hp=62710903fece150b4c99a4a00fcab667b9d21bcb;hpb=a0abd72b3a4dd84b44dc088a42431ff9a452bd34;p=elpher.git diff --git a/elpher.el b/elpher.el index 6271090..a24d056 100644 --- a/elpher.el +++ b/elpher.el @@ -4,7 +4,7 @@ ;; Author: Tim Vaughan ;; Created: 11 April 2019 -;; Version: 1.1.0 +;; Version: 1.2.0 ;; Keywords: comm gopher ;; Homepage: https://github.com/tgvaughan/elpher ;; Package-Requires: ((emacs "25")) @@ -55,7 +55,7 @@ ;;; Global constants ;; -(defconst elpher-version "1.1.0" +(defconst elpher-version "1.2.0" "Current version of elpher.") (defconst elpher-margin-width 6 @@ -80,12 +80,15 @@ "i - g: go to a particular menu or item\tfake\tfake\t1" "i - i/I: info on item under cursor or current page\tfake\tfake\t1" "i - c/C: copy URL representation of item under cursor or current page\tfake\tfake\t1" + "i - a/A: bookmark the item under cursor or current page\tfake\tfake\t1" + "i - x/X: remove bookmark for item under cursor or current page\tfake\tfake\t1" + "i - B: visit the bookmarks page\tfake\tfake\t1" "i - r: redraw current page (using cached contents if available)\tfake\tfake\t1" "i - R: reload current page (regenerates cache)\tfake\tfake\t1" "i - d: download directory entry under cursor\tfake\tfake\t1" "i - w: display the raw server response for the current page\tfake\tfake\t1" "i\tfake\tfake\t1" - "iPlaces to start exploring Gopherspace:\tfake\tfake\t1" + "iWhere to start exploring Gopherspace:\tfake\tfake\t1" "i\tfake\tfake\t1" "1Floodgap Systems Gopher Server\t/\tgopher.floodgap.com\t70" "i\tfake\tfake\t1" @@ -671,8 +674,7 @@ calls, as is necessary if the match is performed by `string-match'." (defun elpher-get-bookmarks-node () "Getter which loads and displays the current bookmark list." (elpher-with-clean-buffer - (insert "Use 'u' to return to the previous page.\n\n" - "---- Bookmark list ----\n\n") + (insert "---- Bookmark list ----\n\n") (let ((bookmarks (elpher-load-bookmarks))) (if bookmarks (dolist (bookmark bookmarks) @@ -684,7 +686,10 @@ calls, as is necessary if the match is performed by `string-match'." (elpher-address-host address) (elpher-address-port address)))) (insert "No bookmarks found.\n"))) - (insert "\n-----------------------") + (insert "\n-----------------------\n\n" + "u: return to previous page.\n" + "x: delete selected bookmark.\n" + "a: rename selected bookmark.\n") (elpher-restore-pos))) @@ -701,6 +706,10 @@ bookmark list, while ADDRESS is the address of the entry." "Get the display string of BOOKMARK." (elt bookmark 0)) +(defun elpher-set-bookmark-display-string (bookmark display-string) + "Set the display string of BOOKMARK to DISPLAY-STRING." + (setcar bookmark display-string)) + (defun elpher-bookmark-address (bookmark) "Get the address for BOOKMARK." (elt bookmark 1)) @@ -720,23 +729,22 @@ Beware that this completely replaces the existing contents of the file." (goto-char (point-min)) (read (current-buffer))))) -(defun elpher-add-node-bookmark (node) - "Add bookmark to NODE to the saved list of bookmarks." - (let ((bookmark (elpher-make-bookmark (elpher-node-display-string node) - (elpher-node-address node))) - (bookmarks (elpher-load-bookmarks))) - (add-to-list 'bookmarks bookmark) +(defun elpher-add-address-bookmark (address display-string) + "Save a bookmark for ADDRESS with label DISPLAY-STRING. +If ADDRESS is already bookmarked, update the label only." + (let ((bookmarks (elpher-load-bookmarks))) + (let ((existing-bookmark (rassoc (list address) bookmarks))) + (if existing-bookmark + (elpher-set-bookmark-display-string existing-bookmark display-string) + (add-to-list 'bookmarks (elpher-make-bookmark display-string address)))) (elpher-save-bookmarks bookmarks))) -(defun elpher-remove-node-bookmark (node) - "Remove bookmark to NODE from the saved list of bookmarks." - (let ((bookmark (elpher-make-bookmark (elpher-node-display-string node) - (elpher-node-address node)))) +(defun elpher-remove-address-bookmark (address) + "Remove any bookmark to ADDRESS." (elpher-save-bookmarks - (seq-filter (lambda (this-bookmark) - (not (equal bookmark this-bookmark))) - (elpher-load-bookmarks))))) - + (seq-filter (lambda (bookmark) + (not (equal (elpher-bookmark-address bookmark) address))) + (elpher-load-bookmarks)))) ;;; Interactive procedures ;; @@ -859,7 +867,7 @@ Beware that this completely replaces the existing contents of the file." (error "Command invalid for this page")))) (defun elpher-bookmarks-current-p () - "Return true if current node is a bookmarks page." + "Return non-nil if current node is a bookmarks page." (eq (elpher-address-type (elpher-node-address elpher-current-node)) 'bookmarks)) (defun elpher-reload-bookmarks () @@ -870,33 +878,43 @@ Beware that this completely replaces the existing contents of the file." (defun elpher-bookmark-current () "Bookmark the current node." (interactive) - (if (not (elpher-bookmarks-current-p)) - (elpher-add-node-bookmark elpher-current-node))) + (unless (elpher-bookmarks-current-p) + (let ((address (elpher-node-address elpher-current-node)) + (display-string (read-string "Bookmark display string: " + (elpher-node-display-string elpher-current-node)))) + (elpher-add-address-bookmark address display-string) + (message "Bookmark added.")))) (defun elpher-bookmark-link () "Bookmark the link at point." (interactive) (let ((button (button-at (point)))) (if button - (progn - (elpher-add-node-bookmark (button-get button 'elpher-node)) - (elpher-reload-bookmarks)) + (let* ((node (button-get button 'elpher-node)) + (address (elpher-node-address node)) + (display-string (read-string "Bookmark display string: " + (elpher-node-display-string node)))) + (elpher-add-address-bookmark address display-string) + (elpher-reload-bookmarks) + (message "Bookmark added.")) (error "No link selected")))) (defun elpher-unbookmark-current () "Remove bookmark for the current node." (interactive) - (if (not (elpher-bookmarks-current-p)) - (elpher-remove-node-bookmark elpher-current-node))) + (unless (elpher-bookmarks-current-p) + (elpher-remove-address-bookmark (elpher-node-address elpher-current-node)) + (message "Bookmark removed."))) (defun elpher-unbookmark-link () "Remove bookmark for the link at point." (interactive) (let ((button (button-at (point)))) (if button - (progn - (elpher-remove-node-bookmark (button-get button 'elpher-node)) - (elpher-reload-bookmarks)) + (let ((node (button-get button 'elpher-node))) + (elpher-remove-address-bookmark (elpher-node-address node)) + (elpher-reload-bookmarks) + (message "Bookmark removed.")) (error "No link selected")))) (defun elpher-bookmarks ()