emacs-devel
[Top][All Lists]
Advanced

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

Re: recentf.el - digit shortcuts


From: David PONCE
Subject: Re: recentf.el - digit shortcuts
Date: Mon, 5 Sep 2005 09:21:48 +0200 (CEST)

Hi,

Here is a new patch for digit shortcuts in the selection dialog of
recentf.el. Compared to the previous one it assigns digit shortcuts to
the ten most recent files, independently of their location in
sub-menus. IMO this is a more intuitive approach. The implementation
is a little simpler too ;-)

Could you try it please and tell me what you think? If no objection I
will commit the changes in a few days.

Thanks!
David

2005-09-05  David Ponce  <address@hidden>

        * recentf.el Require 'cl at compilation time.
        (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-open-files-item): Show digit shortcuts.
        (recentf-open-files): Associate files with digit shortcuts.
        (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 07:04:23 -0000
***************
*** 5,11 ****
  
  ;; Author: David Ponce <address@hidden>
  ;; Created: July 19 1999
- ;; Maintainer: FSF
  ;; Keywords: files
  
  ;; This file is part of GNU Emacs.
--- 5,10 ----
***************
*** 41,46 ****
--- 40,46 ----
  (require 'easymenu)
  (require 'tree-widget)
  (require 'timer)
+ (eval-when-compile (require 'cl))
  
  ;;; Internal data
  ;;
***************
*** 259,264 ****
--- 259,272 ----
    :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)
+ 
  
  ;;; 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))
--- 357,363 ----
    "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 ****
--- 934,942 ----
      (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 ****
--- 1074,1082 ----
    (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-open-files-item (menu-element)
    "Return a widget to display MENU-ELEMENT in a dialog buffer."
    (if (consp (cdr menu-element))
***************
*** 1076,1089 ****
          ,@(mapcar 'recentf-open-files-item
                    (cdr menu-element)))
      ;; Represent a single file with a link widget
!     `(link :tag ,(car menu-element)
!            :button-prefix ""
!            :button-suffix ""
!            :button-face default
!            :format "%[%t%]\n"
!            :help-echo ,(concat "Open " (cdr menu-element))
!            :action recentf-open-files-action
!            ,(cdr menu-element))))
  
  (defun recentf-open-files (&optional files buffer-name)
    "Show a dialog to open a recent file.
--- 1090,1108 ----
          ,@(mapcar 'recentf-open-files-item
                    (cdr menu-element)))
      ;; Represent a single file with a link widget
!     ;; Show digit shortcuts for the ten most recent files.
!     (let ((label "") key)
!       (and recentf-show-file-shortcuts-flag
!            (setq key (assoc (cdr menu-element) recentf--files-with-key))
!            (setq label (format "[%d] " (cdr key))))
!       `(link :tag ,(car menu-element)
!              :button-prefix ,label
!              :button-suffix ""
!              :button-face default
!              :format "%[%t%]\n"
!              :help-echo ,(concat "Open " (cdr menu-element))
!              :action recentf-open-files-action
!              ,(cdr menu-element)))))
  
  (defun recentf-open-files (&optional files buffer-name)
    "Show a dialog to open a recent file.
***************
*** 1092,1099 ****
  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)
    (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")
--- 1111,1128 ----
  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))
!     (let ((i 0) l)
!       (dolist (f files)
!         (setq i (1+ i))
!         (if (> i 10)
!             (return)
!           (push (cons f (% i 10)) l)))
!       (set (make-local-variable 'recentf--files-with-key)
!            (nreverse l)))
!     (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")
***************
*** 1105,1116 ****
                         (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."
--- 1134,1156 ----
                         (recentf-apply-menu-filter
                          recentf-menu-filter
                          (mapcar 'recentf-make-default-menu-element
!                                 files)))))
      (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.
+ `1' opens the first file, `2' the second file, ... `9' the ninth file.
+ `0' opens the tenth file."
+   (interactive (list (string-to-number (this-command-keys))))
+   (when recentf--files-with-key
+     (let ((file (car (rassq 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."






reply via email to

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