如何替换Emacs中的单词?

q09*_*987 7 emacs

鉴于以下句子:

这是一两三.

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

// Update-1 //

vi中的相应命令是'cw'

dan*_*lei 7

我可能只是使用M-d SPC X X X(如果SPC是必要取决于羯羊光标后"一"字直接放置或之前"二")或M-f M-DEL 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))))))
Run Code Online (Sandbox Code Playgroud)

调用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)))
Run Code Online (Sandbox Code Playgroud)

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

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


seh*_*seh 5

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

这些命令的好处是重复执行(通过前面提到的按键序列)会逐渐扩展选择。在您的情况下,第一次按下M-@突出显示“两个”:

这是一个| 2三人。

再次按下M-@也会突出显示“三”:

这是一个| 二三

在您的键盘上,元键(在这些示例中由“M”表示)可能绑定到 Alt 键。