From: David PONCE <david.ponce@wanadoo.fr>
Cc: emacs-devel@gnu.org
Subject: Re: recentf.el - digit shortcuts
Date: Mon, 5 Sep 2005 13:27:04 +0200 (CEST) [thread overview]
Message-ID: <21764270.1125919624976.JavaMail.www@wwinf1306> (raw)
Hi,
Here is another patch (sorry) that isolates files with shortcuts in
front of the dialog list, instead of mixing them up into sub-menus.
This way it is very easy to locate files with shortcuts when
`recentf-show-file-shortcuts-flag' is non-nil.
David
2005-09-05 David Ponce <david@dponce.com>
* recentf.el (recentf-show-file-shortcuts-flag): New option.
(recentf-expand-file-name): Doc fix.
(recentf-dialog-mode-map): Define digit shortcuts.
(recentf--files-with-key): New variable.
(recentf-show-digit-shortcut-filter): New function.
(recentf-open-files-items): New function.
(recentf-open-files): Use it.
(recentf-open-file-with-key): New command.
Index: lisp/recentf.el
===================================================================
RCS file: /cvsroot/emacs/emacs/lisp/recentf.el,v
retrieving revision 1.42
diff -c -r1.42 recentf.el
*** lisp/recentf.el 6 Aug 2005 22:13:43 -0000 1.42
--- lisp/recentf.el 5 Sep 2005 11:21:31 -0000
***************
*** 5,11 ****
;; Author: David Ponce <david@dponce.com>
;; Created: July 19 1999
- ;; Maintainer: FSF
;; Keywords: files
;; This file is part of GNU Emacs.
--- 5,10 ----
***************
*** 259,264 ****
--- 258,271 ----
:group 'recentf
:type '(choice (const :tag "None" nil)
function))
+
+ (defcustom recentf-show-file-shortcuts-flag t
+ "Whether to show ``[N]'' for the Nth item up to 10.
+ If non-nil, `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
;;
***************
*** 349,355 ****
"Convert filename NAME to absolute, and canonicalize it.
See also the function `expand-file-name'.
If defined, call the function `recentf-filename-handler'
! to postprocess the canonical name."
(let* ((filename (expand-file-name name)))
(or (and recentf-filename-handler
(funcall recentf-filename-handler filename))
--- 356,362 ----
"Convert filename NAME to absolute, and canonicalize it.
See also the function `expand-file-name'.
If defined, call the function `recentf-filename-handler'
! to post process the canonical name."
(let* ((filename (expand-file-name name)))
(or (and recentf-filename-handler
(funcall recentf-filename-handler filename))
***************
*** 926,931 ****
--- 933,941 ----
(set-keymap-parent km widget-keymap)
(define-key km "q" 'recentf-cancel-dialog)
(define-key km [down-mouse-1] 'widget-button-click)
+ ;; Keys in reverse order of appearence in help.
+ (dolist (k '("0" "9" "8" "7" "6" "5" "4" "3" "2" "1"))
+ (define-key km k 'recentf-open-file-with-key))
km)
"Keymap used in recentf dialogs.")
***************
*** 1063,1068 ****
--- 1073,1090 ----
(kill-buffer (current-buffer))
(funcall recentf-menu-action (widget-value widget)))
+ ;; List of files associated to a digit shortcut key.
+ (defvar recentf--files-with-key nil)
+
+ (defun recentf-show-digit-shortcut-filter (l)
+ "Filter the list of menu-elements L to show digit shortcuts."
+ (let ((i 0))
+ (dolist (e l)
+ (setq i (1+ i))
+ (recentf-set-menu-element-item
+ e (format "[%d] %s" (% i 10) (recentf-menu-element-item e))))
+ l))
+
(defun recentf-open-files-item (menu-element)
"Return a widget to display MENU-ELEMENT in a dialog buffer."
(if (consp (cdr menu-element))
***************
*** 1085,1090 ****
--- 1107,1136 ----
:action recentf-open-files-action
,(cdr menu-element))))
+ (defun recentf-open-files-items (files)
+ "Return a list of widgets to display FILES in a dialog buffer."
+ (set (make-local-variable 'recentf--files-with-key)
+ (recentf-trunc-list files 10))
+ (mapcar 'recentf-open-files-item
+ (if recentf-show-file-shortcuts-flag
+ (append
+ (recentf-apply-menu-filter
+ 'recentf-show-digit-shortcut-filter
+ ;; (recentf-apply-menu-filter
+ ;; 'recentf-relative-filter
+ (mapcar 'recentf-make-default-menu-element
+ recentf--files-with-key)
+ ;; )
+ )
+ (recentf-apply-menu-filter
+ recentf-menu-filter
+ (mapcar 'recentf-make-default-menu-element
+ (nthcdr 10 files))))
+ (recentf-apply-menu-filter
+ recentf-menu-filter
+ (mapcar 'recentf-make-default-menu-element
+ files)))))
+
(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
***************
*** 1093,1099 ****
use for the dialog. It defaults to \"*`recentf-menu-title'*\"."
(interactive)
(recentf-dialog (or buffer-name (format "*%s*" recentf-menu-title))
! (widget-insert "Click on a file 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")
--- 1139,1146 ----
use for the dialog. It defaults to \"*`recentf-menu-title'*\"."
(interactive)
(recentf-dialog (or buffer-name (format "*%s*" recentf-menu-title))
! (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,1116 ****
`(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))))))
(widget-create
'push-button
:notify 'recentf-cancel-dialog
"Cancel")
(recentf-dialog-goto-first 'link)))
(defun recentf-open-more-files ()
"Show a dialog to open a recent file that is not in the menu."
--- 1148,1177 ----
`(group
:indent 2
:format "\n%v\n"
! ,@(recentf-open-files-items (or files recentf-list))))
(widget-create
'push-button
:notify 'recentf-cancel-dialog
"Cancel")
(recentf-dialog-goto-first 'link)))
+
+ (defun recentf-open-file-with-key (n)
+ "Open the recent file with the shortcut numeric key N.
+ N must be a valid digit.
+ `1' opens the first file, `2' the second file, ... `9' the ninth file.
+ `0' opens the tenth file."
+ (interactive
+ (list
+ (let ((n (string-to-number (this-command-keys))))
+ (cond
+ ((zerop n) 10)
+ ((and (> n 0) (< n 10)) n)
+ ((error "Invalid digit key %d" n))))))
+ (when recentf--files-with-key
+ (let ((file (nth (1- n) recentf--files-with-key)))
+ (unless file (error "Not that many recent 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."
next reply other threads:[~2005-09-05 11:27 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-09-05 11:27 David PONCE [this message]
2005-09-06 8:19 ` recentf.el - digit shortcuts Karl Chen
-- strict thread matches above, loose matches on Subject: below --
2005-09-07 12:44 David PONCE
2005-09-07 17:26 ` Karl Chen
2005-09-05 7:21 David PONCE
2005-09-02 8:19 David PONCE
2005-09-03 9:24 ` Karl Chen
2005-09-01 20:58 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=21764270.1125919624976.JavaMail.www@wwinf1306 \
--to=david.ponce@wanadoo.fr \
--cc=emacs-devel@gnu.org \
/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).