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

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

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

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

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

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

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

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

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

你可以把一个命令映射到它,或者这一系列的懒惰键击将工作:

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

然后,当你input你的模式时,你可以按下<control-r>0<enter> ,将你的命令粘贴到第0个寄存器的内容中。

你也可以像这样做一个命令:

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

它将同时映射'\'和'w'来replace你的命令行

 :s/\(<currentword>\)/ 

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

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

 :help c_CTRL-R 
 yiwP 

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

P :在光标之前粘贴。

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

 :nmap < ALT >-D yiwP 

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

在常规模式下,当input一个单词时,input

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

*使search模式成为当前字(例如\ <abc \>)。

:s//使用当前search模式进行replace,replace部分中的\0是匹配的string。

然后,您可以重复这个行为,通过再次input相同的单词,或者通过键入来重复单词“def”

 *@: 

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

你也可以使用q命令logging一个快速的macros

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

然后通过input重复它的内容

 @d 

当超过一个字你要加倍。 由于这只是比先前的解决schemeless一个字符,所以对你来说可能不值得 – 除非你会在单词加倍之间做其他的前命令,这会改变@:的行为@:

您需要在映射中转义反斜杠。 您也可以在映射中包含replacestring。

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

会做你所描述的。

 ywPxw 

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

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

 yiwP 

抽出内部字(将光标移动到字的开头),粘贴(在光标之前)。

例如。 直接前进—->直接战争[d]直截了当

[]是游标

详细说明…

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

 yiwPea 

直接前进—->直接前进[]

注意:

 yiw 

是内心的单词(没有空格)

 yaw 

被全部拉扯(包括尾随空格)。

 yawPea 

因此是包含空白的复制词,以及位置光标。

直接前进—->直截了当的直接[]

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