all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: David PONCE <david.ponce@wanadoo.fr>
Cc: emacs-devel@gnu.org
Subject: Re: recentf.el - digit shortcuts
Date: Fri,  2 Sep 2005 10:19:41 +0200 (CEST)	[thread overview]
Message-ID: <15671880.1125649181343.JavaMail.www@wwinf1303> (raw)

Hi Karl,

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

This is a good idea!  However your implementation fails when items are
grouped into sub-menus in the `recentf-open-files' dialog. Attached is
a reworked patch which fixes that bug, plus some minor cleanups. Could
you try it please. If it works as you expect I could commit it if
there is no objection from the other developers.

Thanks!

David

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	2 Sep 2005 08:16:10 -0000
***************
*** 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)
+ 
  \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))
--- 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 '("O" "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,1084 ----
    (kill-buffer (current-buffer))
    (funcall recentf-menu-action (widget-value widget)))
  
+ ;; File counter while building the `recentf-open-files' dialog.
+ (defvar recentf--file-count nil)
+ ;; 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,1083 ****
          ,@(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"
--- 1092,1108 ----
          ,@(mapcar 'recentf-open-files-item
                    (cdr menu-element)))
      ;; Represent a single file with a link widget
+     ;; Use digit shortcuts for the first ten files.
+     (setq recentf--file-count (+ 1 recentf--file-count))
+     (unless (> recentf--file-count 10)
+       (push (cdr menu-element) recentf--files-with-key))
      `(link :tag ,(car menu-element)
!            :button-prefix ,(if recentf-show-file-shortcuts-flag
!                                (if (> recentf--file-count 10)
!                                    "    "
!                                  (format "[%d] "
!                                          (% recentf--file-count 10)))
!                              "")
             :button-suffix ""
             :button-face default
             :format "%[%t%]\n"
***************
*** 1093,1116 ****
  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")
      (apply 'widget-create
             `(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."
--- 1118,1162 ----
  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")
+     (make-local-variable 'recentf--files-with-key)
      (apply 'widget-create
             `(group
               :indent 2
               :format "\n%v\n"
!              ,@(let ((recentf--file-count 0))
!                  (mapcar 'recentf-open-files-item
!                          (recentf-apply-menu-filter
!                           recentf-menu-filter
!                           (mapcar 'recentf-make-default-menu-element
!                                   (or files recentf-list)))))))
!     (setq recentf--files-with-key
!           (nreverse recentf--files-with-key))
      (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
+     (let ((char (string-to-char (this-command-keys))))
+       (cond
+        ((= char ?0) 10)
+        ((and (>= char ?1) (<= char ?9)) (- char ?0))
+        (t (error "Invalid digit key"))))))
+   (let ((file (nth (- n 1) 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	other threads:[~2005-09-02  8:19 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-09-02  8:19 David PONCE [this message]
2005-09-03  9:24 ` 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 11:27 David PONCE
2005-09-06  8:19 ` Karl Chen
2005-09-05  7:21 David PONCE
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

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=15671880.1125649181343.JavaMail.www@wwinf1303 \
    --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 external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.