题
我想在VIM中编写一个指定“光标下的单词”的命令。例如,假设我将光标放在一个单词上,并且让它出现两次。例如,如果单词是“abc”而我想要“abcabc”,那么我可以输入:
: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
然后,当您输入模式时,您可以点击 <control-r>0<enter>
这会将第 0 个寄存器的内容粘贴到您的命令中。
您还可以为此创建一个命令,例如:
:nmap <leader>w :s/\(<c-r>=expand("<cword>")<cr>\)/
这将映射同时点击“\”和“w”以替换您的命令行
:s/\(<currentword>\)/
其他提示
在命令行模式下, 控制键+右 控制键+瓦 将在光标下插入单词。
请参阅帮助 c_CTRL-R
所有其他特殊寄存器的列表:
:help c_CTRL-R
yiwP
yiw
: :猛拉内部单词(光标下的单词)。此命令还将光标移动到单词的开头。
P
: :粘贴到光标前。
然后您可以映射例如: < ALT > - D
对于这个命令:
:nmap < ALT >-D yiwP
另一种简单的方法是使用 *
命令。
在常规模式下,当超过一个单词时,输入
*:s//\0\0<Enter>
*
使搜索模式成为当前单词(例如\<abc\>)。
:s//
使用当前搜索模式进行替换,并且 \0
在替换部分中是匹配的字符串。
然后,您可以重复此行为,通过再次输入相同的内容或输入单词“def”来重复此行为
*@:
@:
只是重复最后一个 ex 命令,不需要 <Enter>,在本例中是替换。
您还可以使用以下命令录制一个快速宏来执行此操作 q
命令
qd*:s//\0\0<Enter>q
然后通过键入来重复它
@d
当超过一个单词时你想加倍。由于这仅比之前的解决方案少了一个字符,因此对您来说可能不值得 - 除非您将在单词加倍之间执行其他前命令,这会改变 @:
您需要转义映射中的反斜杠。您还可以在映射中包含替换字符串。
:nmap <leader>w :s/\\(<c-r>=expand("<cword>")<cr>\\)/\\1\\1<cr>
ywPx
会做你所描述的事情。
ywPxw
还将光标移至下一个单词。
" count word (case sensitive)
nmap <F4> :%s/\(<c-r>=expand("<cword>")<cr>\)//gn<cr>