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


86

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

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

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

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

如何在命令行中编写命令,以便做到这一点?

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

Answers:


74

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

17
我很欣赏伟大的答案,但我可能会建议yiwbyw肌肉记忆的不仅是因为。在光标已经恰好位于单词第一个字符的情况下,您必须省略b,只需键入ywvs即可省略iin yiw。可能会发生事故,而
纠正

130

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

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

:help c_CTRL-R

28
yiwP

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

P:粘贴在光标之前。

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

:nmap < ALT >-D yiwP

4
问题特别是关于从Vim的命令行而不是从命令模式指定“光标下的单词”
Nathan Fellman 2014年

12

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

在常规模式下,输入单词时,键入

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

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

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

然后,您可以通过再次输入相同的内容或通过键入

*@:

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

您还可以使用以下q命令记录一个快速宏来执行此操作

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

然后通过键入将其重复到您的内心满意

@d

一句话过后,您想加倍。由于这仅比以前的解决方案少一个字符,因此对您来说可能不值得-除非您在两次加倍单词之间执行其他前命令,这将改变@:


1

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

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

1
ywPx

将按照您的描述进行。

ywPxw

还将光标移至下一个单词。


问题特别是关于从Vim的命令行而不是从命令模式指定“光标下的单词”
Nathan Fellman 2014年

请在命令中的每个字母处描述类似的答案。
Vitaly Zdanevich,

0

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

yiwP

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

例如。直发[t]前进---->直发[d]直发

[]是光标

详细说明...

您可能希望光标位于重复的单词之后:

yiwPea

straigh [t] forward ----> Directivestraightforward []

注意:

yiw

是内部字词(无空格)

yaw

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

yawPea

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

向前[t]前进---->简单明了[]


问题特别是关于从Vim的命令行而不是从命令模式指定“光标下的单词” 。
内森·费尔曼

1
您可以在命令模式下使用上述任何普通(命令模式)命令,只需在命令模式前加上:normal ...即可,例如,:normal yiwP与普通模式下的yiwP相同。当然,这是您要问的较慢的方法。
BBW在Windows

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

您能对此做些评论吗?
弥敦道·费尔曼

1
这使用命令的n标志来:substitute打印出光标下的单词在当前缓冲区中出现多少次。很聪明,但实际上不是这个问题的答案。
2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.