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