1

我正在使用这样的函数来替换 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)

我想通过选择一个单词来使用替换字符串函数的默认值。

我想做的是。

  1. 通过双击选择一个单词。
  2. 默认情况下使用所选单词调用replace-string-from-top函数。

我试图编写函数,但我做不到。

我该怎么做?

4

2 回答 2

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. 这里我刚刚使用了相同的区域字符串。)

但是如果你使用 library ,你可以更轻松、更直接地做你想做的事replace+.el。在这种情况下,只需将选项设置search/replace-region-as-default-flag为 non-nil即可获得您想要的。您也可以随时使用 command 切换该选项toggle-search/replace-region-as-default。图书馆的描述是here

于 2013-09-29T04:03:45.657 回答
0

这是我的设置。如果需要,您可以在几个地方更改它,例如 add 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-newed,因此您可以将其拉出作为替换,然后稍微调整一下。

于 2013-09-29T11:30:32.770 回答