如何在Emacs中替换光标下的当前单词


25

如何替换Emacs中光标下的当前单词?

我知道我可以使用query-replace或replace-string,但是每次这样做都必须键入要替换的整个字符串,这很烦人。

Vi具有等效的命令cword,我可以使用快捷方式将其拖到光标下方进行替换:

nmap <leader>z :%s#\<<C-r>=expand("<cword>")<CR>\>#

有人知道如何使用Emacs吗?


Answers:


2

使用复制粘贴:M-d C-_ M-x replace-string RET C-ykill-wordundoreplace-stringyank)。如果您已经开始替换,则可以切换回原始缓冲区,以使用通常的窗口或缓冲区切换命令执行复制粘贴M-x replace-string RET … C-x o M-d C-_ C-x o C-y。您可以在M-d(例如ESC 4 2 M-d)上使用前缀参数来替换多个单词。

如果您打算替换光标处的一个或多个单词,则可以从增量搜索(C-sC-w开始,使用开始搜索光标下方的单词,然后按M-%切换到replace-string


26

增量搜索具有此功能,但替换功能则没有。幸运的是,一旦您选择了搜索词,增量搜索确实可以切换到替换模式。所以:

  • C-s切换到增量搜索模式
  • 按下C-w可将当前单词拉到搜索缓冲区中,您可以持续按下它以追加多个单词,也可用C-M-y来拉单个字符并拉C-y整行
  • 按下M-%以使用您已经构造的搜索缓冲区切换到替换模式

M-%正常使用中您可能已经知道,这是一种查询替换模式,在该模式下,您会提示您对每个匹配项进行处理。如果您只想更换它们,请打!第一场比赛


9
;; query-replace current word
(defun qrc (replace-str)
   (interactive "sDo query-replace current word with: ")
   (forward-word)
   (let ((end (point)))
      (backward-word)
      (kill-ring-save (point) end)
      (query-replace (current-kill 0) replace-str) ))

1
该解决方案效果很好,并且比被告知如何手动执行更有用。我太懒了,不会被复制粘贴所困扰。
Paul Coccoli 2015年

2

我对emacs绝对陌生,但我可以建议以下内容:

M-b       to move backward over a word
M-d       to kill up to the end of the word

现在您可以写一个新单词。就像cw在vim中一样工作


1

如果M-S-%仅通过按一下就可以进行搜索和替换M-n,则将其填入光标下的单词,然后再次按将其包装在“符号定界符”中。


1

从Vim迁移到Emacs以来,我一直在挣扎并想要同样的东西。

经过一些研究和实验,我得出了下面的功能,该功能使您可以在安装Evil软件包或使用spacemacs的情况下执行相同的操作。

它也可以与活动区域(或vim术语中的可视选择)一起使用,并且对于替换abc-def-hij这样的单词可能非常有用:

; replace current word or selection using vim style for evil mode
(defun evil-replace-word-selection()
(interactive)
(if (use-region-p)
    (let (
            (selection (buffer-substring-no-properties (region-beginning) (region-end))))
        (if (= (length selection) 0)
        (message "empty string")
        (evil-ex (concat "'<,'>s/" selection "/"))
        ))
    (evil-ex (concat "%s/" (thing-at-point 'word) "/"))))

然后在init.el中定义相同的键绑定:

(global-set-key (kbd "\C-co") 'evil-replace-word-selection)

键盘绑定与vim的“空间z”略有不同,但是当邪恶模式存在时,我还没有弄清楚如何在emacs中映射它。一直抱怨不是前缀等,我对emacs还是比较陌生。但是还算不错,我现在对此解决方案感到满意。


0

这已经得到回答,我无法发表评论,因为我还没有足够的声誉。但是您要寻找的是ciwvim。

在emacs中,最接近的就是这种组合:

M-b M-d

这将返回到光标所在单词的开头,然后删除该单词。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.