我想在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

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

@用户11211 有最直接的方法 复制光标下的单词:

yiwP

复制内部单词(将光标移动到单词开头),粘贴(在光标之前)。

例如。直线[t]向前 ----> 直线[d]直线

[] 为光标

详细说明...

您可能想让光标跟随重复的单词:

yiwPea

直[t]向前 ----> 直接直向前[]

笔记:

yiw

是 yank 内部单词(没有空格)

yaw

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

yawPea

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

直[t]向前 ----> 直截了当直截了当[]

" count word  (case sensitive)
nmap <F4> :%s/\(<c-r>=expand("<cword>")<cr>\)//gn<cr>
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top