From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Juri Linkov Newsgroups: gmane.emacs.devel Subject: Re: Keywords Date: Mon, 15 Mar 2010 23:33:03 +0200 Organization: JURTA Message-ID: <87fx41uwl4.fsf@mail.jurta.org> References: <87zl2g24xy.fsf@stupidchicken.com> <87mxyfq3bz.fsf@gmx.de> <87sk87h49a.fsf@gmx.de> <87hbomwu4b.fsf_-_@mail.jurta.org> <878w9yr0zh.fsf_-_@mail.jurta.org> <87pr37ka78.fsf@mail.jurta.org> NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Trace: dough.gmane.org 1268690518 12036 80.91.229.12 (15 Mar 2010 22:01:58 GMT) X-Complaints-To: usenet@dough.gmane.org NNTP-Posting-Date: Mon, 15 Mar 2010 22:01:58 +0000 (UTC) To: emacs-devel@gnu.org Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Mon Mar 15 23:01:54 2010 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by lo.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1NrIMD-0000HS-QE for ged-emacs-devel@m.gmane.org; Mon, 15 Mar 2010 23:01:54 +0100 Original-Received: from localhost ([127.0.0.1]:52187 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NrIMC-0000fw-RG for ged-emacs-devel@m.gmane.org; Mon, 15 Mar 2010 18:01:52 -0400 Original-Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1NrILD-0000IN-5D for emacs-devel@gnu.org; Mon, 15 Mar 2010 18:00:51 -0400 Original-Received: from [140.186.70.92] (port=43025 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NrILB-0000Hf-Ap for emacs-devel@gnu.org; Mon, 15 Mar 2010 18:00:50 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1NrIL8-0002fQ-UU for emacs-devel@gnu.org; Mon, 15 Mar 2010 18:00:49 -0400 Original-Received: from smtp-out2.starman.ee ([85.253.0.4]:53461 helo=mx2.starman.ee) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1NrIL8-0002eu-KC for emacs-devel@gnu.org; Mon, 15 Mar 2010 18:00:46 -0400 X-Virus-Scanned: by Amavisd-New at mx2.starman.ee Original-Received: from mail.starman.ee (62.65.209.182.cable.starman.ee [62.65.209.182]) by mx2.starman.ee (Postfix) with ESMTP id 39F843F40CA for ; Tue, 16 Mar 2010 00:00:38 +0200 (EET) In-Reply-To: <87pr37ka78.fsf@mail.jurta.org> (Juri Linkov's message of "Sun, 14 Mar 2010 23:33:55 +0200") User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.0.50 (x86_64-pc-linux-gnu) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6, seldom 2.4 (older, 4) 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:122027 Archived-At: There are remaining two tasks in finder.el that I think would be useful: ;; Things to do: ;; 1. Support multiple keywords per search. This could be extremely hairy; ;; there doesn't seem to be any way to get completing-read to exit on ;; an EOL with no substring pending, which is what we'd want to end the loop. ;; 2. Search by string in synopsis line? The first task is easy to implement with the help of `completing-read-multiple'. The second task is also easy to implement by just listing all packages with synopsis lines and keywords thus allowing to search a string simply using Isearch. === modified file 'lisp/finder.el' --- lisp/finder.el 2010-03-14 19:59:20 +0000 +++ lisp/finder.el 2010-03-15 21:32:35 +0000 @@ -27,12 +27,6 @@ ;; This mode uses the Keywords library header to provide code-finding ;; services by keyword. -;; -;; Things to do: -;; 1. Support multiple keywords per search. This could be extremely hairy; -;; there doesn't seem to be any way to get completing-read to exit on -;; an EOL with no substring pending, which is what we'd want to end the loop. -;; 2. Search by string in synopsis line? ;;; Code: === modified file 'lisp/info.el' --- lisp/info.el 2010-03-14 16:59:20 +0000 +++ lisp/info.el 2010-03-15 21:31:05 +0000 @@ -3390,7 +3390,8 @@ (defun Info-finder-find-node (filename n (insert (format "* %-14s %s.\n" (concat (symbol-name keyword) "::") (cdr assoc))))) - (cons '(unknown . "unknown keywords") + (append '((all . "All package info") + (unknown . "unknown keywords")) finder-known-keywords))) ((equal nodename "unknown") ;; Display unknown keywords @@ -3405,6 +3406,22 @@ (defun Info-finder-find-node (filename n (concat (symbol-name (car assoc)) "::") (cdr assoc)))) (finder-unknown-keywords))) + ((equal nodename "all") + ;; Display all package info. + (insert (format "\n\^_\nFile: %s, Node: %s, Up: Top\n\n" + Info-finder-file nodename)) + (insert "Finder Package Info\n") + (insert "*******************\n\n") + (mapc (lambda (package) + (insert (format "%s - %s\n" + (format "*Note %s::" (nth 0 package)) + (nth 1 package))) + (insert "Keywords: " + (mapconcat (lambda (keyword) + (format "*Note %s::" (symbol-name keyword))) + (nth 2 package) ", ") + "\n\n")) + finder-package-info)) ((string-match-p "\\.el\\'" nodename) ;; Display commentary section (insert (format "\n\^_\nFile: %s, Node: %s, Up: Top\n\n" @@ -3429,6 +3446,7 @@ (defun Info-finder-find-node (filename n (buffer-string)))))) (t ;; Display packages that match the keyword + ;; or the list of keywords separated by comma. (insert (format "\n\^_\nFile: %s, Node: %s, Up: Top\n\n" Info-finder-file nodename)) (insert "Finder Packages\n") @@ -3436,21 +3454,39 @@ (defun Info-finder-find-node (filename n (insert "The following packages match the keyword `" nodename "':\n\n") (insert "* Menu:\n\n") - (let ((id (intern nodename))) + (let ((keywords + (mapcar 'intern (if (string-match-p "," nodename) + (split-string nodename ",[ \t\n]*" t) + (list nodename))))) (mapc - (lambda (x) - (when (memq id (cadr (cdr x))) + (lambda (package) + (unless (memq nil (mapcar (lambda (k) (memq k (nth 2 package))) + keywords)) (insert (format "* %-16s %s.\n" - (concat (car x) "::") - (cadr x))))) + (concat (nth 0 package) "::") + (nth 1 package))))) finder-package-info))))) ;;;###autoload -(defun info-finder () - "Display descriptions of the keywords in the Finder virtual manual." - (interactive) +(defun info-finder (&optional keywords) + "Display descriptions of the keywords in the Finder virtual manual. +In interactive use, a prefix argument directs this command to read +a list of keywords separated by comma. After that, it displays a node +with a list packages that contain all specified keywords." + (interactive + (when current-prefix-arg + (require 'finder) + (list + (completing-read-multiple + "Keywords (separated by comma): " + (mapcar 'symbol-name (mapcar 'car (append finder-known-keywords + (finder-unknown-keywords)))) + nil t)))) (require 'finder) - (Info-find-node Info-finder-file "Top")) + (if keywords + (Info-find-node Info-finder-file (mapconcat 'identity keywords ", ")) + (Info-find-node Info-finder-file "Top"))) + (defun Info-undefined () "Make command be undefined in Info." -- Juri Linkov http://www.jurta.org/emacs/