Emacs:交换替换查询

4

使用query-replace命令后,迷你缓冲区会显示以下内容(已保存先前的参数):

Query replace (default FROM -> TO)

有没有一条命令可以交换参数?让它变成这样:
Query replace (default TO -> FROM)

我还没完成。例如,我重构了一些代码,写了更多的代码,现在只想把名称改回来。 - sam boosalis
4个回答

3
据我所知,没有现成的工具可以为您完成此操作。但是我认为您并不需要这个。
您需要做的就是使用“M-p”按键。使用它一次即可获取上次使用的“TO”内容。然后再按几次“M-p”即可获取上次使用的“FROM”内容。非常快速。
之后,您可以使用“C-x ESC ESC”(或“C-x M-:”或“C-x M-ESC”),可能跟随着“M-p”,以重复任一组合(“TO -> FROM”或“FROM -> TO”)。

1

有一个交换参数的快捷方式:M-p RET M-p M-p RET


1
(defun swap-query-replace-defaults ()
  "Swap the initial expressions offered by `query-replace'. "
  (interactive)
  (let* ((erg query-replace-defaults)
         (first (car erg))
         (second (cdr erg)))
    (setq query-replace-defaults (cons second first))
    (when (interactive-p) (message "%s" query-replace-defaults))
    query-replace-defaults))

做了一个功能请求:

http://lists.gnu.org/archive/html/bug-gnu-emacs/2013-10/msg00102.html


1
我使用这个:

;; Redefine `query-replace-read-from' to add a custom keymap when
;; replacing strings. Now, C-u ENTER does the reverse suggested
;; replacement.
(defvar query-replace-keymap
  (let ((map (make-sparse-keymap)))
    (set-keymap-parent map minibuffer-local-map)
    (define-key map [remap exit-minibuffer]
      (lambda ()
        (interactive)
        (if (and current-prefix-arg query-replace-defaults)
            (setq query-replace-defaults
                  (cons
                   (cdr query-replace-defaults)
                   (car query-replace-defaults))))
        (exit-minibuffer)))
    map))

(defun query-replace-read-from (prompt regexp-flag)
  "Query and return the `from' argument of a query-replace operation.
The return value can also be a pair (FROM . TO) indicating that the user
wants to replace FROM with TO."
  (if query-replace-interactive
      (car (if regexp-flag regexp-search-ring search-ring))
    (let* ((history-add-new-input nil)
           (query-replace-defaults query-replace-defaults)
           (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)))
              (format "%s: " prompt)))
           (from
            ;; The save-excursion here is in case the user marks and copies
            ;; a region in order to specify the minibuffer input.
            ;; 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-from-minibuffer
                 prompt nil query-replace-keymap 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)
                (query-replace-compile-replacement
                 (cdr query-replace-defaults) regexp-flag))
        (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
             (string-match "\\(\\`\\|[^\\]\\)\\(\\\\\\\\\\)*\\(\\\\[nt]\\)" from)
             (let ((match (match-string 3 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)))
        from))))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接