From: "Barra Ó Catháin via Bug reports for GNU Emacs, the Swiss army knife of text editors" <bug-gnu-emacs@gnu.org>
To: 73308@debbugs.gnu.org
Subject: bug#73308: [PATCH] Add file-to-register and buffer-to-register.
Date: Tue, 24 Sep 2024 15:09:31 +0100 [thread overview]
Message-ID: <87plotw3c4.fsf@ocathain.ie> (raw)
In-Reply-To: <877cbbrx7r.fsf@ocathain.ie>
[-- Attachment #1: Type: text/plain, Size: 133 bytes --]
I've updated the patch to include the feedback given previously; as
always, further comments/feedback are appreciated!
-----
Barra
[-- Attachment #2: 0001-Add-file-buffer-to-register-Bug-73308.patch --]
[-- Type: text/x-patch, Size: 9062 bytes --]
From e4712ad55d21fea14309316b8437b4a01c98280d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Barra=20=C3=93=20Cath=C3=A1in?= <barra@ocathain.ie>
Date: Tue, 24 Sep 2024 14:19:55 +0100
Subject: [PATCH] Add file/buffer-to-register (Bug#73308)
* doc/emacs/regs.texi (File and Buffer Registers): Updates
documentation to refer to file-to-register and
buffer-to-register.
* etc/NEWS: Announce the new commands.
* lisp/bindings.el (ctl-x-r-map): Map new commands into the
register keymap.
* lisp/register.el (register-command-info): Register new commands.
(jump-to-register): Remove docstring line referring to using
set-register instead of new commands.
(file-to-register): Add function for storing files in registers.
(buffer-to-register): Add function for storing buffers in
registers.
(register-buffer-to-file-query): Add function for converting
buffer registers to file-query registers on killing a buffer.
---
doc/emacs/regs.texi | 65 ++++++++++++++++++++++-----------------------
etc/NEWS | 7 +++++
lisp/bindings.el | 4 ++-
lisp/register.el | 55 +++++++++++++++++++++++++++++++++++++-
4 files changed, 96 insertions(+), 35 deletions(-)
diff --git a/doc/emacs/regs.texi b/doc/emacs/regs.texi
index 734d704a272..df3c22742b6 100644
--- a/doc/emacs/regs.texi
+++ b/doc/emacs/regs.texi
@@ -290,40 +290,39 @@ File and Buffer Registers
@cindex saving file name in a register
@cindex saving buffer name in a register
- If you visit certain file names frequently, you can visit them more
-conveniently if you put their names in registers. Here's the Lisp code
-used to put a file @var{name} into register @var{r}:
-
-@smallexample
-(set-register @var{r} '(file . @var{name}))
-@end smallexample
-
-@need 3000
-@noindent
-For example,
-
-@smallexample
-(set-register ?z '(file . "/gd/gnu/emacs/19.0/src/ChangeLog"))
-@end smallexample
-
-@noindent
-puts the file name shown in register @samp{z}.
-
- To visit the file whose name is in register @var{r}, type @kbd{C-x r j
-@var{r}}. (This is the same command used to jump to a position or
-restore a frame configuration.)
-
- Similarly, if there are certain buffers you visit frequently, you
-can put their names in registers. For instance, if you visit the
-@samp{*Messages*} buffer often, you can use the following snippet to
-put that buffer into the @samp{m} register:
-
-@smallexample
-(set-register ?m '(buffer . "*Messages*"))
-@end smallexample
+@table @kbd
+@item C-x r F @var{r}
+Store the currently visited file or directory in register
+@var{r} (@code{file-to-register}).
+@item C-x r B @var{r}
+Store the currently visited buffer in register
+@var{r} (@code{buffer-to-register}).
+@end table
- To switch to the buffer whose name is in register @var{r}, type
-@kbd{C-x r j @var{r}}.
+If you visit certain files or buffers frequently, you can visit them
+more conveniently if you put their names in registers.
+
+@kindex C-x r F
+@findex file-to-register
+ Typing @kbd{C-x r F} (@code{file-to-register}), followed by a
+character @kbd{@var{r}}, saves a reference to the currently visited file
+in register @var{r}. You can then visit the file using
+@code{jump-to-register} by typing @kbd{C-x r j} @var{r}. With a prefix
+argument, @code{file-to-register} prompts for a file name to store in
+the register.
+
+@kindex C-x r B
+@findex buffer-to-register
+ Typing @kbd{C-x r B} (@code{buffer-to-register}), followed by a
+character @kbd{@var{r}}, saves a reference to the currently visited buffer
+in register @var{r}. You can then revisit the buffer using
+@code{jump-to-register}. With a prefix argument, @code{buffer-to-register}
+prompts for a buffer name to store in the register.
+
+ If you store a buffer name which is visiting a file in a
+register, and the buffer is then closed, the register is automatically
+converted to a file reference, allowing you to quickly re-open the
+closed file.
@node Keyboard Macro Registers
@section Keyboard Macro Registers
diff --git a/etc/NEWS b/etc/NEWS
index b52ad001a2e..cae5452ec85 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -114,6 +114,13 @@ This hook allows you to control which tab-bar tabs are auto-resized.
*** New command 'project-root-find-file'.
It is equivalent to running ‘project-any-command’ with ‘find-file’.
+** Registers
+
+*** New functions 'buffer-to-register' and 'file-to-register'.
+These allow users to interactively store file and buffers in registers.
+Killed buffers stored in a register using buffer-to-register are
+automatically converted to a file-query value if the buffer was visiting
+a file.
\f
* Editing Changes in Emacs 31.1
diff --git a/lisp/bindings.el b/lisp/bindings.el
index 6b34c5750c1..06a488fa9fa 100644
--- a/lisp/bindings.el
+++ b/lisp/bindings.el
@@ -1574,7 +1574,9 @@ ctl-x-r-map
"n" #'number-to-register
"+" #'increment-register
"w" #'window-configuration-to-register
- "f" #'frameset-to-register)
+ "f" #'frameset-to-register
+ "F" #'file-to-register
+ "B" #'buffer-to-register)
(define-key ctl-x-map "r" ctl-x-r-map)
(define-key esc-map "q" 'fill-paragraph)
diff --git a/lisp/register.el b/lisp/register.el
index 497848ded1e..ed7b4402a3f 100644
--- a/lisp/register.el
+++ b/lisp/register.el
@@ -300,6 +300,18 @@ register-command-info
:act 'set
:noconfirm (memq register-use-preview '(nil never))
:smatch t))
+(cl-defmethod register-command-info ((_command (eql file-to-register)))
+ (make-register-preview-info
+ :types '(all)
+ :msg "File to register `%s'"
+ :act 'set
+ :noconfirm (memq register-use-preview '(nil never))))
+(cl-defmethod register-command-info ((_command (eql buffer-to-register)))
+ (make-register-preview-info
+ :types '(all)
+ :msg "Buffer to register `%s'"
+ :act 'set
+ :noconfirm (memq register-use-preview '(nil never))))
(defun register-preview-forward-line (arg)
"Move to next or previous line in register preview buffer.
@@ -672,7 +684,6 @@ jump-to-register
Push the mark if going to the location moves point, unless called in succession.
If the register contains a file name, find that file.
If the register contains a buffer name, switch to that buffer.
-\(To put a file or buffer name in a register, you must use `set-register'.)
If the register contains a window configuration (one frame) or a frameset
\(all frames), restore the configuration of that frame or of all frames
accordingly.
@@ -688,6 +699,36 @@ jump-to-register
(let ((val (get-register register)))
(register-val-jump-to val delete)))
+(defun file-to-register (file-name register)
+ "Insert FILE-NAME into REGISTER.
+To visit the file, use \\[jump-to-register].
+
+Interactively, prompt for REGISTER using `register-read-with-preview'.
+With a prefix-argument, prompt for FILE-NAME using `read-file-name',
+With no prefix-argument, use the currently visited file or directory for FILE-NAME."
+ (interactive (list (if (eq current-prefix-arg nil)
+ (if (eq major-mode 'dired-mode)
+ (dired-current-directory)
+ (buffer-file-name))
+ (read-file-name "File: "))
+ (register-read-with-preview "File to register: ")))
+ (unless (eq file-name nil)
+ (set-register register (cons 'file file-name))))
+
+(defun buffer-to-register (buffer register)
+ "Insert BUFFER into REGISTER.
+To visit the buffer, use \\[jump-to-register].
+
+Interactively, prompt for REGISTER using `register-read-with-preview'.
+With a prefix-argument, prompt for BUFFER-NAME using `read-buffer',
+With no prefix-argument, use the current buffer for BUFFER."
+ (interactive (list (if (eq current-prefix-arg nil)
+ (current-buffer)
+ (read-buffer "Buffer: "))
+ (register-read-with-preview "Buffer to register: ")))
+ (add-hook 'kill-buffer-hook 'register-buffer-to-file-query nil t)
+ (set-register register (cons 'buffer buffer)))
+
(cl-defgeneric register-val-jump-to (_val _arg)
"Execute the \"jump\" operation of VAL.
VAL is the contents of a register as returned by `get-register'.
@@ -739,6 +780,18 @@ register-swap-out
buffer-file-name
(marker-position (cdr elem))))))))
+(defun register-buffer-to-file-query ()
+ "Turn buffer registers into file-query references when a buffer is killed."
+ (and buffer-file-name
+ (dolist (elem register-alist)
+ (and (consp (cdr elem))
+ (eq (current-buffer) (cddr elem))
+ (setcdr elem
+ (list 'file-query
+ buffer-file-name
+ (point)))))))
+
+
(defun number-to-register (number register)
"Store NUMBER in REGISTER.
REGISTER is a character, the name of the register.
--
2.46.0
next prev parent reply other threads:[~2024-09-24 14:09 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-09-16 23:32 bug#73308: [PATCH] Add file-to-register and buffer-to-register Barra Ó Catháin via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-09-17 12:20 ` Eli Zaretskii
2024-09-17 14:10 ` Thierry Volpiatto
2024-09-17 19:18 ` Michael Heerdegen via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-09-18 2:51 ` Barra Ó Catháin via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-09-18 2:26 ` Barra Ó Catháin via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-09-18 2:19 ` Barra Ó Catháin via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-09-24 14:09 ` Barra Ó Catháin via Bug reports for GNU Emacs, the Swiss army knife of text editors [this message]
2024-10-05 10:08 ` Eli Zaretskii
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87plotw3c4.fsf@ocathain.ie \
--to=bug-gnu-emacs@gnu.org \
--cc=73308@debbugs.gnu.org \
--cc=barra@ocathain.ie \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).