From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: David PONCE Newsgroups: gmane.emacs.devel Subject: Re: recentf.el - digit shortcuts Date: Fri, 2 Sep 2005 10:19:41 +0200 (CEST) Message-ID: <15671880.1125649181343.JavaMail.www@wwinf1303> Reply-To: david.ponce@wanadoo.fr NNTP-Posting-Host: main.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-Trace: sea.gmane.org 1125652639 10874 80.91.229.2 (2 Sep 2005 09:17:19 GMT) X-Complaints-To: usenet@sea.gmane.org NNTP-Posting-Date: Fri, 2 Sep 2005 09:17:19 +0000 (UTC) Cc: emacs-devel@gnu.org Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Fri Sep 02 11:17:16 2005 Return-path: Original-Received: from lists.gnu.org ([199.232.76.165]) by ciao.gmane.org with esmtp (Exim 4.43) id 1EB7do-0001vC-CO for ged-emacs-devel@m.gmane.org; Fri, 02 Sep 2005 11:15:20 +0200 Original-Received: from localhost ([127.0.0.1] helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1EB7i4-0007qE-TJ for ged-emacs-devel@m.gmane.org; Fri, 02 Sep 2005 05:19:45 -0400 Original-Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1EB795-0008KW-Ll for emacs-devel@gnu.org; Fri, 02 Sep 2005 04:43:41 -0400 Original-Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1EB6tb-0007hD-AG for emacs-devel@gnu.org; Fri, 02 Sep 2005 04:27:38 -0400 Original-Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1EB6qI-0007F4-B1 for emacs-devel@gnu.org; Fri, 02 Sep 2005 04:24:11 -0400 Original-Received: from [193.252.22.54] (helo=smtp13.wanadoo.fr) by monty-python.gnu.org with esmtp (Exim 4.34) id 1EB6p0-0001mf-Up for emacs-devel@gnu.org; Fri, 02 Sep 2005 04:22:51 -0400 Original-Received: from me-wanadoo.net (localhost [127.0.0.1]) by mwinf1307.wanadoo.fr (SMTP Server) with ESMTP id 582B77000083 for ; Fri, 2 Sep 2005 10:19:41 +0200 (CEST) Original-Received: from wwinf1303 (wwinf1303 [172.22.144.30]) by mwinf1307.wanadoo.fr (SMTP Server) with ESMTP id 559FD7000081; Fri, 2 Sep 2005 10:19:41 +0200 (CEST) X-ME-UUID: 20050902081941350.559FD7000081@mwinf1307.wanadoo.fr Original-To: quarl@cs.berkeley.edu X-Originating-IP: [205.167.7.18] X-Wum-Nature: EMAIL-NATURE X-WUM-FROM: |~| X-WUM-TO: |~| X-WUM-CC: |~| X-WUM-REPLYTO: |~| X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:42576 Archived-At: Hi Karl, > Here is a patch that adds shortcut keys and corresponding labels > to recentf-dialog-mode (the mode that `recentf-open-files' uses). >=20 > The variable `recentf-dialog-show-labels-p' controls whether labels > are displayed, and could default to nil. >=20 > 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. >=20 > 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 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /cvsroot/emacs/emacs/lisp/recentf.el,v retrieving revision 1.42 diff -c -r1.42 recentf.el *** lisp/recentf.el=096 Aug 2005 22:13:43 -0000=091.42 --- lisp/recentf.el=092 Sep 2005 08:16:10 -0000 *************** *** 259,264 **** --- 259,272 ---- :group 'recentf :type '(choice (const :tag "None" nil) function)) +=20 + (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) +=20 =0C ;;; 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.") =20 *************** *** 1063,1068 **** --- 1074,1084 ---- (kill-buffer (current-buffer)) (funcall recentf-menu-action (widget-value widget))) =20 + ;; 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) +=20 (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))) =20 (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))) +=20 + (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 + ((=3D char ?0) 10) + ((and (>=3D char ?1) (<=3D 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))) =20 (defun recentf-open-more-files () "Show a dialog to open a recent file that is not in the menu."