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: Mon, 5 Sep 2005 13:27:04 +0200 (CEST) Message-ID: <21764270.1125919624976.JavaMail.www@wwinf1306> 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 1125920611 20337 80.91.229.2 (5 Sep 2005 11:43:31 GMT) X-Complaints-To: usenet@sea.gmane.org NNTP-Posting-Date: Mon, 5 Sep 2005 11:43:31 +0000 (UTC) Cc: emacs-devel@gnu.org Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Mon Sep 05 13:43:28 2005 Return-path: Original-Received: from lists.gnu.org ([199.232.76.165]) by ciao.gmane.org with esmtp (Exim 4.43) id 1ECFMn-0004kF-3B for ged-emacs-devel@m.gmane.org; Mon, 05 Sep 2005 13:42:25 +0200 Original-Received: from localhost ([127.0.0.1] helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1ECFRE-00063n-5y for ged-emacs-devel@m.gmane.org; Mon, 05 Sep 2005 07:47:00 -0400 Original-Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1ECFD1-0005E7-Jo for emacs-devel@gnu.org; Mon, 05 Sep 2005 07:32:20 -0400 Original-Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1ECFCx-0005By-6t for emacs-devel@gnu.org; Mon, 05 Sep 2005 07:32:16 -0400 Original-Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1ECFCw-0005Br-Q2 for emacs-devel@gnu.org; Mon, 05 Sep 2005 07:32:14 -0400 Original-Received: from [193.252.22.54] (helo=smtp13.wanadoo.fr) by monty-python.gnu.org with esmtp (Exim 4.34) id 1ECFBh-0001q1-4u for emacs-devel@gnu.org; Mon, 05 Sep 2005 07:30:57 -0400 Original-Received: from me-wanadoo.net (localhost [127.0.0.1]) by mwinf1301.wanadoo.fr (SMTP Server) with ESMTP id F3AD37000084 for ; Mon, 5 Sep 2005 13:27:04 +0200 (CEST) Original-Received: from wwinf1306 (wwinf1306 [172.22.144.33]) by mwinf1301.wanadoo.fr (SMTP Server) with ESMTP id F02897000081; Mon, 5 Sep 2005 13:27:04 +0200 (CEST) X-ME-UUID: 20050905112704983.F02897000081@mwinf1301.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:42622 Archived-At: Hi, Here is another patch (sorry) that isolates files with shortcuts in front of the dialog list, instead of mixing them up into sub-menus. This way it is very easy to locate files with shortcuts when `recentf-show-file-shortcuts-flag' is non-nil. David 2005-09-05 David Ponce =09* recentf.el (recentf-show-file-shortcuts-flag): New option. =09(recentf-expand-file-name): Doc fix. =09(recentf-dialog-mode-map): Define digit shortcuts. =09(recentf--files-with-key): New variable. =09(recentf-show-digit-shortcut-filter): New function. =09(recentf-open-files-items): New function. =09(recentf-open-files): Use it. =09(recentf-open-file-with-key): New command. 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=095 Sep 2005 11:21:31 -0000 *************** *** 5,11 **** =20 ;; Author: David Ponce ;; Created: July 19 1999 - ;; Maintainer: FSF ;; Keywords: files =20 ;; This file is part of GNU Emacs. --- 5,10 ---- *************** *** 259,264 **** --- 258,271 ---- :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)) --- 356,362 ---- "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 **** --- 933,941 ---- (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.") =20 *************** *** 1063,1068 **** --- 1073,1090 ---- (kill-buffer (current-buffer)) (funcall recentf-menu-action (widget-value widget))) =20 + ;; List of files associated to a digit shortcut key. + (defvar recentf--files-with-key nil) +=20 + (defun recentf-show-digit-shortcut-filter (l) + "Filter the list of menu-elements L to show digit shortcuts." + (let ((i 0)) + (dolist (e l) + (setq i (1+ i)) + (recentf-set-menu-element-item + e (format "[%d] %s" (% i 10) (recentf-menu-element-item e)))) + l)) +=20 (defun recentf-open-files-item (menu-element) "Return a widget to display MENU-ELEMENT in a dialog buffer." (if (consp (cdr menu-element)) *************** *** 1085,1090 **** --- 1107,1136 ---- :action recentf-open-files-action ,(cdr menu-element)))) =20 + (defun recentf-open-files-items (files) + "Return a list of widgets to display FILES in a dialog buffer." + (set (make-local-variable 'recentf--files-with-key) + (recentf-trunc-list files 10)) + (mapcar 'recentf-open-files-item + (if recentf-show-file-shortcuts-flag + (append + (recentf-apply-menu-filter + 'recentf-show-digit-shortcut-filter + ;; (recentf-apply-menu-filter + ;; 'recentf-relative-filter + (mapcar 'recentf-make-default-menu-element + recentf--files-with-key) + ;; ) + ) + (recentf-apply-menu-filter + recentf-menu-filter + (mapcar 'recentf-make-default-menu-element + (nthcdr 10 files)))) + (recentf-apply-menu-filter + recentf-menu-filter + (mapcar 'recentf-make-default-menu-element + files))))) +=20 (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 *************** *** 1093,1099 **** 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") --- 1139,1146 ---- 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") *************** *** 1101,1116 **** `(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." --- 1148,1177 ---- `(group :indent 2 :format "\n%v\n" ! ,@(recentf-open-files-items (or files recentf-list)))) (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. + N must be a valid digit. + `1' opens the first file, `2' the second file, ... `9' the ninth file. + `0' opens the tenth file." + (interactive + (list + (let ((n (string-to-number (this-command-keys)))) + (cond + ((zerop n) 10) + ((and (> n 0) (< n 10)) n) + ((error "Invalid digit key %d" n)))))) + (when recentf--files-with-key + (let ((file (nth (1- n) 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."