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: Mon,  5 Sep 2005 09:21:48 +0200 (CEST)	[thread overview]
Message-ID: <18147181.1125904908247.JavaMail.www@wwinf1617> (raw)

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  <david@dponce.com>

	* 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 <david@dponce.com>
  ;; 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)
+ 
  \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 '("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	other threads:[~2005-09-05  7:21 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-09-05  7:21 David PONCE [this message]
  -- strict thread matches above, loose matches on Subject: below --
2005-09-07 12:44 recentf.el - digit shortcuts 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-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

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

  git send-email \
    --in-reply-to=18147181.1125904908247.JavaMail.www@wwinf1617 \
    --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.