Commit 2b513c3b authored by Juri Linkov's avatar Juri Linkov
Browse files

* lisp/replace.el: History for query replace pairs.

(query-replace-defaults): Promote to a list of cons cell.  Doc fix.
(query-replace-from-to-separator): New variable.
(query-replace-read-from): Let-bind query-replace-from-to-history
to a list of FROM-TO strings created from query-replace-defaults
and separated by query-replace-from-to-separator.  Use it as
the history while reading from the minibuffer.  Split the returned
string by the separator to get FROM and TO parts, and add them
to the history variables.
(query-replace-read-to): Add FROM-TO pairs to query-replace-defaults.
(query-replace-regexp-eval): Let-bind query-replace-defaults to nil.
http://lists.gnu.org/archive/html/emacs-devel/2014-11/msg00253.html

* lisp/isearch.el (isearch-text-char-description): Keep characters
intact and put formatted strings with the `display' property.
parent 3946aeb9
2014-11-07 Juri Linkov <juri@jurta.org>
* replace.el: History for query replace pairs.
(query-replace-defaults): Promote to a list of cons cell. Doc fix.
(query-replace-from-to-separator): New variable.
(query-replace-read-from): Let-bind query-replace-from-to-history
to a list of FROM-TO strings created from query-replace-defaults
and separated by query-replace-from-to-separator. Use it as
the history while reading from the minibuffer. Split the returned
string by the separator to get FROM and TO parts, and add them
to the history variables.
(query-replace-read-to): Add FROM-TO pairs to query-replace-defaults.
(query-replace-regexp-eval): Let-bind query-replace-defaults to nil.
http://lists.gnu.org/archive/html/emacs-devel/2014-11/msg00253.html
* isearch.el (isearch-text-char-description): Keep characters
intact and put formatted strings with the `display' property.
2014-11-07 Martin Rudalics <rudalics@gmx.at> 2014-11-07 Martin Rudalics <rudalics@gmx.at>
   
