emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

recentf.el - digit shortcuts


From: Karl Chen
Subject: recentf.el - digit shortcuts
Date: Thu, 01 Sep 2005 13:58:18 -0700

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  <address@hidden>

        * 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)
+
 
 ;;; 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 via email to

[Prev in Thread] Current Thread [Next in Thread]