通过选择单词在Emacs中设置replace-string的默认值

时间:2013-09-28 22:35:54

标签: emacs replace

我正在使用这样的函数来替换Emacs中的字符串。

(defun replace-string-from-top ()
  (interactive)
  (save-excursion
    (beginning-of-buffer)
    (call-interactively 'replace-string)))
(global-set-key "\C-r" 'replace-string-from-top)

我想通过选择一个单词来使用replace-string函数的默认值。

我想做的是。

  1. 双击选择一个单词。
  2. 默认值使用所选单词调用replace-string-from-top函数。
  3. 我试过写这个功能,但我不能。

    我该怎么做?

2 个答案:

答案 0 :(得分:0)

当您以交互方式调用它时,replace-string和用于读取其args的函数query-replace-read-args都没有任何规定以动态方式以编程方式提供默认值。您可以做的最多是设置变量query-replace-defaults。您可以将该变量绑定到命令中的值,以便其列表值中的第一个元素是来自该区域的字符串,即:

 (let* ((region-string           (buffer-substring (region-beginning) (region-end))))
        (query-replace-defaults  (cons region-string region-string)))
   ...)

(值是一个缺点。使用你喜欢的任何其他值cdr。这里我只使用相同的区域字符串。)

但是,如果您使用库replace+.el,您可以更轻松,更直接地执行您想要的操作。在这种情况下,只需将选项search/replace-region-as-default-flag设置为非nil即可获得所需内容。您还可以使用命令toggle-search/replace-region-as-default随时切换该选项。该库的描述是here

答案 1 :(得分:0)

这是我的设置。如果需要,您可以在几个地方进行更改,例如添加beginning-of-buffer

(defvar qr-beg)

(defun string-dwim ()
  (let ((bounds
         (if (region-active-p)
             (cons (region-beginning)
                   (region-end))
           (ignore-errors
             (bounds-of-thing-at-point 'symbol)))))
    (setq qr-beg (car bounds))
    (when (region-active-p)
      (set-mark nil))
    (when qr-beg
      (kill-new
       (buffer-substring-no-properties
        qr-beg
        (cdr bounds))))))

(defun query-replace-dwim (from)
  (interactive
   (list
    (read-regexp "Query replace" (string-dwim))))
  (when qr-beg
    (goto-char qr-beg)
    (setq qr-beg))
  (query-replace
   from
   (query-replace-read-to from "Query replace" nil)))

如您所见,这是query-replace的设置。 它会自动建议要替换为当前字符串的东西。 当前字符串是当前区域(如果它处于活动状态)或符号处的点。 此外,当前字符串是kill-new ed,因此您可以将其作为替换, 然后稍微调整一下。