* cus-start.el (frame-resize-pixelwise): Fix group. * cus-start.el (frame-resize-pixelwise): Fix group.
......
...@@ -2873,8 +2873,12 @@ since they have special meaning in a regexp." ...@@ -2873,8 +2873,12 @@ since they have special meaning in a regexp."
(defun isearch-text-char-description (c) (defun isearch-text-char-description (c)
(cond (cond
((< c ?\s) (propertize (format "^%c" (+ c 64)) 'face 'escape-glyph)) ((< c ?\s) (propertize
((= c ?\^?) (propertize "^?" 'face 'escape-glyph)) (char-to-string c)
'display (propertize (format "^%c" (+ c 64)) 'face 'escape-glyph)))
((= c ?\^?) (propertize
(char-to-string c)
'display (propertize "^?" 'face 'escape-glyph)))
(t (char-to-string c)))) (t (char-to-string c))))
;; General function to unread characters or events. ;; General function to unread characters or events.
......
...@@ -56,8 +56,8 @@ See `query-replace-from-history-variable' and ...@@ -56,8 +56,8 @@ See `query-replace-from-history-variable' and
(defvar query-replace-defaults nil (defvar query-replace-defaults nil
"Default values of FROM-STRING and TO-STRING for `query-replace'. "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 This is a list of cons cells (FROM-STRING . TO-STRING), or nil
no default value.") if there are no default values.")
(defvar query-replace-interactive nil (defvar query-replace-interactive nil
"Non-nil means `query-replace' uses the last search string. "Non-nil means `query-replace' uses the last search string.
...@@ -67,6 +67,12 @@ That becomes the \"string to replace\".") ...@@ -67,6 +67,12 @@ That becomes the \"string to replace\".")
to the minibuffer that reads the string to replace, or invoke replacements 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") from Isearch by using a key sequence like `C-s C-s M-%'." "24.3")
(defvar query-replace-from-to-separator
(propertize "\0"
'display (propertize " \u2192 " 'face 'minibuffer-prompt)
'separator t)
"String that separates FROM and TO in the history of replacement pairs.")
(defcustom query-replace-from-history-variable 'query-replace-history (defcustom query-replace-from-history-variable 'query-replace-history
"History list to use for the FROM argument of `query-replace' commands. "History list to use for the FROM argument of `query-replace' commands.
The value of this variable should be a symbol; that symbol The value of this variable should be a symbol; that symbol
...@@ -132,11 +138,19 @@ wants to replace FROM with TO." ...@@ -132,11 +138,19 @@ wants to replace FROM with TO."
(if query-replace-interactive (if query-replace-interactive
(car (if regexp-flag regexp-search-ring search-ring)) (car (if regexp-flag regexp-search-ring search-ring))
(let* ((history-add-new-input nil) (let* ((history-add-new-input nil)
(query-replace-from-to-history
(append
(when query-replace-from-to-separator
(mapcar (lambda (from-to)
(concat (query-replace-descr (car from-to))
query-replace-from-to-separator
(query-replace-descr (cdr from-to))))
query-replace-defaults))
(symbol-value query-replace-from-history-variable)))
(minibuffer-allow-text-properties t) ; separator uses text-properties
(prompt (prompt
(if query-replace-defaults (if (and query-replace-defaults query-replace-from-to-separator)
(format "%s (default %s -> %s): " prompt (format "%s (default %s): " prompt (car query-replace-from-to-history))
(query-replace-descr (car query-replace-defaults))
(query-replace-descr (cdr query-replace-defaults)))
(format "%s: " prompt))) (format "%s: " prompt)))
(from (from
;; The save-excursion here is in case the user marks and copies ;; The save-excursion here is in case the user marks and copies
...@@ -144,26 +158,36 @@ wants to replace FROM with TO." ...@@ -144,26 +158,36 @@ wants to replace FROM with TO."
;; That should not clobber the region for the query-replace itself. ;; That should not clobber the region for the query-replace itself.
(save-excursion (save-excursion
(if regexp-flag (if regexp-flag
(read-regexp prompt nil query-replace-from-history-variable) (read-regexp prompt nil 'query-replace-from-to-history)
(read-from-minibuffer (read-from-minibuffer
prompt nil nil nil query-replace-from-history-variable prompt nil nil nil 'query-replace-from-to-history
(car (if regexp-flag regexp-search-ring search-ring)) t))))) (car (if regexp-flag regexp-search-ring search-ring)) t)))))
(if (and (zerop (length from)) query-replace-defaults) (if (and (zerop (length from)) query-replace-defaults)
(cons (car query-replace-defaults) (cons (caar query-replace-defaults)
(query-replace-compile-replacement (query-replace-compile-replacement
(cdr query-replace-defaults) regexp-flag)) (cdar query-replace-defaults) regexp-flag))
(add-to-history query-replace-from-history-variable from nil t) (let* ((to (if (and (string-match query-replace-from-to-separator from)
;; Warn if user types \n or \t, but don't reject the input. (get-text-property (match-beginning 0) 'separator from))
(and regexp-flag (query-replace-compile-replacement
(string-match "\\(\\`\\|[^\\]\\)\\(\\\\\\\\\\)*\\(\\\\[nt]\\)" from) (substring-no-properties from (match-end 0)) regexp-flag)))
(let ((match (match-string 3 from))) (from (if to (substring-no-properties from 0 (match-beginning 0))
(cond (substring-no-properties from))))
((string= match "\\n") (add-to-history query-replace-from-history-variable from nil t)
(message "Note: `\\n' here doesn't match a newline; to do that, type C-q C-j instead")) ;; Warn if user types \n or \t, but don't reject the input.
((string= match "\\t") (and regexp-flag
(message "Note: `\\t' here doesn't match a tab; to do that, just type TAB"))) (string-match "\\(\\`\\|[^\\]\\)\\(\\\\\\\\\\)*\\(\\\\[nt]\\)" from)
(sit-for 2))) (let ((match (match-string 3 from)))
from)))) (cond
((string= match "\\n")
(message "Note: `\\n' here doesn't match a newline; to do that, type C-q C-j instead"))
((string= match "\\t")
(message "Note: `\\t' here doesn't match a tab; to do that, just type TAB")))
(sit-for 2)))
(if (not to)
from
(add-to-history query-replace-to-history-variable to nil t)
(add-to-history 'query-replace-defaults (cons from to) nil t)
(cons from to)))))))
(defun query-replace-compile-replacement (to regexp-flag) (defun query-replace-compile-replacement (to regexp-flag)
"Maybe convert a regexp replacement TO to Lisp. "Maybe convert a regexp replacement TO to Lisp.
...@@ -216,7 +240,7 @@ the original string if not." ...@@ -216,7 +240,7 @@ the original string if not."
nil nil nil nil nil nil
query-replace-to-history-variable from t))) query-replace-to-history-variable from t)))
(add-to-history query-replace-to-history-variable to nil t) (add-to-history query-replace-to-history-variable to nil t)
(setq query-replace-defaults (cons from to)) (add-to-history 'query-replace-defaults (cons from to) nil t)
to)) to))
regexp-flag)) regexp-flag))
...@@ -421,7 +445,7 @@ for Lisp calls." "22.1")) ...@@ -421,7 +445,7 @@ for Lisp calls." "22.1"))
;; Let-bind the history var to disable the "foo -> bar" ;; Let-bind the history var to disable the "foo -> bar"
;; default. Maybe we shouldn't disable this default, but ;; default. Maybe we shouldn't disable this default, but
;; for now I'll leave it off. --Stef ;; for now I'll leave it off. --Stef
(let ((query-replace-to-history-variable nil)) (let ((query-replace-defaults nil))
(query-replace-read-from "Query replace regexp" t))) (query-replace-read-from "Query replace regexp" t)))
(to (list (read-from-minibuffer (to (list (read-from-minibuffer
(format "Query replace regexp %s with eval: " (format "Query replace regexp %s with eval: "
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment