From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Tassilo Horn Newsgroups: gmane.emacs.bugs Subject: bug#21747: 25.0.50; while-no-input breaks kbd event handling when called from post-command-hook Date: Sun, 25 Oct 2015 08:19:16 +0100 Message-ID: <87si4zpg97.fsf@gnu.org> References: <87bnboemqb.fsf@gnu.org> <838u6sy9s1.fsf@gnu.org> <877fmcejgn.fsf@gnu.org> <83ziz8wrun.fsf@gnu.org> <8737x0egvm.fsf@gnu.org> <83vb9wwnc6.fsf@gnu.org> <874mhg1n25.fsf@gnu.org> <83si50wi2m.fsf@gnu.org> <87fv109yxo.fsf@gnu.org> <83lhasweeh.fsf@gnu.org> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: text/plain X-Trace: ger.gmane.org 1445757627 20173 80.91.229.3 (25 Oct 2015 07:20:27 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Sun, 25 Oct 2015 07:20:27 +0000 (UTC) Cc: storm@cua.dk, monnier@iro.umontreal.ca, 21747@debbugs.gnu.org, bruce.connor.am@gmail.com To: Eli Zaretskii Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Sun Oct 25 08:20:14 2015 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1ZqFb9-0006uh-O1 for geb-bug-gnu-emacs@m.gmane.org; Sun, 25 Oct 2015 08:20:11 +0100 Original-Received: from localhost ([::1]:46798 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZqFb9-0000EE-0R for geb-bug-gnu-emacs@m.gmane.org; Sun, 25 Oct 2015 03:20:11 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:37725) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZqFb4-0000CI-Mj for bug-gnu-emacs@gnu.org; Sun, 25 Oct 2015 03:20:08 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZqFb0-0005fA-OG for bug-gnu-emacs@gnu.org; Sun, 25 Oct 2015 03:20:06 -0400 Original-Received: from debbugs.gnu.org ([208.118.235.43]:46657) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZqFb0-0005ez-Kq for bug-gnu-emacs@gnu.org; Sun, 25 Oct 2015 03:20:02 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.80) (envelope-from ) id 1ZqFb0-0008Gu-0W for bug-gnu-emacs@gnu.org; Sun, 25 Oct 2015 03:20:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Tassilo Horn Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sun, 25 Oct 2015 07:20:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 21747 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: Original-Received: via spool by 21747-submit@debbugs.gnu.org id=B21747.144575758331763 (code B ref 21747); Sun, 25 Oct 2015 07:20:01 +0000 Original-Received: (at 21747) by debbugs.gnu.org; 25 Oct 2015 07:19:43 +0000 Original-Received: from localhost ([127.0.0.1]:37365 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1ZqFag-0008GE-98 for submit@debbugs.gnu.org; Sun, 25 Oct 2015 03:19:42 -0400 Original-Received: from out3-smtp.messagingengine.com ([66.111.4.27]:54008) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1ZqFaL-0008Fl-UO for 21747@debbugs.gnu.org; Sun, 25 Oct 2015 03:19:41 -0400 Original-Received: from compute1.internal (compute1.nyi.internal [10.202.2.41]) by mailout.nyi.internal (Postfix) with ESMTP id BEDF6203B0 for <21747@debbugs.gnu.org>; Sun, 25 Oct 2015 03:19:19 -0400 (EDT) Original-Received: from frontend2 ([10.202.2.161]) by compute1.internal (MEProxy); Sun, 25 Oct 2015 03:19:19 -0400 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to:x-sasl-enc :x-sasl-enc; s=smtpout; bh=/gRmq1j06GkhsCaLY50yr/e58go=; b=sm6vb YbSjm0i93zLpYEpoT03YyAGG8MzXcDqOVsfgQjYHcU8ccqV9N8UrFoFx0lF8+1vA F2TWLt9ns1J5y4ImFVmLE0mxu9RNmk+oA1kIBQk8nZ8hDtQ04QfrtU1BtULOu5DJ pPoNujdZDvuUx7IVF+TvCVDI2xvlzKZRrb6QhM= X-Sasl-enc: KInWqkdbMBcEaQEjmUpjE0TUwfz6Hhm+k0Ub355zTwmU 1445757559 Original-Received: from thinkpad-t440p (unknown [2.160.223.152]) by mail.messagingengine.com (Postfix) with ESMTPA id 287E7680109; Sun, 25 Oct 2015 03:19:18 -0400 (EDT) In-Reply-To: <83lhasweeh.fsf@gnu.org> (Eli Zaretskii's message of "Sat, 24 Oct 2015 17:05:10 +0300") User-Agent: Gnus/5.130014 (Ma Gnus v0.14) Emacs/25.0.50 (gnu/linux) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.15 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x 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-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.bugs:108011 Archived-At: Eli Zaretskii writes: >> From: Tassilo Horn >> Cc: bruce.connor.am@gmail.com, monnier@iro.umontreal.ca, storm@cua.dk, >> 21747@debbugs.gnu.org >> Date: Sat, 24 Oct 2015 15:30:11 +0200 >> >> Eli Zaretskii writes: >> >> >> My recipe for reproduction is >> >> >> >> 1. emacs -Q >> >> 2. M-x package-initialize >> >> 3. M-x global-aggressive-indent-mode >> >> 4. C-x C-f ~/test.sh >> >> 5. type the keyword if where the i is displayed immediately >> >> and the display of f is delayed >> >> >> >> This does only occur for sh-mode keywords like if, while, etc. where the >> >> delaying starts with after entering the last char of the keyword. Also, >> >> I can reproduce that problem only if test.sh doesn't exist. >> > >> > I don't understand: are you saying that the post-command-hook finished >> > its job, and yet redisplay is not entered? >> >> Yes, or rather the function aggressive-indent--indent-if-changed which >> is in post-command-hook finished. >> >> >> Or well, I just tried what happens when I replace the `while-no-input' >> >> with a `progn'. Then Emacs goes into some infloop. Attaching with gdb >> >> shows: >> > >> > There's a procedure in etc/DEBUG to determine which call-stack frame >> > infloops, please use it and tell what you found. >> >> Ok, so with the aggressive-indent--indent-if-changed where >> while-no-input is replaced with progn, I perform my recipe until emacs >> infloops. Then do "kill -TSTP " and repeatedly "finish" at the gdb >> prompt. But the last frame being displayed in GDB before finish doesn't >> return anymore is not always the same. Most of the time it is poll () >> from /usr/lib/libc.so.6. Here are two other results. > > No, that's bogus (GC cannot infloop, you just didn't wait long enough > for that "finish" to return). Oh, sorry. > The function that infloops is re-search-backward, because it is called > with LIMIT set to zero. The real problem is here: > > (defun sh-smie--keyword-p () > "Non-nil if we're at a keyword position. > A keyword position is one where if we're looking at something that looks > like a keyword, then it is a keyword." > (let ((prev (funcall smie-backward-token-function))) > (if (zerop (length prev)) > (looking-back "\\`\\|\\s(" (1- (point))) <<<<<<<<<<<<<<<<<< > (assoc prev smie-grammar)))) > > What do you expect looking-back to do here when point is at BOB? I think when point is a BOB, then the \\` part of the regex would match for sure so replacing looking-back with (or (bobp) (looking-back ...)) would have the same semantics, right? So I've tried this patch: --8<---------------cut here---------------start------------->8--- diff --git a/lisp/progmodes/sh-script.el b/lisp/progmodes/sh-script.el index fbb4a90..2e708f7 100644 --- a/lisp/progmodes/sh-script.el +++ b/lisp/progmodes/sh-script.el @@ -1774,7 +1774,8 @@ sh-smie--keyword-p like a keyword, then it is a keyword." (let ((prev (funcall smie-backward-token-function))) (if (zerop (length prev)) - (looking-back "\\`\\|\\s(" (1- (point))) + (or (bobp) + (looking-back "\\`\\|\\s(" (1- (point)))) (assoc prev smie-grammar)))) (defun sh-smie--newline-semi-p (&optional tok) @@ -1788,7 +1789,8 @@ sh-smie--newline-semi-p (unless tok (setq tok (funcall smie-backward-token-function))) (if (and (zerop (length tok)) - (looking-back "\\s(" (1- (point)))) + (or (bobp) + (looking-back "\\s(" (1- (point))))) nil (not (numberp (nth 2 (assoc tok smie-grammar))))))) @@ -2172,7 +2174,7 @@ sh-smie--rc-after-special-arg-p "Check if we're after the first arg of an if/while/for/... construct. Returns the construct's token and moves point before it, if so." (forward-comment (- (point))) - (when (looking-back ")\\|\\_8--- But that still loops. When tracing all aggressive-indent and sh-smie functions, that's the problematic call stack, i.e., the case where (sh-smie-sh-forward-token) returns ";". --8<---------------cut here---------------start------------->8--- 1 -> (aggressive-indent--indent-if-changed) | 2 -> (aggressive-indent--run-user-hooks) | 2 <- aggressive-indent--run-user-hooks: nil | 2 -> (aggressive-indent--softly-indent-region-and-on 2 3) | | 3 -> (aggressive-indent-indent-region-and-on 2 3) | | | 4 -> (sh-smie--indent-continuation) | | | | 5 -> (sh-smie--looking-back-at-continuation-p) | | | | 5 <- sh-smie--looking-back-at-continuation-p: nil | | | 4 <- sh-smie--indent-continuation: nil | | | 4 -> (sh-smie-sh-forward-token) | | | | 5 -> (sh-smie--default-forward-token) | | | | 5 <- sh-smie--default-forward-token: "if" | | | | 5 -> (sh-smie--sh-keyword-p "if") | | | | | 6 -> (sh-smie--keyword-p) | | | | | | 7 -> (sh-smie-sh-backward-token) | | | | | | | 8 -> (sh-smie--default-backward-token) | | | | | | | 8 <- sh-smie--default-backward-token: "" | | | | | | 7 <- sh-smie-sh-backward-token: "" | | | | | 6 <- sh-smie--keyword-p: t | | | | 5 <- sh-smie--sh-keyword-p: t | | | 4 <- sh-smie-sh-forward-token: "if" | | | 4 -> (sh-smie-sh-forward-token) | | | | 5 -> (sh-smie--newline-semi-p) | | | | | 6 -> (sh-smie-sh-backward-token) | | | | | | 7 -> (sh-smie--default-backward-token) | | | | | | 7 <- sh-smie--default-backward-token: "if" | | | | | | 7 -> (sh-smie--sh-keyword-p "if") | | | | | | | 8 -> (sh-smie--keyword-p) | | | | | | | | 9 -> (sh-smie-sh-backward-token) | | | | | | | | | 10 -> (sh-smie--default-backward-token) | | | | | | | | | 10 <- sh-smie--default-backward-token: "" | | | | | | | | 9 <- sh-smie-sh-backward-token: "" | | | | | | | 8 <- sh-smie--keyword-p: t | | | | | | 7 <- sh-smie--sh-keyword-p: t | | | | | 6 <- sh-smie-sh-backward-token: "if" | | | | 5 <- sh-smie--newline-semi-p: nil | | | 4 <- sh-smie-sh-forward-token: ";" | | | 4 -> (sh-smie-sh-forward-token) | | | | 5 -> (sh-smie--newline-semi-p) | | | | | 6 -> (sh-smie-sh-backward-token) | | | | | | 7 -> (sh-smie--default-backward-token) | | | | | | 7 <- sh-smie--default-backward-token: "if" | | | | | | 7 -> (sh-smie--sh-keyword-p "if") | | | | | | | 8 -> (sh-smie--keyword-p) | | | | | | | | 9 -> (sh-smie-sh-backward-token) | | | | | | | | | 10 -> (sh-smie--default-backward-token) | | | | | | | | | 10 <- sh-smie--default-backward-token: "" | | | | | | | | 9 <- sh-smie-sh-backward-token: "" | | | | | | | 8 <- sh-smie--keyword-p: t | | | | | | 7 <- sh-smie--sh-keyword-p: t | | | | | 6 <- sh-smie-sh-backward-token: "if" | | | | 5 <- sh-smie--newline-semi-p: nil | | | 4 <- sh-smie-sh-forward-token: ";" [... gazillion of times...] | | | 4 -> (sh-smie-sh-forward-token) | | | | 5 -> (sh-smie--newline-semi-p) | | | | | 6 -> (sh-smie-sh-backward-token) | | | | | | 7 -> (sh-smie--default-backward-token) | | | | | | 7 <- sh-smie--default-backward-token: "if" | | | | | | 7 -> (sh-smie--sh-keyword-p "if") | | | | | | | 8 -> (sh-smie--keyword-p) | | | | | | | | 9 -> (sh-smie-sh-backward-token) | | | | | | | | | 10 -> (sh-smie--default-backward-token) | | | | | | | | 9 <- sh-smie-sh-backward-token: !non-local\ exit! | | | | | | | 8 <- sh-smie--keyword-p: !non-local\ exit! | | | | | | 7 <- sh-smie--sh-keyword-p: !non-local\ exit! | | | | | 6 <- sh-smie-sh-backward-token: !non-local\ exit! | | | | 5 <- sh-smie--newline-semi-p: !non-local\ exit! | | | 4 <- sh-smie-sh-forward-token: !non-local\ exit! | | 3 <- aggressive-indent-indent-region-and-on: !non-local\ exit! | 2 <- aggressive-indent--softly-indent-region-and-on: !non-local\ exit! 1 <- aggressive-indent--indent-if-changed: t --8<---------------cut here---------------end--------------->8--- Bye, Tassilo