Как указать «слово под курсором» в командной строке VIM?

StackOverflow https://stackoverflow.com/questions/48642

  •  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>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top