Subject: bug#65039: 30.0.50; [PATCH] Add bookmark handler for M-x shell

From: Protesilaos Stavrou <[email-masked]>
Date: Fri, 04 Aug 2023 17:06:59 +0300

> From: Eli Zaretskii <[email-masked]>
> Date: Fri,  4 Aug 2023 13:32:37 +0300
>
>> From: Protesilaos Stavrou <[email-masked]>
>> Cc: [email-masked]
>> Date: Fri, 04 Aug 2023 12:17:43 +0300
>> 
>> > I'll let users of bookmarks comment, but in any case, please also
>> > check that the section "Bookmarks" in the Emacs user manual doesn't
>> > need some update due to this feature.  (You marked the NEWS entry with
>> > "---", which might mean you already checked that, but I'm not sure.)
>> 
>> I thought a change was not necessary.  Though I am happy to do it, if
>> needed.
>
> It sounds like the notion of "jumping" to a bookmark has evolved, and
> nowadays jumping to a bookmark might do much more than just jump to a
> buffer position.  Perhaps that node in the manual should say something
> about that, and show a couple of examples?

The revised patch includes a possible update to the manual.  Are those
examples sufficient?

-- 
Protesilaos Stavrou
https://protesilaos.com
>From 4c903061803f7e41cc4f87f80b1b089c2174cc21 Mon Sep 17 00:00:00 2001
Message-ID: <[email-masked]>
From: Protesilaos Stavrou <[email-masked]>
Date: Fri, 4 Aug 2023 17:03:08 +0300
Subject: [PATCH] Add bookmark handler for M-x shell

* doc/emacs/regs.texi (Bookmarks): Explain that 'bookmark-jump'
establishes a remote connection.
* etc/NEWS: Announce the new feature.
* lisp/shell.el (shell-mode): Add buffer-local value for 'bookmark-make-record-function'.
(bookmark-prop-get, shell-bookmark-name, shell-bookmark-make-record)
(shell-bookmark-jump): Add section about the bookmark handler.
---
 doc/emacs/regs.texi |  6 ++++++
 etc/NEWS            |  6 ++++++
 lisp/shell.el       | 26 ++++++++++++++++++++++++++
 3 files changed, 38 insertions(+)

diff --git a/doc/emacs/regs.texi b/doc/emacs/regs.texi
index e52f68dd18e..2debf9988c2 100644
--- a/doc/emacs/regs.texi
+++ b/doc/emacs/regs.texi
@@ -391,6 +391,12 @@ many characters of context to record on each side of the bookmark's
 position.  (In buffers that are visiting encrypted files, no context
 is saved in the bookmarks file no matter the value of this variable.)
 
+  If the bookmark is stored in a remote location, @code{bookmark-jump}
+will establish the connection and then create the buffer.  This works
+with regular files, as well as the buffers of @kbd{M-x dired} and
+@kbd{M-x shell}.  @xref{Top, The Tramp Manual,, tramp, The Tramp
+Manual}.
+
   Here are some additional commands for working with bookmarks:
 
 @table @kbd
diff --git a/etc/NEWS b/etc/NEWS
index 7b521f3e6fe..6329165cda2 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -286,6 +286,12 @@ When this user option is non-nil, 'shell-get-old-input' ('C-RET')
 includes multiple shell "\" continuation lines from command output.
 Default is nil.
 
++++
+*** Bookmark handler for 'shell' buffers
+Now the 'bookmark-set' command will record 'shell' buffers.  This
+means that 'bookmark-jump' will create the 'shell' buffer in the
+directory it was in.
+
 ** Prog Mode
 
 +++
diff --git a/lisp/shell.el b/lisp/shell.el
index 0a24b4ea4c2..bdf8eb17fbd 100644
--- a/lisp/shell.el
+++ b/lisp/shell.el
@@ -676,6 +676,7 @@ (define-derived-mode shell-mode comint-mode "Shell"
 
   (setq comint-prompt-regexp shell-prompt-pattern)
   (shell-completion-vars)
+  (setq-local bookmark-make-record-function #'shell-bookmark-make-record)
   (setq-local paragraph-separate "\\'")
   (setq-local paragraph-start comint-prompt-regexp)
   (setq-local font-lock-defaults '(shell-font-lock-keywords t))
@@ -1812,6 +1813,31 @@ (defun shell-highlight-undef-mode-restart ()
   (when shell-highlight-undef-mode
     (shell-highlight-undef-mode 1)))
 
+;;; Bookmark support
+
+;; Adapted from esh-mode.el
+(declare-function bookmark-prop-get "bookmark" (bookmark prop))
+
+(defun shell-bookmark-name ()
+  (format "shell-%s"
+          (file-name-nondirectory
+           (directory-file-name
+            (file-name-directory default-directory)))))
+
+(defun shell-bookmark-make-record ()
+  "Create a bookmark for the current Shell buffer."
+  `(,(shell-bookmark-name)
+    (location . ,default-directory)
+    (handler . shell-bookmark-jump)))
+
+;;;###autoload
+(defun shell-bookmark-jump (bookmark)
+  "Default bookmark handler for Shell buffers."
+  (let ((default-directory (bookmark-prop-get bookmark 'location)))
+    (shell)))
+
+(put 'shell-bookmark-jump 'bookmark-handler-type "Shell")
+
 (provide 'shell)
 
 ;;; shell.el ends here
-- 
2.41.0