unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
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

             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).