From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Juri Linkov Newsgroups: gmane.emacs.devel Subject: Re: History for query replace pairs Date: Wed, 05 Nov 2014 01:09:47 +0200 Organization: JURTA Message-ID: <87zjc6pnpg.fsf@mail.jurta.org> References: <87a97ejxuo.fsf@mail.jurta.org> <87lhovik5c.fsf@lifelogs.com> <87wq8egh3r.fsf@lifelogs.com> <87ppe4zv0t.fsf@mail.jurta.org> <87k34ba5sn.fsf@mail.jurta.org> <87siiq4gpv.fsf@mail.jurta.org> <87iojduj9n.fsf@mail.jurta.org> <87k33nyirh.fsf@mail.jurta.org> <87sii0becx.fsf@lifelogs.com> <87ioivx2xk.fsf@mail.jurta.org> <87h9yfaihq.fsf@lifelogs.com> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: text/plain X-Trace: ger.gmane.org 1415142668 18869 80.91.229.3 (4 Nov 2014 23:11:08 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Tue, 4 Nov 2014 23:11:08 +0000 (UTC) To: emacs-devel@gnu.org Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Wed Nov 05 00:11:02 2014 Return-path: Envelope-to: ged-emacs-devel@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 1XlnFb-0000tg-VH for ged-emacs-devel@m.gmane.org; Wed, 05 Nov 2014 00:11:00 +0100 Original-Received: from localhost ([::1]:43365 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XlnFb-0003eW-4y for ged-emacs-devel@m.gmane.org; Tue, 04 Nov 2014 18:10:59 -0500 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:38811) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XlnFG-0003bB-W1 for emacs-devel@gnu.org; Tue, 04 Nov 2014 18:10:45 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XlnFA-0005Ak-Nw for emacs-devel@gnu.org; Tue, 04 Nov 2014 18:10:38 -0500 Original-Received: from ps18281.dreamhost.com ([69.163.222.226]:48534 helo=ps18281.dreamhostps.com) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XlnFA-0005A6-Eh for emacs-devel@gnu.org; Tue, 04 Nov 2014 18:10:32 -0500 Original-Received: from localhost.jurta.org (ps18281.dreamhostps.com [69.163.222.226]) by ps18281.dreamhostps.com (Postfix) with ESMTP id 912A2315FBEB76 for ; Tue, 4 Nov 2014 15:10:31 -0800 (PST) In-Reply-To: <87h9yfaihq.fsf@lifelogs.com> (Ted Zlatanov's message of "Mon, 03 Nov 2014 19:59:13 -0500") User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3.50 (x86_64-pc-linux-gnu) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 69.163.222.226 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:176362 Archived-At: > I'd rather use M-p as the default because the new behavior is IMO much > better. But it's really no big deal, we can switch it later. > > JL> Maybe this choice should be customizable? > > OK with me, and probably most Emacs-like :) Then a new customizable variable `query-replace-from-to-defaults' could define whether to show previous replacement pairs as defaults available via M-n, or via M-p if nil: === modified file 'lisp/replace.el' --- lisp/replace.el 2014-08-25 02:36:45 +0000 +++ lisp/replace.el 2014-11-04 23:04:55 +0000 @@ -54,10 +54,10 @@ (defvar query-replace-history nil See `query-replace-from-history-variable' and `query-replace-to-history-variable'.") -(defvar query-replace-defaults nil +(defvar query-replace-from-to-history nil "Default values of FROM-STRING and TO-STRING for `query-replace'. -This is a cons cell (FROM-STRING . TO-STRING), or nil if there is -no default value.") +This is a list of cons cells (FROM-STRING . TO-STRING), +or nil if there is no default values.") (defvar query-replace-interactive nil "Non-nil means `query-replace' uses the last search string. @@ -67,6 +67,19 @@ (make-obsolete-variable 'query-replace-i to the minibuffer that reads the string to replace, or invoke replacements from Isearch by using a key sequence like `C-s C-s M-%'." "24.3") +(defcustom query-replace-from-to-defaults nil + "Non-nil means a list of replacement pairs is available by M-n instead of M-p." + :group 'matching + :type 'boolean + :version "24.5") + +(defvar query-replace-from-to-separator + (propertize + "\0" 'display (propertize + (if (char-displayable-p ?\u2192) " \u2192 " " -> ") + 'face 'minibuffer-prompt)) + "String that separates FROM and TO in the default replacements.") + (defcustom query-replace-from-history-variable 'query-replace-history "History list to use for the FROM argument of `query-replace' commands. The value of this variable should be a symbol; that symbol @@ -132,11 +145,14 @@ (defun query-replace-read-from (prompt r (if query-replace-interactive (car (if regexp-flag regexp-search-ring search-ring)) (let* ((history-add-new-input nil) + (from-to-history (mapcar (lambda (from-to) + (concat (query-replace-descr (car from-to)) + query-replace-from-to-separator + (query-replace-descr (cdr from-to)))) + query-replace-from-to-history)) (prompt - (if query-replace-defaults - (format "%s (default %s -> %s): " prompt - (query-replace-descr (car query-replace-defaults)) - (query-replace-descr (cdr query-replace-defaults))) + (if from-to-history + (format "%s (default %s): " prompt (car from-to-history)) (format "%s: " prompt))) (from ;; The save-excursion here is in case the user marks and copies @@ -144,14 +160,29 @@ (defun query-replace-read-from (prompt r ;; That should not clobber the region for the query-replace itself. (save-excursion (if regexp-flag - (read-regexp prompt nil query-replace-from-history-variable) + (read-regexp prompt + (if query-replace-from-to-defaults + from-to-history) + (if query-replace-from-to-defaults + query-replace-from-history-variable + 'from-to-history)) (read-from-minibuffer - prompt nil nil nil query-replace-from-history-variable - (car (if regexp-flag regexp-search-ring search-ring)) t))))) - (if (and (zerop (length from)) query-replace-defaults) - (cons (car query-replace-defaults) + prompt nil nil nil + (if query-replace-from-to-defaults + query-replace-from-history-variable + 'from-to-history) + (if query-replace-from-to-defaults + from-to-history + (car (if regexp-flag regexp-search-ring search-ring))) + t))))) + (if (and (zerop (length from)) query-replace-from-to-history) + (cons (caar query-replace-from-to-history) + (query-replace-compile-replacement + (cdar query-replace-from-to-history) regexp-flag)) + (let* ((to (if (string-match query-replace-from-to-separator from) (query-replace-compile-replacement - (cdr query-replace-defaults) regexp-flag)) + (substring from (match-end 0)) regexp-flag))) + (from (if to (substring from 0 (match-beginning 0)) from))) (add-to-history query-replace-from-history-variable from nil t) ;; Warn if user types \n or \t, but don't reject the input. (and regexp-flag @@ -163,7 +194,11 @@ (defun query-replace-read-from (prompt r ((string= match "\\t") (message "Note: `\\t' here doesn't match a tab; to do that, just type TAB"))) (sit-for 2))) - from)))) + (if (not to) + from + (add-to-history query-replace-to-history-variable to nil t) + (push (cons from to) query-replace-from-to-history) + (cons from to))))))) (defun query-replace-compile-replacement (to regexp-flag) "Maybe convert a regexp replacement TO to Lisp. @@ -216,7 +251,7 @@ (defun query-replace-read-to (from promp nil nil nil query-replace-to-history-variable from t))) (add-to-history query-replace-to-history-variable to nil t) - (setq query-replace-defaults (cons from to)) + (push (cons from to) query-replace-from-to-history) to)) regexp-flag))