如何替换Emacs中的单词?

时间:2011-08-15 01:24:11

标签: emacs

给出以下句子:

  

这是一两三。

当我将光标移动到一个两个之间的空格时,我想将两个替换为XXX。 我知道在vi中有一种方法可以将两个标记为修改后的字符串,这样当我输入新字符串并且新字符串替换两个时 - 的地方。

// Update-1 //

vi中的相应命令是'cw'

5 个答案:

答案 0 :(得分:7)

我可能只使用 Md SPC XXX (如果需要SPC取决于光标直接放在“一”之后或“二”之前)或 Mf M-DEL XXX ,但也许这不是你想要的。

好的,你没有回答我的评论,也没有对答案进行投票,所以我猜到你可能会喜欢什么,这里有点黑客攻击:

(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-c 。如果你想编辑下一个n个单词,请给它一个前缀参数(例如 M-3 M-x change-word 来改变接下来的三个单词)。它不完全相同 - 你将在另一个缓冲区编辑 - 但它接近。试试看你是否喜欢它。这不是一个非常复杂的解决方案。也许最好的,也是大多数emacs风格的方法,都有类似于isearch-mode的东西,它突出了变化的区域等等。请注意,由于(require 'cl),您必须lexical-let

另一种可能性是:

(defun change-word ()
  (interactive)
  (dotimes (i (- (save-excursion (end-of-thing 'word)) (point)))
    (insert (read-char))
    (delete-char 1)))

但是这个例子只是一个非常粗糙的黑客 - 你甚至无法在编辑单词时进行导航。也许有人可以写一些修改命令循环行为的东西,但我没有考虑过。

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

答案 1 :(得分:4)

将光标放在“两个”中的字母t之前,按 M - @ CM-Space 选择单词“two”,然后输入 XXX 来替换它。在我的Emacs中, M - @ 绑定到mark-word C-M-Space 绑定到mark-sexp。我发现后者更容易输入,但前者更有可能在各种模式下按预期工作。

关于这些命令的好处是重复执行(通过上述键序列)逐步扩展选择。在你的情况下,第一次按 M - @ 突出显示“两个”:

  

这是一个| 两个三个。

M - @ 再次突出显示“三个”:

  

这是一个| 两个三个

在键盘上,元键(在这些示例中用“M”表示)可以绑定到Alt键。

答案 2 :(得分:1)

following SO answer特别涉及复制vim的单词标记行为。然后,这只是在打字之前杀死该区域( C-w )的问题。

答案 3 :(得分:1)

对于像这样的多种情况下的全部文档编辑,您可能希望使用M-x delete-selection-mode。您只需选择第二个单词并开始输入即可。使用 C-M-SPACE (mark-sexp)进行选择。

答案 4 :(得分:0)

从你的描述中,听起来M-backspace会删除'two'并让光标准备好输入替换。