95

我想在 VIM 中编写一个指定“光标下的单词”的命令。例如,假设我将光标放在一个单词上,然后让它出现两次。例如,如果单词是“abc”并且我想要“abcabc”,那么我可以输入:

:s/\(abc\)/\1\1/

但是我希望能够将光标移动到“def”并使用相同的命令将其更改为“defdef”:

:s/\(def\)/\1\1/

如何在命令行中编写命令以便它执行此操作?

:s/\(*whatever is under the commandline*\)/\1\1
4

8 回答 8

145

在命令行模式下,CTRL++将在R CTRL光标W下插入单词。

c_CTRL-R有关所有其他特殊寄存器的列表,请参阅帮助:

:help c_CTRL-R
于 2009-03-10T03:35:49.590 回答
77

<cword>是光标下的单词 (:help <cword>)。

对不起,我应该在这个答案中更完整。

您可以将命令映射到它,或者这一系列懒惰的击键将起作用:

b #go to beginning of current word
yw #yank to register

然后,当您输入您的模式时,您可以点击<control-r>0<enter>它将在您的命令中粘贴第 0 个寄存器的内容。

您还可以为此创建一个命令,例如:

:nmap <leader>w :s/\(<c-r>=expand("<cword>")<cr>\)/

这将映射同时击中'\'和'w'来替换你的命令行

:s/\(<currentword>\)/
于 2008-09-07T18:24:56.447 回答
30
yiwP

yiw: Yank 内词(光标下的词)。此命令还将光标移动到单词的开头。

P: 粘贴在光标前。

然后,您可以将 eg: 映射< ALT > - D到此命令:

:nmap < ALT >-D yiwP
于 2008-09-17T11:19:59.440 回答
15

另一种简单的方法是使用*命令。

在常规模式下,当超过一个单词时,键入

*:s//\0\0<Enter>

*使搜索模式成为当前单词(例如 \<abc\>)。

:s//使用当前搜索模式\0进行替换,替换部分是匹配的字符串。

然后,您可以重复此行为,通过再次键入相同的单词或键入单词“def”来说出

*@:

@:只是重复最后一个 ex 命令,不需要 <Enter>,在这种情况下是替换。

您还可以使用q命令录制快速宏来执行此操作

qd*:s//\0\0<Enter>q

然后通过键入重复它到您的心脏内容

@d

当你想要加倍的单词时。由于这仅比先前的解决方案少一个字符,因此对您来说可能不值得 - 除非您将在单词加倍之间执行其他前命令,这会改变@:

于 2008-09-17T11:25:19.413 回答
1

您需要转义映射中的反斜杠。您还可以在映射中包含替换字符串。

:nmap <leader>w :s/\\(<c-r>=expand("<cword>")<cr>\\)/\\1\\1<cr>
于 2008-09-16T20:01:51.910 回答
1
ywPx

会做你描述的。

ywPxw

也会将光标移动到下一个单词。

于 2008-09-17T07:03:16.983 回答
0

@ user11211 有最直接的方法来复制光标下的单词:

yiwP

拉动内部单词(将光标移动到单词的开头),粘贴(在光标之前)。

例如。直[t]向前 ----> 直[d]直

[] 是光标

详细说明...

您可能希望光标跟随重复的单词:

yiwPea

直[t]向前---->直截了当[]

笔记:

yiw

是 yank 内部单词(没有空格)

yaw

是 yank 所有单词(包括尾随空格)。

yawPea

因此是重复的单词,包括空格和位置光标。

直[t]向前---->直截了当[]

于 2014-12-09T00:45:06.467 回答
-1
" count word  (case sensitive)
nmap <F4> :%s/\(<c-r>=expand("<cword>")<cr>\)//gn<cr>
于 2009-05-15T14:42:05.697 回答