From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED!not-for-mail From: Dima Kogan Newsgroups: gmane.emacs.bugs Subject: bug#25271: 26.0.50; [PATCH] comint-insert-previous-argument logic improvements Date: Sun, 25 Dec 2016 11:54:13 -0800 Message-ID: <87eg0veqe2.fsf@secretsauce.net> NNTP-Posting-Host: blaine.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Trace: blaine.gmane.org 1482695721 29470 195.159.176.226 (25 Dec 2016 19:55:21 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Sun, 25 Dec 2016 19:55:21 +0000 (UTC) To: 25271@debbugs.gnu.org Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Sun Dec 25 20:55:17 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 1cLEsx-0006B7-2U for geb-bug-gnu-emacs@m.gmane.org; Sun, 25 Dec 2016 20:55:11 +0100 Original-Received: from localhost ([::1]:47808 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cLEt0-0002JG-2v for geb-bug-gnu-emacs@m.gmane.org; Sun, 25 Dec 2016 14:55:14 -0500 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:51441) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cLEss-0002G4-Eu for bug-gnu-emacs@gnu.org; Sun, 25 Dec 2016 14:55:08 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cLEso-0003TD-Dv for bug-gnu-emacs@gnu.org; Sun, 25 Dec 2016 14:55:06 -0500 Original-Received: from debbugs.gnu.org ([208.118.235.43]:39571) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1cLEso-0003T9-AS for bug-gnu-emacs@gnu.org; Sun, 25 Dec 2016 14:55:02 -0500 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1cLEso-0005B7-47 for bug-gnu-emacs@gnu.org; Sun, 25 Dec 2016 14:55:02 -0500 X-Loop: help-debbugs@gnu.org Resent-From: Dima Kogan Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sun, 25 Dec 2016 19:55:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 25271 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch X-Debbugs-Original-To: bug-gnu-emacs@gnu.org Original-Received: via spool by submit@debbugs.gnu.org id=B.148269567219857 (code B ref -1); Sun, 25 Dec 2016 19:55:01 +0000 Original-Received: (at submit) by debbugs.gnu.org; 25 Dec 2016 19:54:32 +0000 Original-Received: from localhost ([127.0.0.1]:54970 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cLEsJ-0005AC-Ly for submit@debbugs.gnu.org; Sun, 25 Dec 2016 14:54:32 -0500 Original-Received: from eggs.gnu.org ([208.118.235.92]:60421) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cLEsI-0005A0-9P for submit@debbugs.gnu.org; Sun, 25 Dec 2016 14:54:30 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cLEsB-0003NS-Nm for submit@debbugs.gnu.org; Sun, 25 Dec 2016 14:54:25 -0500 Original-Received: from lists.gnu.org ([2001:4830:134:3::11]:47875) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cLEsB-0003NO-L1 for submit@debbugs.gnu.org; Sun, 25 Dec 2016 14:54:23 -0500 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:51391) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cLEs9-0002EQ-NQ for bug-gnu-emacs@gnu.org; Sun, 25 Dec 2016 14:54:23 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cLEs5-0003Mo-PU for bug-gnu-emacs@gnu.org; Sun, 25 Dec 2016 14:54:21 -0500 Original-Received: from out1-smtp.messagingengine.com ([66.111.4.25]:41555) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cLEs5-0003Me-IR for bug-gnu-emacs@gnu.org; Sun, 25 Dec 2016 14:54:17 -0500 Original-Received: from compute1.internal (compute1.nyi.internal [10.202.2.41]) by mailout.nyi.internal (Postfix) with ESMTP id 55FC8207F9 for ; Sun, 25 Dec 2016 14:54:15 -0500 (EST) Original-Received: from frontend1 ([10.202.2.160]) by compute1.internal (MEProxy); Sun, 25 Dec 2016 14:54:15 -0500 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=secretsauce.net; h=content-type:date:from:message-id:mime-version:subject:to :x-me-sender:x-me-sender:x-sasl-enc:x-sasl-enc; s=mesmtp; bh=VjD pIqK5eg4b5OXTLYupbQqBijM=; b=TyDz2N4gFcJ0ZfUx+j48zqYBX+2UbKNwgkH E1pRrJTPQOlFqXQxYLb1T3yxJ2Tg16hbJJ/MJuz3Z0BRs0Bntoxh7JNb8udvC/pi 98ME7dKnXn7R6i4v0g0KY8RXdhOrffR9/mxOdJQcEnTfABHU3GUaULHu+bX2faXc ucBlvamI= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d= messagingengine.com; h=content-type:date:from:message-id :mime-version:subject:to:x-me-sender:x-me-sender:x-sasl-enc :x-sasl-enc; s=smtpout; bh=VjDpIqK5eg4b5OXTLYupbQqBijM=; b=mfg5g yauWkIdrl6z3HxYWOvWFynBwrUw8dxqwOHBSc8hcdxgAu7ZHsviEKI+fBTNjLAlc 0lr6UNq0VFNkDLVpiM/0lK/3Bo16EntV669tcJSki1bSahl8zyKfJmkMJ4Tf4kAJ /yek/YNiqZiJ1XxqSCwSWVURIrZB+7qC3XOmkI= X-ME-Sender: X-Sasl-enc: ghb50jZQS8VlfQNCLjEwCLsFpg8uOZ7yNK6iFBKa1nAr 1482695654 Original-Received: from shorty.local (50-1-153-216.dsl.dynamic.fusionbroadband.com [50.1.153.216]) by mail.messagingengine.com (Postfix) with ESMTPA id F28917E59A for ; Sun, 25 Dec 2016 14:54:14 -0500 (EST) Original-Received: from dima by shorty.local with local (Exim 4.87) (envelope-from ) id 1cLEs1-0002nV-PR for bug-gnu-emacs@gnu.org; Sun, 25 Dec 2016 11:54:13 -0800 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6.x 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:127446 Archived-At: --=-=-= Content-Type: text/plain These patches come from http://lists.gnu.org/archive/html/emacs-devel/2016-11/msg00520.html There are two patches to fix some deficiencies in comint-insert-previous-argument: 1. a prefix argument to comint-insert-previous-argument inserts the INDEX-th argument, not just the last one. bash counts from the beginning of the argument list, but zsh counts from the end. A new variable is added to allow the user to choose the zsh behavior 2. comint-insert-previous-argument had logic to find trailing &, which was buggy and got confused if && was encountered. This logic is not present in bash or zsh, so it was removed, and the bug went away with it. --=-=-= Content-Type: text/x-diff Content-Disposition: inline; filename=0001-comint-insert-previous-argument-counts-args-from-the.patch >From 2d0c476fe02494837c6d0e035807e93dfd54677b Mon Sep 17 00:00:00 2001 From: Dima Kogan Date: Sun, 25 Dec 2016 11:35:26 -0800 Subject: [PATCH 1/2] comint-insert-previous-argument counts args from the start or from the end This function is invoked in shell-mode by the user, and is meant to emulate what M-. does in zsh and bash: it inserts an argument from a previous command. Without a prefix argument, it inserts the last arg from the previous command; with an argument INDEX, it inserts the INDEX-th argument. bash counds from the start, while zsh counts from the end. This patch adds a variable `comint-insert-previous-argument-from-end' that emulates the zsh behavior if non-nil. * lisp/comint.el (comint-arguments): can take in negative arguments to count from the end, same as indexing in python. (comint-insert-previous-argument): if comint-insert-previous-argument-from-end is non-nil, INDEX counts arguments from the end; if nil, from the beginning --- lisp/comint.el | 49 ++++++++++++++++++++++++++++++++++++------------- 1 file changed, 36 insertions(+), 13 deletions(-) diff --git a/lisp/comint.el b/lisp/comint.el index b9c65b0..171caef 100644 --- a/lisp/comint.el +++ b/lisp/comint.el @@ -1660,12 +1660,13 @@ comint-delim-arg (defun comint-arguments (string nth mth) "Return from STRING the NTH to MTH arguments. -NTH and/or MTH can be nil, which means the last argument. -Returned arguments are separated by single spaces. -We assume whitespace separates arguments, except within quotes -and except for a space or tab that immediately follows a backslash. -Also, a run of one or more of a single character -in `comint-delimiter-argument-list' is a separate argument. +NTH and/or MTH can be nil, which means the last argument. NTH +and MTH can be <0 to count from the end; -1 means last argument. +Returned arguments are separated by single spaces. We assume +whitespace separates arguments, except within quotes and except +for a space or tab that immediately follows a backslash. Also, a +run of one or more of a single character in +`comint-delimiter-argument-list' is a separate argument. Argument 0 is the command name." ;; The first line handles ordinary characters and backslash-sequences ;; (except with w32 msdos-like shells, where backslashes are valid). @@ -1687,7 +1688,7 @@ comint-arguments (count 0) beg str quotes) ;; Build a list of all the args until we have as many as we want. - (while (and (or (null mth) (<= count mth)) + (while (and (or (null mth) (< mth 0) (<= count mth)) (string-match argpart string pos)) ;; Apply the `literal' text property to backslash-escaped ;; characters, so that `comint-delim-arg' won't break them up. @@ -1714,8 +1715,14 @@ comint-arguments args (if quotes (cons str args) (nconc (comint-delim-arg str) args)))) (setq count (length args)) - (let ((n (or nth (1- count))) - (m (if mth (1- (- count mth)) 0))) + (let ((n (cond + ((null nth) (1- count)) + ((>= nth 0) nth) + (t (+ count nth)))) + (m (cond + ((null mth) 0) + ((>= mth 0) (1- (- count mth))) + (t (1- (- mth)))))) (mapconcat (function (lambda (a) a)) (nthcdr n (nreverse (nthcdr m args))) " ")))) @@ -2634,8 +2641,21 @@ comint-previous-prompt (defvar-local comint-insert-previous-argument-last-start-pos nil) (defvar-local comint-insert-previous-argument-last-index nil) -;; Needs fixing: -;; make comint-arguments understand negative indices as bash does +(defvar-local comint-insert-previous-argument-from-end nil + "If nil, the INDEX argument to +`comint-insert-previous-argument' refers to the INDEX-th +argument, counting from the beginning; if non-nil, counting from +the end. This exists to emulate the bahavior of `M-number M-.' +in bash and zsh: in bash, `number' counts from the +beginning (variable in nil), while in zsh it counts from the end. +This variable is buffer-local. To get the zsh behavior in `M-x +shell' sessions, do something like this: + + (add-hook + 'shell-mode-hook + (lambda () + (setq comint-insert-previous-argument-from-end t)))") + (defun comint-insert-previous-argument (index) "Insert the INDEXth argument from the previous Comint command-line at point. Spaces are added at beginning and/or end of the inserted string if @@ -2643,8 +2663,8 @@ comint-insert-previous-argument Interactively, if no prefix argument is given, the last argument is inserted. Repeated interactive invocations will cycle through the same argument from progressively earlier commands (using the value of INDEX specified -with the first command). -This command is like `M-.' in bash." +with the first command). Values of INDEX<0 count from the end, so INDEX=-1 +is the last argument. This command is like `M-.' in bash." (interactive "P") (unless (null index) (setq index (prefix-numeric-value index))) @@ -2654,6 +2674,9 @@ comint-insert-previous-argument (setq index comint-insert-previous-argument-last-index)) (t ;; This is a non-repeat invocation, so initialize state. + (when (and index + comint-insert-previous-argument-from-end) + (setq index (- index))) (setq comint-input-ring-index nil) (setq comint-insert-previous-argument-last-index index) (when (null comint-insert-previous-argument-last-start-pos) -- 2.10.1 --=-=-= Content-Type: text/x-diff Content-Disposition: inline; filename=0002-comint-insert-previous-argument-doesn-t-detect-and-i.patch >From 45de3e8dfa8a267c7af7732ef5fc6cb2c1606a66 Mon Sep 17 00:00:00 2001 From: Dima Kogan Date: Sun, 25 Dec 2016 11:49:44 -0800 Subject: [PATCH 2/2] comint-insert-previous-argument doesn't detect and ignore trailing & This function is invoked in shell-mode by the user, and is meant to emulate what M-. does in zsh and bash: it inserts an argument from a previous command. Neither zsh nor bash treat a trailing & specially: M-. simply inserts it if it is encountered. Emacs DID have extra logic to detect and discard trailing &, but this logic was buggy, and a && anywhere in the sequence would confuse it. This patch simply removes that logic to fix the bug and to emulate zsh and bash more closely * lisp/comint.el (comint-insert-previous-argument): don't detect and ignore trailing & --- lisp/comint.el | 3 --- 1 file changed, 3 deletions(-) diff --git a/lisp/comint.el b/lisp/comint.el index 171caef..83dbce0 100644 --- a/lisp/comint.el +++ b/lisp/comint.el @@ -2692,9 +2692,6 @@ comint-insert-previous-argument (set-marker comint-insert-previous-argument-last-start-pos (point)) ;; Insert the argument. (let ((input-string (comint-previous-input-string 0))) - (when (string-match "[ \t\n]*&" input-string) - ;; strip terminating '&' - (setq input-string (substring input-string 0 (match-beginning 0)))) (insert (comint-arguments input-string index index))) ;; Make next invocation return arg from previous input (setq comint-input-ring-index (1+ (or comint-input-ring-index 0))) -- 2.10.1 --=-=-=--