如何替换Emacs中的单词?

如何替换Emacs中的单词?,emacs,Emacs,给出以下句子: 这是一二三 当我将光标移动到1和2之间的空间时,我想用XXX替换2。 我知道在vi中有一种方法,这样我可以将两个标记为修改后的字符串,这样当我完成输入新字符串时,新字符串就会替换原来的两个字符串 //更新-1// vi中的相应命令是“cw”如果需要SPC,我可能只使用M-d SPC X X X,这取决于光标是直接放在一个之后还是两个之前,或者是M-f M-DEL X X X X,但这可能不是您想要的 好吧,你没有回答我的评论,也没有投票支持我的答案,所以我猜你可能会喜欢什么,下面

给出以下句子:

这是一二三

当我将光标移动到1和2之间的空间时,我想用XXX替换2。 我知道在vi中有一种方法,这样我可以将两个标记为修改后的字符串,这样当我完成输入新字符串时,新字符串就会替换原来的两个字符串

//更新-1//

vi中的相应命令是“cw”

如果需要SPC,我可能只使用M-d SPC X X X,这取决于光标是直接放在一个之后还是两个之前,或者是M-f M-DEL X X X X,但这可能不是您想要的

好吧,你没有回答我的评论,也没有投票支持我的答案,所以我猜你可能会喜欢什么,下面是一个小技巧:

(defun change-word (n)
  (interactive "p")
  (lexical-let ((old-window-configuration (current-window-configuration)))
    (clone-indirect-buffer "*edit-word*" t)
    (narrow-to-region (point) (save-excursion
                                (forward-word n)
                                (point)))
    (overwrite-mode 1)
    (local-set-key (kbd "C-c C-c")
                   (lambda ()
                     (interactive)
                     (widen)
                     (let ((end-of-edit (point)))
                       (kill-buffer)
                       (set-window-configuration old-window-configuration)
                       (goto-char end-of-edit))))))
调用M-x change word或将其绑定到您喜欢的键,编辑单词,完成后键入C-C-C。如果要编辑接下来的n个单词,请给它一个前缀参数,例如M-3 M-x change word,以更改接下来的三个单词。它不完全相同-您将在另一个缓冲区中编辑-但它很接近。试试看你是否喜欢它。这不是一个非常复杂的解决方案。也许最好的、也是最具emacs风格的方法是使用类似于isearch模式的东西,突出显示已更改的区域等等。请注意,由于词法let,您必须要求使用'cl'

另一种可能是这样的:

(defun change-word ()
  (interactive)
  (dotimes (i (- (save-excursion (end-of-thing 'word)) (point)))
    (insert (read-char))
    (delete-char 1)))
但这个例子只是一个非常粗糙的黑客-你甚至不能在编辑你的单词时导航。也许可以编写一些修改命令循环行为的东西,但我没有研究这个问题


我不知道有什么内置功能可以完全满足您的需求,但当然也有Viper和其他内置的Vi仿真模式。

专门针对重现vim的文字标记行为。然后只需在键入之前删除区域C-w。

将光标放在字母t之前,按M-@或C-M-Space选择单词2,然后键入XXX替换它。在我的Emacs中,M-@绑定到,而C-M-Space绑定到。我发现后者更容易输入,但前者更可能在各种模式下按预期工作

这些命令的好处在于,通过前面提到的键序列重复执行会以增量方式扩展选择。在您的情况下,第一次按M-@会突出显示两个:

这是一二三

再次按M-@也会突出显示三个选项:

这是一二三


在您的键盘上,这些示例中用M表示的元键可能绑定到Alt键。

根据您的描述,M-backspace似乎会删除“两个”,并让光标准备好输入替换项。

对于在这种情况下进行的全面文档编辑,您可能需要使用M-x删除选择模式。您只需选择第二个单词并开始键入即可。使用C-M-SPACE标记sexp进行选择。

我的解决方案的唯一区别是,您看到的单词被覆盖。这就是你想要的吗?可能的重复似乎没有简单的内部解决方案。现在,我只想使用alt+d删除单词并输入新单词。请注意,这样做会将删除的单词添加到kill ring中,这可能会很烦人。当然,您可以使用前缀参数mark word:M-3 M-@选择接下来的三个单词。