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


86

Я хочу написать команду, которая определяет «слово под курсором» в VIM. Например, допустим, у меня есть курсор на слове, и я заставляю его появляться дважды. Например, если слово «abc» и я хочу «abcabc», я могу ввести:

:s/\(abc\)/\1\1/

Но тогда я хотел бы иметь возможность переместить курсор на «def» и использовать ту же команду, чтобы изменить его на «defdef»:

:s/\(def\)/\1\1/

Как я могу написать команду в командной строке, чтобы она выполняла это?

:s/\(*whatever is under the commandline*\)/\1\1

Ответы:


74

<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>\)/

17
Я ценю отличный ответ, но я бы, вероятно, посоветовал yiwзакончить bywтолько из-за мышечной памяти. В сценарии, когда ваш курсор уже оказывается на первом символе в слове, вы должны опустить bи просто ввести ywvs, вы можете опустить iin yiw. Могут произойти несчастные случаи, и исправление ошибки, безусловно,
требует большего количества нажатий

130

В режиме командной строки CTRL+ R CTRL+ Wвставит слово под курсором.

c_CTRL-RСписок всех других специальных регистров см. В справке :

:help c_CTRL-R

28
yiwP

yiw: Янкировать внутреннее слово (слово под курсором). Эта команда также перемещает курсор в начало слова.

P: Вставить перед курсором.

Затем вы можете сопоставить eg: < ALT > - Dэтой команде:

:nmap < ALT >-D yiwP

4
Вопрос касался конкретно указания «слова под курсором» из командной строки Vim, а не из командного режима
Натан Феллман

12

Другой простой способ сделать это - использовать *команду.

В обычном режиме над словом введите

*:s//\0\0<Enter>

* делает шаблон поиска текущим словом (например, \ <abc \>).

:s//выполняет подстановку с использованием текущего шаблона поиска, а \0в разделе замены находится соответствующая строка.

Затем вы можете повторить это поведение, произнеся над словом «def», набрав то же самое еще раз или набрав

*@:

@: просто повторяет последнюю команду ex без необходимости ввода <Enter>, в данном случае подстановки.

Вы также можете записать быстрый макрос, чтобы сделать это, используя qкоманду

qd*:s//\0\0<Enter>q

Затем повторите это сколько угодно, набрав

@d

когда над словом вы хотите удвоить. Поскольку это всего лишь на один символ меньше, чем в предыдущем решении, это может не стоить вам - если вы не будете выполнять другие бывшие команды между удвоением слов, что изменило бы поведение@:


1

Вам нужно избежать обратной косой черты в отображении. Вы также можете включить строку подстановки в сопоставление.

:nmap <leader>w :s/\\(<c-r>=expand("<cword>")<cr>\\)/\\1\\1<cr>

1
ywPx

сделаю то, что вы описываете.

ywPxw

также переместит курсор к следующему слову.


Вопрос касался конкретно указания «слова под курсором» из командной строки Vim, а не из командного режима
Натан Феллман

Опишите, пожалуйста, такие ответы, каждую букву в команде.
Виталий Зданевич

0

@ user11211 предлагает самый простой способ скопировать слово под курсором:

yiwP

скопировать внутреннее слово (перемещает курсор в начало слова), вставить (перед курсором).

например. прямо [т] вперед ----> прямолинейно [d] прямолинейно

[] - курсор

Чтобы уточнить ...

Вероятно, вы хотите, чтобы курсор следовал за вашим повторяющимся словом:

yiwPea

прямо [t] вперёд ----> прямопрямо []

НОТА:

yiw

внутреннее слово yank (без пробелов)

yaw

копирует все слова (включая конечные пробелы).

yawPea

следовательно, это повторяющееся слово, включая пробел и курсор позиции.

прямо [т] вперед ----> просто прямолинейно []


Вопрос конкретно касался указания «слова под курсором» из командной строки Vim , а не из командного режима.
Натан Феллман

1
Вы можете использовать любую из указанных выше обычных команд (командный режим) в командном режиме, просто поставив перед ними: normal ... например: normal yiwP будет делать то же самое, что и yiwP в нормальном режиме. Это, конечно, более медленный способ сделать то, о чем вы просили.
BBW Before Windows

-1
" count word  (case sensitive)
nmap <F4> :%s/\(<c-r>=expand("<cword>")<cr>\)//gn<cr>

не могли бы вы прокомментировать, что это делает?
Натан Феллман,

1
При этом используется nфлаг :substituteкоманды, чтобы распечатать, сколько раз слово под курсором появляется в текущем буфере. Довольно умно, но не совсем ответ на этот вопрос.
Джейкоб
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.