如何在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>