如何在VIM的命令行上指定“光标下的单词”?

时间:2008-09-07 18:17:14

标签: vim command-line

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

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

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

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

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

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

8 个答案:

答案 0 :(得分:113)

在命令行模式下, CTRL + R CTRL + W 会在光标。

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

:help c_CTRL-R

答案 1 :(得分:61)

<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>\)/

答案 2 :(得分:24)

yiwP

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

P:在光标前粘贴。

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

:nmap < ALT >-D yiwP

答案 3 :(得分:12)

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

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

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

*使搜索模式成为当前单词(例如\&lt; abc \&gt;)。

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

然后你可以重复这种行为,比如单词“def”,再次输入相同的内容,或者输入

*@:

@:只重复最后一个ex命令,而不需要&lt; Enter&gt;,在这种情况下是替换。

您还可以使用q命令

录制快速宏来执行此操作
qd*:s//\0\0<Enter>q

然后输入

重复一遍心灵内容
@d

当你想要翻倍的时候。因为这只比前一个解决方案少一个字符,所以对你来说可能不值得 - 除非你在双语之间做其他的前命令,这会改变@:的行为

答案 4 :(得分:1)

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

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

答案 5 :(得分:1)

ywPx

会做你所描述的。

ywPxw

也会将光标前进到下一个单词。

答案 6 :(得分:0)

@ user11211 has the most straightforward way复制光标下的字词:

yiwP

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

例如。 straigh [t] forward ----&gt; straightforwar [d]直截了当

[]是光标

详细说明......

您可能希望将光标放在重复的单词后面:

yiwPea
直播[t]前进----&gt; straightforwardstraightforward []

注:

yiw

是一个内在的词(没有空格)

yaw

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

yawPea
因此,

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

直播[t]前进----&gt;直截了当的直截了当[]

答案 7 :(得分:-1)

" count word  (case sensitive)
nmap <F4> :%s/\(<c-r>=expand("<cword>")<cr>\)//gn<cr>