From: Marcin Borkowski <mbork@mbork.pl>
To: Drew Adams <drew.adams@oracle.com>
Cc: rfflrccrd@gmail.com, 21072@debbugs.gnu.org
Subject: bug#21072: 24.5; inconsistent behaviour of `C-M-h (mark-defun)' in Emacs Lisp
Date: Tue, 11 Oct 2016 14:31:38 +0200 [thread overview]
Message-ID: <87bmyrvzh1.fsf@mbork.pl> (raw)
In-Reply-To: <e7dc27a9-c9d0-44a0-b659-7e88db2b4357@default>
On 2016-05-07, at 07:07, Drew Adams <drew.adams@oracle.com> wrote:
> I agree that the behavior is not particularly consistent, and it
> does not completely correspond to the doc. What the best fix is,
> I don't know.
>
> It's been this way for a long time, so there might be people
> who expect or like it to do what it does, in which case the
> doc should probably be fixed somewhat.
>
> On the other hand, I'd bet that few, if any, would complain if
> better behavior were implemented.
>
> In any case, the behavior of being able to repeat to keep selecting
> more defuns further down should be kept.
>
> I'd suggest that Someone (TM) (Marcin?) implement a better
> behavior and propose it to emacs-devel. ;-)
>
> What might be better?
>
> 1. At least consistency wrt which defun gets selected, when
> betweeen defuns. The doc suggests a general rule (the next
> defun), but that is not always respected.
>
> 2. Something consistent also wrt a comment before the defun
> that will be selected.
>
> 3. It could be good for a numeric prefix arg to select that
> many defuns.
>
> 4. It could be good for a negative prefix arg to select in
> the opposite direction. This is the main improvement I'd
> like to see. E.g. `M-- C-M-h' selects the previous defun;
> `M-2 C-M-h' selects the two previous defuns.
>
> Someone should play around and dream up something useful.
>
> Wrt #2, I'm not sure what the best approach might be.
Hi all,
it's been some time, and I implemented a better (?) behavior indeed.
(Yes, I know a few months passed. But I don't have a lot of time to
work on Emacs bugs now. This bug took me almost 8 hours over the past
few months.)
Basically, I took into consideration all the points Drew mentioned. I'd
like to submit my work for review. I have one technical problem,
though: I have it as a series of commits on a separate branch in my
repo, and I'm not Git-literate enough to make one patch from them.
Should I submit a series of patches? Should I rebase my commits into
one big one? (No big deal, this might be a good idea anyway.)
In the course of my work, I have also implemented a macro to help write
tests for the new behavior (there are 6 ERT tests, with 40 assertions
total). Here it is (for review):
--8<---------------cut here---------------start------------->8---
(defvar elisp-test-point-marker-regex "=!\\([a-zA-Z0-9-]+\\)="
"A regexp matching placeholders for point position for
`elisp-tests-with-temp-buffer'.")
;; Copied and heavily modified from `python-tests-with-temp-buffer'
(defmacro elisp-tests-with-temp-buffer (contents &rest body)
"Create a `emacs-lisp-mode' enabled temp buffer with CONTENTS.
BODY is code to be executed within the temp buffer. Point is
always located at the beginning of buffer. Special markers of
the form =!NAME= in CONTENTS are removed, and a for each one
a variable called NAME is bound to the position of such
a marker."
(declare (indent 1) (debug t))
`(with-temp-buffer
(emacs-lisp-mode)
(insert ,contents)
(goto-char (point-min))
(while (re-search-forward elisp-test-point-marker-regex nil t)
(delete-region (match-beginning 0)
(match-end 0)))
(goto-char (point-min))
,(let (marker-list)
(with-temp-buffer
(insert (cond ((symbolp contents)
(symbol-value contents))
(t contents)))
(goto-char (point-min))
(while (re-search-forward elisp-test-point-marker-regex nil t)
(push (list (intern (match-string-no-properties 1))
(match-beginning 0))
marker-list)
(delete-region (match-beginning 0)
(match-end 0))))
`(let ,marker-list
,@body))))
--8<---------------cut here---------------end--------------->8---
And it can be used like this:
--8<---------------cut here---------------start------------->8---
(defvar mark-defun-test-buffer
";; Comment header
=!before-1=
\(defun func-1 (arg)
=!inside-1=\"docstring\"
body)
=!after-1==!before-2=
;; Comment before a defun
\(d=!inside-2=efun func-2 (arg)
\"docstring\"
body)
=!after-2==!before-3=
\(defun func-3 (arg)
\"docstring\"=!inside-3=
body)
=!after-3==!before-4=(defun func-4 (arg)
\"docstring\"=!inside-4=
body)
=!after-4=
;; end
"
"Test buffer for `mark-defun'.")
(ert-deftest mark-defun-no-arg-region-inactive ()
"Test `mark-defun' with no prefix argument and inactive
region."
(elisp-tests-with-temp-buffer
mark-defun-test-buffer
;; mark-defun inside a defun, with comments and an empty line
;; before
(goto-char inside-1)
(mark-defun)
(should (= (point) before-1))
(should (= (mark) after-1))))
--8<---------------cut here---------------end--------------->8---
WDYT?
--
Marcin Borkowski
next prev parent reply other threads:[~2016-10-11 12:31 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-07-16 6:12 bug#21072: 24.5; inconsistent behaviour of `C-M-h (mark-defun)' in Emacs Lisp Raffaele Ricciardi
2016-04-25 11:11 ` Marcin Borkowski
2016-05-01 17:17 ` Eli Zaretskii
2016-05-01 17:49 ` Marcin Borkowski
2016-05-01 18:09 ` Eli Zaretskii
2016-05-01 19:45 ` Marcin Borkowski
2016-05-01 19:56 ` Eli Zaretskii
2016-05-03 18:58 ` Marcin Borkowski
2016-05-04 14:45 ` Eli Zaretskii
2016-05-06 12:27 ` Marcin Borkowski
2016-05-06 12:59 ` Eli Zaretskii
2016-05-07 3:47 ` Marcin Borkowski
2016-05-07 5:07 ` Drew Adams
2016-10-11 12:31 ` Marcin Borkowski [this message]
2016-10-11 15:30 ` Drew Adams
2016-10-11 17:07 ` Marcin Borkowski
2016-10-11 17:52 ` Clément Pit--Claudel
2016-10-11 20:26 ` Drew Adams
2016-10-11 21:15 ` Drew Adams
2016-10-28 5:35 ` Marcin Borkowski
2016-10-28 14:32 ` Drew Adams
2016-11-02 7:28 ` Marcin Borkowski
2016-11-02 18:25 ` Drew Adams
2016-11-04 7:48 ` Marcin Borkowski
2016-11-27 7:40 ` Marcin Borkowski
2016-11-27 18:51 ` Drew Adams
2017-02-07 6:22 ` Marcin Borkowski
2017-02-07 16:14 ` Drew Adams
2016-05-07 6:47 ` Eli Zaretskii
2016-06-05 6:30 ` Marcin Borkowski
2016-06-05 7:01 ` bug#21072: Forgotten attachment (was: bug#21072: 24.5; inconsistent behaviour of `C-M-h (mark-defun)' in Emacs Lisp) Marcin Borkowski
2016-06-09 11:56 ` bug#21072: 24.5; inconsistent behaviour of `C-M-h (mark-defun)' in Emacs Lisp Marcin Borkowski
2016-06-21 7:58 ` Marcin Borkowski
2016-06-21 9:05 ` Andreas Röhler
2016-06-21 10:07 ` Marcin Borkowski
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
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87bmyrvzh1.fsf@mbork.pl \
--to=mbork@mbork.pl \
--cc=21072@debbugs.gnu.org \
--cc=drew.adams@oracle.com \
--cc=rfflrccrd@gmail.com \
/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 public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).