Як вказати “слово під курсором” у командному рядку 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>- це слово під курсором (: довідка <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і просто введіть ywпроти, ви можете пропустити iin yiw. Можуть статися нещасні випадки, і виправлення помилки, безумовно, більше натискання клавіш :)
Jacob Swartwood

130

У режимі командного рядка CTRL+ R CTRL+ Wвставить слово під курсор.

Перегляньте довідку щодо c_CTRL-Rпереліку всіх інших спеціальних реєстрів:

:help c_CTRL-R

28
yiwP

yiw: Yank внутрішнє слово (слово під курсором). Ця команда також переміщує курсор на початок слова.

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

Потім ви можете зіставити eg: < ALT > - Dз цією командою:

:nmap < ALT >-D yiwP

4
Питання
стосувалося

12

Ще один простий спосіб зробити це - скористатися *командою.

У звичайному режимі надрукуйте слово

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

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

:s//виконує заміну, використовуючи поточний шаблон пошуку, а \0в розділі заміни знаходиться відповідний рядок.

Потім ви можете повторити цю поведінку, скажімо над словом "def", або набравши те ж саме знову, або набравши

*@:

@: просто повторює останню колишню команду, не потребуючи <Enter>, у цьому випадку заміни.

Ви також можете записати швидкий макрос, щоб зробити це за допомогою qкоманди

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

Потім повторіть це до душі, набравши текст

@d

коли над словом потрібно подвоїти. Оскільки це лише на один символ менше попереднього рішення, це може вам не вартувати - якщо ви не будете виконувати інші колишні команди між подвоєнням слів, що змінить поведінку@:


1

Вам потрібно уникнути зворотних скісних рисок у межах відображення. Ви також можете включити рядок заміщення до відображення.

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


0

@ user11211 має найпростіший спосіб дублювати слово під курсором:

yiwP

yank внутрішнє слово (переміщує курсор до початку слова), вставляє (перед курсором).

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

[] - курсор

Розробити ...

Можливо, ви хочете, щоб курсор слідував за вашим продубльованим словом:

yiwPea

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

ПРИМІТКА:

yiw

це внутрішнє слово yank (без пробілів)

yaw

це yank все слово (включаючи пробіли).

yawPea

Отже, це дублікат слова, включаючи пробіли та курсор позиції.

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


Питання стосувалося конкретно визначення "слова під курсором" із командного рядка Vim , а не з командного режиму.
Nathan Fellman

1
Ви можете використовувати будь-яку з нормальних (командного режиму) команд, наведених вище, у командному режимі, просто передуючи їм: normal ... наприклад,: normal yiwP буде робити те саме, що yiwP у звичайному режимі. Звичайно, це більш повільний спосіб зробити те, про що ви просили.
BBW до 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.