From 4c903061803f7e41cc4f87f80b1b089c2174cc21 Mon Sep 17 00:00:00 2001 Message-ID: <4c903061803f7e41cc4f87f80b1b089c2174cc21.1691157813.git.info@protesilaos.com> From: Protesilaos Stavrou 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