我正在使用这样的函数来替换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函数的默认值。
我想做的是。
replace-string-from-top
函数。我试过写这个功能,但我不能。
我该怎么做?
答案 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,因此您可以将其作为替换,
然后稍微调整一下。