通过选择一个单词,在Emacs中设置替换字符串的默认值

通过选择一个单词,在Emacs中设置替换字符串的默认值,emacs,replace,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函数的默认值 我想做的是 通

我使用这样的函数来替换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函数。 我试过写这个函数,但是写不出来

如何操作?

无论是替换字符串还是交互调用时用于读取其参数的函数(即query replace read args),都没有以动态方式以编程方式提供默认值的规定。您最多只能设置变量查询替换默认值。您可以将该变量绑定到命令中的值,以便其列表值中的第一个元素是区域中的字符串,即:

 (let* ((region-string           (buffer-substring (region-beginning) (region-end))))
        (query-replace-defaults  (cons region-string region-string)))
   ...)
该值是一个cons。使用您喜欢的任何其他值作为cdr。这里我刚刚使用了相同的区域字符串


但若你们使用这个库,你们可以更容易、更直接地做你们想做的事情。在这种情况下,只需将选项search/replace region作为默认标志设置为non-nil即可获得所需的内容。您也可以随时切换该选项,使用命令toggle search/replace region作为默认值。该库的描述如下。

这是我的设置。若需要,可以在一些地方更改它,比如添加缓冲区的开头

(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)))
如您所见,这是查询替换的设置。 它自动建议将要替换的对象作为当前字符串。 当前字符串可以是当前区域(如果它处于活动状态),也可以是点处的符号。 另外,当前字符串是kill newed,因此您可以将其作为替换,
然后稍微调整一下。

谢谢你的提示!我将使用replace+.el',但这并不像我预期的那样有效。安装后,我在init文件中输入require'replace+setq search/replace region作为默认标志t`并对其求值,然后选择一个单词并调用函数query-replace-w-option,但默认值为空。我做错了什么?空是什么意思?默认情况下,微缓冲区中没有任何内容-这将是初始值,而不是默认值。要获得默认值,您可以像在Emacs中一样使用M-n。如果在使用M-n后没有在minibuffer中获取所选文本,那么这是一个错误-请告诉我。我误解了“初始值”和“默认值”这两个词。我想要的是在不输入M-n的情况下设置初始值。我用这个词的首字母搜索过,但找不到任何信息。如何设置初始值?Emacs Dev不鼓励使用初始值。但是,在query replace read from的replace+.el定义中,您可以使用default而不是nil替换第5个参数以完成读取,以及第2个参数以从minibuffer读取,以获得所需的效果。或者,您可以使用并自定义选项icicle default value,使默认值始终用作初始值,即插入到迷你缓冲区中。例如,我自己做的。谢谢你的建议!我花了30分钟才用上冰柱,但没用。我已经从这里进行了git克隆并加载它,然后将我的init文件require'iciclessetq icicle default value t setq ICICCLE default置于提示符格式函数t中。我正在读一个维基页面EmacsWiki:冰柱-定制和一般提示