From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Stephen Berman Newsgroups: gmane.emacs.help Subject: Re: Listing headings in dedicated buffer with imenu. Date: Wed, 31 Jul 2024 10:35:17 +0200 Message-ID: <87wml2rmbe.fsf@gmx.net> References: <87a5i0tro1.fsf@gmx.net> <871q3ctqsb.fsf@gmx.net> <87wml4s9p7.fsf@gmx.net> <87wml31fdy.fsf@gmx.net> Mime-Version: 1.0 Content-Type: text/plain Content-Transfer-Encoding: quoted-printable Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="2676"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Gnus/5.13 (Gnus v5.13) Cc: Heime via Users list for the GNU Emacs text editor To: Heime Original-X-From: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane-mx.org@gnu.org Wed Jul 31 10:36:13 2024 Return-path: Envelope-to: geh-help-gnu-emacs@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1sZ4oe-0000XE-Dv for geh-help-gnu-emacs@m.gmane-mx.org; Wed, 31 Jul 2024 10:36:12 +0200 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1sZ4o3-0007T2-VU; Wed, 31 Jul 2024 04:35:35 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1sZ4o1-0007ST-1k for help-gnu-emacs@gnu.org; Wed, 31 Jul 2024 04:35:33 -0400 Original-Received: from mout.gmx.net ([212.227.17.20]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1sZ4ny-00022b-In for help-gnu-emacs@gnu.org; Wed, 31 Jul 2024 04:35:32 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.net; s=s31663417; t=1722414918; x=1723019718; i=stephen.berman@gmx.net; bh=gsqiGYUeMTNdfsGFrlsdY7KpLlcpHvVuA6Yk3BaUyfI=; h=X-UI-Sender-Class:From:To:Cc:Subject:In-Reply-To:References:Date: Message-ID:MIME-Version:Content-Type:Content-Transfer-Encoding:cc: content-transfer-encoding:content-type:date:from:message-id: mime-version:reply-to:subject:to; b=f0TA/mmanb0U8FS/g2+n4TLvelhfKbCisMoA4RHLbCKQQAii5QLCYBtVxesV8j97 RsYKeCayvzUQ5GSzp+bVrHdK/t74Dr6JnFp6PpuCnVIWUYazYnICfGPxYOGJQ+l8G NkR5jFxXwuJUVpE31u5lQv3rtfOI1/mAOKsnR52wxIJxdaskJpuWVVOX1JajPOsl3 vOaHLOWdnI8YU2xxmxMr0qgDrFQI1anRa6hKZWzfps3mtkVTsAWOS5VAZ+rDuGLW+ pkQG02jUM7dfu6pqeWuzCk6smTOz4GmAsheibqcrmLCGe8+pDBOa8pZSgwN0fHKjR BOjX3IBropowsdrfuw== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Original-Received: from strobelfs ([88.130.49.199]) by mail.gmx.net (mrgmx105 [212.227.17.168]) with ESMTPSA (Nemesis) id 1MPXhK-1svXL210xG-00VInO; Wed, 31 Jul 2024 10:35:18 +0200 In-Reply-To: (Heime's message of "Tue, 30 Jul 2024 21:30:28 +0000") X-Provags-ID: V03:K1:6u5LCtMb8VKHRh0wHxJFFtpp3xZ0VReRT1VyJdldIStX1bcGMkG LWoFYGxKxXABvy3pBeQopXunCWzEDM5naCZGO0QMJo93X+t7h6y7rAVVLvvAhernLuJ0Rvp t+Vy6GAJjAUORMP9+4H5ppx21xP/cy2lPfjdYWYgLzbzPRbYsox4RiwgMmnNPGv1g412OAU xLhcG8pWN00MH8dzES1oQ== UI-OutboundReport: notjunk:1;M01:P0:ygh4xKe5as8=;0kel8aaoerVDirdt337iMmoYcLZ guV9gEWZuJZAdgd0uV40/0fiVCEcIzKsW3z0d1pmIMLne08JMYycuUbv0G3pprwQRWtMnG82Q g9ga+vKnQTf7y01uyWsuFNeWmxrv2RlqK5stUwve2eqCOLRQJHMOVKlLSnHHC3DQoHSvQPZP5 lvTQmOipOWDYAcANTHpl3Dv6s0NbIbTgaxRexa8W3AmDPLs0gWjeAwOoSBueF0Xm7QwaeruTu iDl82hcGL4F+OBjPv0rIiDX2cwcF+k2mlgKqjKksIvC6bXkeobGIQDaonCnJmSQ3bLrrHCV1l WGcR5GKZqXUE+2X56P9S2xN580kK7YknynJNmMfqIDPL1xD2eKnhb3BhLgKkB6dqFvxaJvyVM tTOASQ00J4VDMxR9IpYhy4YUkD5acmtEvd4e5a3ngRlZry084Fvd6XiZkQA4m5Q+B/iQSKShO ofhZ0k2Xmq9PRyc9BQjx0dTflzESY1/PU+TjN2TfMo1+IgIYvUUQnkQFCW151F5iDG30sREdl z7sYKBHIsjjfBotYmhlNrIhm5pd/+R2kzljG3T6MSJk9qPAGOdgFoxozpsMyTFFDK1skaJ28O 1WbulHxZo1pOA3QZ1MalaH/KDHYU1Bzc5yeIC2mPUJ9JL903RUN8T3pQRNo9BZ4dejxVE/iH/ 76Jsb7PsZo/mgVJfwTx46kiTa8rIKLft1ZZvmMhqT35iY51NLG6+/NKd0jitefEDiXDbOq6Ei 7elRgf+jt8Vw4KRWqAQKTl+/vsLilE6vHNM+unYYRyWacYv3ktyUdtkiLDrq+nd2aF0AmYbR Received-SPF: pass client-ip=212.227.17.20; envelope-from=stephen.berman@gmx.net; helo=mout.gmx.net X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=-0.01, RCVD_IN_MSPIKE_WL=-0.01, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: help-gnu-emacs@gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Users list for the GNU Emacs text editor List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane-mx.org@gnu.org Original-Sender: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane-mx.org@gnu.org Xref: news.gmane.io gmane.emacs.help:147459 Archived-At: On Tue, 30 Jul 2024 21:30:28 +0000 Heime wrot= e: > Sent with Proton Mail secure email. > > On Wednesday, July 31st, 2024 at 3:59 AM, Heime wrote: > >> On Tuesday, July 30th, 2024 at 1:02 AM, Stephen Berman >> stephen.berman@gmx.net wrote: >> >> > [I sent this yesterday but it hasn't shown up in the list, so >> > resending.] >> > >> > On Mon, 29 Jul 2024 11:53:07 +0000 Heime heimeborgia@protonmail.com w= rote: >> > >> > > On Monday, July 29th, 2024 at 11:45 PM, Stephen Berman >> > > stephen.berman@gmx.net wrote: >> > > >> > > > On Mon, 29 Jul 2024 11:29:07 +0000 Heime heimeborgia@protonmail.c= om wrote: >> > > > >> > > > > Sent with Proton Mail secure email. >> > > > > >> > > > > On Monday, July 29th, 2024 at 10:51 PM, Stephen Berman >> > > > > stephen.berman@gmx.net wrote: >> > > > > >> > > > > > On Mon, 29 Jul 2024 10:41:08 +0000 Heime >> > > > > > heimeborgia@protonmail.com wrote: >> > > > > > >> > > > > > > Sent with Proton Mail secure email. >> > > > > > > >> > > > > > > On Monday, July 29th, 2024 at 10:32 PM, Stephen Berman >> > > > > > > stephen.berman@gmx.net wrote: >> > > > > > > >> > > > > > > > On Mon, 29 Jul 2024 10:26:22 +0000 Heime >> > > > > > > > heimeborgia@protonmail.com wrote: >> > > > > > > > >> > > > > > > > > Sent with Proton Mail secure email. >> > > > > > > > > >> > > > > > > > > On Monday, July 29th, 2024 at 9:33 PM, Stephen Berman >> > > > > > > > > stephen.berman@gmx.net wrote: >> > > > > > > > > >> > > > > > > > > > On Mon, 29 Jul 2024 08:48:38 +0000 Heime >> > > > > > > > > > heimeborgia@protonmail.com wrote: >> > > > > > > > > > >> > > > > > > > > > > I wish to list headings in a dedicated buffer with = imenu. >> > > > > > > > > > > The listing should be in the order in which heading= s occur >> > > > > > > > > > > in the buffer. >> > > > > > > > > > > >> > > > > > > > > > > Have done the following, but the buffer ends up emp= ty. >> > > > > > > > > > > >> > > > > > > > > > > (defun vodil-imenu-bfh () >> > > > > > > > > > > "Insert imenu headings in order in a dedicated buff= er." >> > > > > > > > > > > (interactive) >> > > > > > > > > > > >> > > > > > > > > > > (let ((imenu-items (imenu--make-index-alist t)) >> > > > > > > > > > > (buffer-name "Imenu Headings")) >> > > > > > > > > > > (with-current-buffer (get-buffer-create buffer-name= ) >> > > > > > > > > > > (erase-buffer) >> > > > > > > > > > > (dolist (item imenu-items) >> > > > > > > > > > > (let ((name (car item)) >> > > > > > > > > > > (position (cdr item))) >> > > > > > > > > > > (when (and (stringp name) (number-or-marker-p posit= ion)) >> > > > > > > > > > > (insert (format "%s\n" name))))) >> > > > > > > > > > > (goto-char (point-min))) >> > > > > > > > > > > (pop-to-buffer buffer-name))) >> > > > > > > > > > >> > > > > > > > > > It works for me, as long as imenu.el is loaded. >> > > > > > > > > > >> > > > > > > > > > Steve Berman >> > > > > > > > > >> > > > > > > > > What would I need to load it ? >> > > > > > > > >> > > > > > > > One way is this: >> > > > > > > > >> > > > > > > > (defun vodil-imenu-bfh () >> > > > > > > > "Insert imenu headings in order in a dedicated buffer." >> > > > > > > > (interactive) >> > > > > > > > (eval-when-compile >> > > > > > > > (require 'imenu)) >> > > > > > > > (let ((imenu-items (imenu--make-index-alist t)) >> > > > > > > > (buffer-name "Imenu Headings")) >> > > > > > > > (with-current-buffer (get-buffer-create buffer-name) >> > > > > > > > (erase-buffer) >> > > > > > > > (dolist (item imenu-items) >> > > > > > > > (let ((name (car item)) >> > > > > > > > (position (cdr item))) >> > > > > > > > (when (and (stringp name) (number-or-marker-p position)) >> > > > > > > > (insert (format "%s\n" name))))) >> > > > > > > > (goto-char (point-min))) >> > > > > > > > (pop-to-buffer buffer-name))) >> > > > > > > > >> > > > > > > > Steve Berman >> > > > > > > >> > > > > > > Right. I have this function that I run. Running vodil-imenu= -bfh >> > > > > > > after executing vodil-imenu-expr gives me rescan in the buf= fer. >> > > > > > > >> > > > > > > (defun vodil-imenu-expr () >> > > > > > > "Set up `imenu` to show a list of functions in the current = buffer." >> > > > > > > >> > > > > > > (interactive) >> > > > > > > >> > > > > > > (setq imenu-generic-expression >> > > > > > > '( ("headings" "^;;;\\s-+\\([HM][[:digit:]]\\)\\s-+\\(.*\\)= " 2))) >> > > > > > > >> > > > > > > (imenu-add-to-menubar "Iml") >> > > > > > > (imenu--make-index-alist t) >> > > > > > > (call-interactively 'imenu)) >> > > > > > >> > > > > > What were the contents of the current buffer when you execute= d >> > > > > > vodil-imenu-expr? >> > > > > > >> > > > > > Steve Berman >> > > > > >> > > > > I had an elisp file. I ran "M-x vodil-imenu-expr" when in the f= ile to get >> > > > > the correct imenu entries. But executing "M-x vodil-imenu-bfh" = after that >> > > > > I end up with the buffer "Imenu Headings" having only rescan in= it. >> > > > >> > > > When I test your code on one of the built-in Emacs Lisp libraries= , >> > > > e.g. avoid.el, then, on invoking vodil-imenu-expr, I get prompted= for an >> > > > Index item, and typing TAB, the Completions buffer pops up contai= ning >> > > > Rescan and nil. I then type C-g and then M-x vodil-imenu-bfh, and= the >> > > > Imenu Headings buffer pops up containing just Rescan. However, wh= en >> > > > I start Emacs -Q, evaluate just my emendation of your vodil-imenu= -bfh >> > > > command, then visit avoid.el and invoking vodil-imenu-bfh, the >> > > > Imenu Headings buffer pops up containing this: >> > > > >> > > > Rescan >> > > > mouse-avoidance-set-pointer-shape >> > > > mouse-avoidance-point-position >> > > > mouse-avoidance-set-mouse-position >> > > > mouse-avoidance-too-close-p >> > > > mouse-avoidance-banish-destination >> > > > mouse-avoidance-banish-mouse >> > > > mouse-avoidance-delta >> > > > mouse-avoidance-nudge-mouse >> > > > mouse-avoidance-random-shape >> > > > mouse-avoidance-ignore-p >> > > > mouse-avoidance-banish >> > > > mouse-avoidance-exile >> > > > mouse-avoidance-fancy >> > > > mouse-avoidance-mode >> > > > >> > > > So at least the contents of avoid.el does not contain a match for= your >> > > > setting of imenu-generic-expression, and presumably the same goes= for >> > > > the file you tested your code on. >> > > > >> > > > Steve Berman >> > > >> > > Try with this to pick up (defun >> > > >> > > ("defun" "^\\s-*(defun\\s-+\\([[:word:]-]+\\)") 1) >> > > >> > > imenu-generic-expression works on my elisp file. Only the new buffe= r has rescan >> > >> > Ok, now I see the problem: the list produced by imenu--make-index-ali= st >> > contains two elements: ("Rescan" . -99) is the first, and the second >> > is a list whose car is "defun" (or for your file presumably "headings= ") >> > and whose cdr is the list of strings from the matching elements >> > (defuns/headings) in the file with their positions. What you want to >> > loop over is just the latter list. So it should work if you use this = in >> > vodil-imenu-bfh: >> > >> > (let ((imenu-items (cdadr (imenu--make-index-alist t))) >> > ...) >> > ...) >> > >> > Steve Berman >> >> >> Now things are working as I hoped. >> > > Would you be so kind to explain why I need cdadr ? It returns the > `cdr' of the `car' of the `cdr'. A quite complicated thing for me. As I noted, imenu--make-index-alist returns a two-element list, which looks like this (using "defun" and avoid.el for a specific example, and formatting for legibility): (("*Rescan*" . -99) ("defun" ("mouse-avoidance-point-position" . #) ("mouse-avoidance-set-mouse-position" . #) ("mouse-avoidance-too-close-p" . #) ("mouse-avoidance-banish-destination" . #) ("mouse-avoidance-banish-mouse" . #) ("mouse-avoidance-nudge-mouse" . #) ("mouse-avoidance-random-shape" . #) ("mouse-avoidance-ignore-p" . #) ("mouse-avoidance-banish" . #) ("mouse-avoidance-exile" . #) ("mouse-avoidance-fancy" . #) ("mouse-avoidance-mode" . #))) You want to loop over the list of cons cells containing the function names and their positions in the file. To get this list, first take the cdr of the above list, giving (("defun" ("mouse-avoidance-mode" . "