我想要在VIM中编写一个命令,指定“光标下的单词”。例如,假设我把光标放在一个单词上并使其出现两次。例如,如果单词是“abc”,而我想要“abcabc”,那么我可以输入:
:s/\(abc\)/\1\1/
但是我希望能够将光标移动到“def”并使用相同的命令将其更改为“defdef”:
:s/\(def\)/\1\1/
我该如何在命令行中编写命令以实现这个功能?
:s/\(*whatever is under the commandline*\)/\1\1
我想要在VIM中编写一个命令,指定“光标下的单词”。例如,假设我把光标放在一个单词上并使其出现两次。例如,如果单词是“abc”,而我想要“abcabc”,那么我可以输入:
:s/\(abc\)/\1\1/
但是我希望能够将光标移动到“def”并使用相同的命令将其更改为“defdef”:
:s/\(def\)/\1\1/
我该如何在命令行中编写命令以实现这个功能?
:s/\(*whatever is under the commandline*\)/\1\1
在命令行模式下,CTRL+R CTRL+W 会插入光标下的单词。
查看 c_CTRL-R
的帮助以获取所有其他特殊寄存器的列表:
:help c_CTRL-R
<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>\)/
yiwP
yiw
: 复制光标下的单词(包括空格)。该命令还将光标移动到单词的开头。
P
: 在光标之前粘贴。
然后,您可以将例如:<ALT> - D
映射到此命令:
:nmap < ALT >-D yiwP
另一种简便的方法是使用 *
命令。
在常规模式下,当光标停留在一个单词上时,输入
*:s//\0\0<Enter>
*
将搜索模式设置为当前单词(例如 \<abc\>)。
:s//
使用当前搜索模式进行替换,替换部分中的 \0
代表匹配的字符串。
您可以通过再次键入相同内容或键入
*@:
@:
命令可以重复执行最近一次的 Ex 命令,无需按下 <Enter> 键,本例中指替换命令。
您还可以使用 q
命令记录一个快速宏来执行此操作。
@:
command can repeat the last executed Ex command without requiring an <Enter> key press, in this case, the substitution command.
You can also record a quick macro to perform this operation using the q
command.
qd*:s//\0\0<Enter>q
然后通过键入重复它,直到你满意为止
@d
当你想要复制一个单词时,在该单词上方运行以下命令。由于这比之前的解决方案只少一个字符,所以可能对您来说不值得 - 除非您将在单词复制之间执行其他ex命令,这将更改@:
的行为。
@user11211 有最直接的方法 可以复制光标下的单词:
yiwP
复制内部单词(将光标移动到单词开头),然后粘贴(在光标前)。
例如:straigh[t]forward ----> straightforwar[d]straightforward
[] 表示光标
详细说明如下:
您可能希望光标跟随您复制的单词:
yiwPea
直截了当 ----> 直截了当直截了当[]
注意:
yiw
是否复制内部单词(不包括空格)
yaw
删除所有单词(包括尾随的空格)。
yawPea
因此,包括空格和光标位置在内的重复单词。
straigh[t]forward ----> 直截了当的 straightforward[]
ywPx
会执行您所描述的操作。
ywPxw
同时也会将光标移至下一个单词。
您需要在映射中转义反斜杠。您还可以在映射中包含替换字符串。
:nmap <leader>w :s/\\(<c-r>=expand("<cword>")<cr>\\)/\\1\\1<cr>
" count word (case sensitive)
nmap <F4> :%s/\(<c-r>=expand("<cword>")<cr>\)//gn<cr>
n
标志来调用 :substitute
命令,以打印出光标下的单词在当前缓冲区中出现的次数。非常聪明,但实际上并不是这个问题的答案。 - Jacob
cnoremap
将一个键绑定到仅扩展<cword>
部分。我刚刚发现了这个答案,并将 <C-W> 绑定到<C-R>=expand("<cword>")<CR>
,这使得我可以输入例如:s/\(<C-W>\)/\1\1/
并为我插入 cword。 - aghast