Как указать «слово под курсором» в командной строке VIM?
-
09-06-2019 - |
Вопрос
Я хочу написать команду, которая указывает «слово под курсором» в 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>\)/
Другие советы
В режиме командной строки CTRL+р CTRL+Вт вставит слово под курсором.
См. справку по 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
это внутреннее слово (без пробелов)
yaw
скопировать все слово (включая конечные пробелы).
yawPea
следовательно, это повторяющееся слово, включая пробелы и положение курсора.
прямо[t]вперед ----> прямо прямо[]
" count word (case sensitive)
nmap <F4> :%s/\(<c-r>=expand("<cword>")<cr>\)//gn<cr>