From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED!not-for-mail From: Marcin Borkowski Newsgroups: gmane.emacs.bugs Subject: bug#21072: 24.5; inconsistent behaviour of `C-M-h (mark-defun)' in Emacs Lisp Date: Tue, 11 Oct 2016 19:07:47 +0200 Message-ID: <878ttux198.fsf@mbork.pl> References: <55A74B3C.8030608@gmail.com> <87k2jm2bay.fsf@amu.edu.pl> <83r3dln1ez.fsf@gnu.org> <87y47tzn0v.fsf@mbork.pl> <83lh3tmyzv.fsf@gnu.org> <87twihzhni.fsf@mbork.pl> <83fuu1mu25.fsf@gnu.org> <87eg9jynn0.fsf@mbork.pl> <83h9edkhjs.fsf@gnu.org> <874mabe5h6.fsf@mbork.pl> <83twibfil2.fsf@gnu.org> <87y47mcywp.fsf@mbork.pl> <87bmyrvzh1.fsf@mbork.pl> NNTP-Posting-Host: blaine.gmane.org Mime-Version: 1.0 Content-Type: text/plain X-Trace: blaine.gmane.org 1476205709 14698 195.159.176.226 (11 Oct 2016 17:08:29 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Tue, 11 Oct 2016 17:08:29 +0000 (UTC) User-Agent: mu4e 0.9.17; emacs 26.0.50.1 Cc: rfflrccrd@gmail.com, 21072@debbugs.gnu.org To: Drew Adams Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Tue Oct 11 19:08:23 2016 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by blaine.gmane.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bu0XL-0002dv-9X for geb-bug-gnu-emacs@m.gmane.org; Tue, 11 Oct 2016 19:08:19 +0200 Original-Received: from localhost ([::1]:57067 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bu0XJ-0000uj-Ra for geb-bug-gnu-emacs@m.gmane.org; Tue, 11 Oct 2016 13:08:17 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:33122) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bu0XA-0000uS-Ng for bug-gnu-emacs@gnu.org; Tue, 11 Oct 2016 13:08:10 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bu0X4-0003oN-KS for bug-gnu-emacs@gnu.org; Tue, 11 Oct 2016 13:08:07 -0400 Original-Received: from debbugs.gnu.org ([208.118.235.43]:46190) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bu0X4-0003nO-Fm for bug-gnu-emacs@gnu.org; Tue, 11 Oct 2016 13:08:02 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1bu0X3-000731-Ty for bug-gnu-emacs@gnu.org; Tue, 11 Oct 2016 13:08:01 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Marcin Borkowski Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Tue, 11 Oct 2016 17:08:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 21072 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: Original-Received: via spool by 21072-submit@debbugs.gnu.org id=B21072.147620566327055 (code B ref 21072); Tue, 11 Oct 2016 17:08:01 +0000 Original-Received: (at 21072) by debbugs.gnu.org; 11 Oct 2016 17:07:43 +0000 Original-Received: from localhost ([127.0.0.1]:52377 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bu0Wl-00072I-0Y for submit@debbugs.gnu.org; Tue, 11 Oct 2016 13:07:43 -0400 Original-Received: from mail.mojserwer.eu ([195.110.48.8]:43236) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bu0Wi-000727-RE for 21072@debbugs.gnu.org; Tue, 11 Oct 2016 13:07:41 -0400 Original-Received: from localhost (localhost [127.0.0.1]) by mail.mojserwer.eu (Postfix) with ESMTP id 99300E6890; Tue, 11 Oct 2016 19:07:38 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at mail.mojserwer.eu Original-Received: from mail.mojserwer.eu ([127.0.0.1]) by localhost (mail.mojserwer.eu [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id usx_NWSG4b-T; Tue, 11 Oct 2016 19:07:36 +0200 (CEST) Original-Received: from localhost (static-dwadziewiec-jedenpiec7.echostar.pl [109.232.29.157]) by mail.mojserwer.eu (Postfix) with ESMTPSA id E7CD6E64AF; Tue, 11 Oct 2016 19:07:35 +0200 (CEST) In-reply-to: X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 208.118.235.43 X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Original-Sender: "bug-gnu-emacs" Xref: news.gmane.org gmane.emacs.bugs:124352 Archived-At: On 2016-10-11, at 17:30, Drew Adams wrote: >> Basically, I took into consideration all the points Drew mentioned. I'd >> like to submit my work for review. > > Thanks for working on this, Marcin. You're welcome. BTW, as I probably already mentioned, while working on this, I found a bug in end-of-defun, and until it's fixed, I have to use a silly workaround. >> 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. > > Hopefully someone else can help with that. I'd hope so! > (For my part, if the code needed is small and you just include it here > then I will give it a try and let you know what I think (FWIW).) Here's the code (sans tests): --8<---------------cut here---------------start------------->8--- (defun in-comment-line-p () "Return non-nil if the point is in a comment line. See http://lists.gnu.org/archive/html/help-gnu-emacs/2016-08/msg00141.html" (save-excursion (forward-line 0) (unless (looking-at "^\\s-*$") (< (line-end-position) (let ((ppss (syntax-ppss))) (when (nth 4 ppss) (goto-char (nth 8 ppss))) (forward-comment (point-max)) (point)))))) (defun beginning-of-defun-comments (&optional arg) "Move to the beginning of ARGth defun, including comments." (interactive "^p") (unless arg (setq arg 1)) (beginning-of-defun arg) (unless (bobp) (while (progn (forward-line -1) (in-comment-line-p))) (forward-line 1))) (defun mark-defun (&optional arg) "Put mark at end of this defun, point at beginning. The defun marked is the one that contains point or follows point. With positive ARG, mark this and that many next defuns. If (in Transient Mark mode) the mark is active, it marks the next defun after the one(s) already marked. With positive ARG, mark that many more defuns. With negative ARG, mark that many more previous defuns." (interactive "p") (setq arg (or arg 1)) (cond ((use-region-p) (if (>= arg 0) (set-mark (save-excursion (goto-char (mark)) ;; change the dotimes below to (end-of-defun arg) once bug #24427 is fixed (dotimes (_ignore arg) (end-of-defun)) (point))) (beginning-of-defun-comments (- arg)))) (t (let ((opoint (point)) beg end) (push-mark opoint) ;; Try first in this order for the sake of languages with nested ;; functions where several can end at the same place as with the ;; offside rule, e.g. Python. (beginning-of-defun-comments) (setq beg (point)) (end-of-defun) (setq end (point)) (when (and (<= (point) opoint) (> arg 0)) ;; beginning-of-defun moved back one defun so we got the wrong ;; one. If ARG < 0, however, we actually want to go back. (goto-char opoint) (end-of-defun) (setq end (point)) (beginning-of-defun-comments) (setq beg (point))) (goto-char beg) (cond ((> arg 0) ;; change the dotimes below to (end-of-defun arg) once bug #24427 is fixed (dotimes (_ignore arg) (end-of-defun)) (setq end (point)) (push-mark end nil t) (goto-char beg)) (t (goto-char beg) (beginning-of-defun (1- (- arg))) (push-mark end nil t)))))) (while (progn (forward-line -1) (looking-at "^\\s-*$"))) (forward-line 1)) --8<---------------cut here---------------end--------------->8--- Best, -- Marcin Borkowski