From: Karl Chen <quarl@cs.berkeley.edu>
Subject: recentf.el - digit shortcuts
Date: Thu, 01 Sep 2005 13:58:18 -0700 [thread overview]
Message-ID: <quack.20050901T1358.lth64tk7bf9@roar.cs.berkeley.edu> (raw)
Here is a patch that adds shortcut keys and corresponding labels
to recentf-dialog-mode (the mode that `recentf-open-files' uses).
The variable `recentf-dialog-show-labels-p' controls whether labels
are displayed, and could default to nil.
I've been using this functionality for a long time and find it
indispensable. However, defadvice is brittle and I had to rewrite
it every time recentf changed.
I hope this feature is suitable for installing.
2005-09-01 Karl Chen <quarl@cs.berkeley.edu>
* recentf.el (recentf-dialog-choose): Open the Nth item.
(recentf-dialog-show-labels-p): New variable.
(recentf-dialog-mode-map): Define keys 0-9 as recentf-dialog-choose.
(recentf-dialog-files, recentf--number): New variables.
(recentf-open-files-item): Display label (via recentf--number)
if recentf-dialog-show-labels-p.
(recentf-open-files): Reflect new variables and
help text.
--- /usr/share/emacs/22.0.50/lisp/recentf.el 2005-08-06 15:13:43.000000000 -0700
+++ recentf.el 2005-09-01 13:42:22.000000000 -0700
@@ -259,6 +259,15 @@
:group 'recentf
:type '(choice (const :tag "None" nil)
function))
+
+(defcustom recentf-dialog-show-labels-p t
+ "Whether to show ``[N]'' for the Nth item up to 10.
+
+If set, `recentf-open-files' will show labels for keys that
+can be used as shortcuts to open the Nth file."
+ :group 'recentf
+ :type 'boolean)
+
\f
;;; Utilities
;;
@@ -926,6 +935,19 @@
(set-keymap-parent km widget-keymap)
(define-key km "q" 'recentf-cancel-dialog)
(define-key km [down-mouse-1] 'widget-button-click)
+
+ ;; define in reverse order of how we want the keys to appear in help
+ (define-key km "0" 'recentf-dialog-choose)
+ (define-key km "9" 'recentf-dialog-choose)
+ (define-key km "8" 'recentf-dialog-choose)
+ (define-key km "7" 'recentf-dialog-choose)
+ (define-key km "6" 'recentf-dialog-choose)
+ (define-key km "5" 'recentf-dialog-choose)
+ (define-key km "4" 'recentf-dialog-choose)
+ (define-key km "3" 'recentf-dialog-choose)
+ (define-key km "2" 'recentf-dialog-choose)
+ (define-key km "1" 'recentf-dialog-choose)
+
km)
"Keymap used in recentf dialogs.")
@@ -1063,6 +1085,9 @@
(kill-buffer (current-buffer))
(funcall recentf-menu-action (widget-value widget)))
+;; The current item number while building recentf-open-files buffer
+(defvar recentf--number nil)
+
(defun recentf-open-files-item (menu-element)
"Return a widget to display MENU-ELEMENT in a dialog buffer."
(if (consp (cdr menu-element))
@@ -1076,8 +1101,12 @@
,@(mapcar 'recentf-open-files-item
(cdr menu-element)))
;; Represent a single file with a link widget
+ (setq recentf--number (+ 1 recentf--number))
`(link :tag ,(car menu-element)
- :button-prefix ""
+ :button-prefix ,(if recentf-dialog-show-labels-p
+ (if (<= recentf--number 10)
+ (format "[%d] " (% recentf--number 10)) " ")
+ "")
:button-suffix ""
:button-face default
:format "%[%t%]\n"
@@ -1085,6 +1114,9 @@
:action recentf-open-files-action
,(cdr menu-element))))
+;; Current files listed
+(defvar recentf-dialog-files nil)
+
(defun recentf-open-files (&optional files buffer-name)
"Show a dialog to open a recent file.
If optional argument FILES is non-nil, it is a list of recently-opened
@@ -1092,8 +1124,9 @@
If optional argument BUFFER-NAME is non-nil, it is a buffer name to
use for the dialog. It defaults to \"*`recentf-menu-title'*\"."
(interactive)
+ (or files (setq files recentf-list))
(recentf-dialog (or buffer-name (format "*%s*" recentf-menu-title))
- (widget-insert "Click on a file to open it.
+ (widget-insert "Click on a file or type the corresponding digit key to open it.
Click on Cancel or type `q' to cancel.\n" )
;; Use a L&F that looks like the recentf menu.
(tree-widget-set-theme "folder")
@@ -1101,17 +1134,38 @@
`(group
:indent 2
:format "\n%v\n"
- ,@(mapcar 'recentf-open-files-item
- (recentf-apply-menu-filter
- recentf-menu-filter
- (mapcar 'recentf-make-default-menu-element
- (or files recentf-list))))))
+ ,@(let ((recentf--number 0))
+ (mapcar 'recentf-open-files-item
+ (recentf-apply-menu-filter
+ recentf-menu-filter
+ (mapcar 'recentf-make-default-menu-element files))))))
(widget-create
'push-button
:notify 'recentf-cancel-dialog
"Cancel")
+ (set (make-local-variable 'recentf-dialog-files) files)
(recentf-dialog-goto-first 'link)))
+(defun recentf-dialog-choose (n)
+ "Open the Nth file.
+
+When called interactively via a numeric key N, open the Nth file.
+I.e., `1' opens the first file, `2' the second file, ... `9' the
+ninth file. `0' opens the tenth file."
+
+ (interactive
+ (list (let ((char (string-to-char (this-command-keys))))
+ (cond ((= char ?0) 10)
+ ((and (>= char ?1) (<= char ?9)) (- char ?0))
+ (t (error "Invalid key bound to `recentf-dialog-numkey'."))))))
+
+ (setq n (- n 1))
+ (if (<= (length recentf-dialog-files) n)
+ (error "Not that many recent files"))
+ (let ((file (nth n recentf-dialog-files)))
+ (kill-buffer (current-buffer))
+ (funcall recentf-menu-action file)))
+
(defun recentf-open-more-files ()
"Show a dialog to open a recent file that is not in the menu."
(interactive)
--
Karl 2005-09-01 13:39
next reply other threads:[~2005-09-01 20:58 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-09-01 20:58 Karl Chen [this message]
-- strict thread matches above, loose matches on Subject: below --
2005-09-02 8:19 recentf.el - digit shortcuts David PONCE
2005-09-03 9:24 ` Karl Chen
2005-09-05 7:21 David PONCE
2005-09-05 11:27 David PONCE
2005-09-06 8:19 ` Karl Chen
2005-09-07 12:44 David PONCE
2005-09-07 17:26 ` Karl Chen
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=quack.20050901T1358.lth64tk7bf9@roar.cs.berkeley.edu \
--to=quarl@cs.berkeley.edu \
/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).