给出以下句子:
这是一两三。
当我将光标移动到一个和两个之间的空格时,我想将两个替换为XXX。 我知道在vi中有一种方法可以将两个标记为修改后的字符串,这样当我输入新字符串并且新字符串替换两个时 - 的地方。
// Update-1 //
vi中的相应命令是'cw'
答案 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'并让光标准备好输入替换。