удалить слово после или вокруг курсора в VIM


212

Я сейчас переключаюсь VIMс TextMate. Я нашел ^+Wв режиме INSERT очень полезным. Однако я хотел бы удалить не только слово перед курсором, но и слово после или вокруг курсора.

Я немного погуглил, но единственное, что я могу найти, ^+Wэто удалить слово ДО курсора.

Ответы:


78

Что вы должны сделать, это создать imap определенного ключа для серии команд, в этом случае команды переведут вас в нормальный режим, удалят текущее слово и затем вернут обратно в insert:

:imap <C-d> <C-[>diwi

29
": h diw" для многих полезных текстов!
Клокоп

12
Бонусные бонусные баллы за использование <Co>. Он выполняет одну команду в обычном режиме и сразу переходит обратно во вставку, так что что-то вроде imap <C-d> <C-o>diwработает тоже. Это также не создает точку отмены, как это обычно делает <Esc>.
zelk

<Co> в режиме вставки сделал мой день :)
Lusk116

541

Нормальный режим:

daw : delete the word under the cursor    
caw : delete the word under the cursor and put you in insert mode 

125
Для меня полезно думать об этом как о гуле: удалить слово, а вере: изменить слово.
Welbornio

1
Бог я использовал da)и , ci)но никогда не думал об этом!
Sky

1
Это золото Джерри! ЗОЛОТО! Я отобразил этих детей в своем .vimrcфайле следующим образом: nmap <Leader>d daw иnmap <Leader>c caw
racl101

1
Вероятно, стоит упомянуть, что awэто один из примеров выбора объекта. Вы можете попробовать выбор объектов в визуальном режиме, чтобы увидеть, какой эффект они имеют: vimdoc.sourceforge.net/htmldoc/motion.html#object-select
crantok

103

Я думаю это просто daw

daw - delete a word

1
Я знаю, что aэто команда, Append text after the cursor [count] times.но как она dawработает?
синтагма

3
@REACHUS начальный символ dдиктует, что вы будете «удалять». «A» является своего рода параметром, определяющим, что удаление должно включать разделитель. Наконец, «w», другой, parameterесли вы захотите, указывает, что wordюнит будет удален.
vlad-ardelean

2
какая разница между dwа daw?
AK_

5
@AK_ Поздний ответ, но если вы находитесь в середине слова, dwудалится от курсора до конца слова, при dawэтом удалит все слово вместе с пробелом. diwудалит все слово, не касаясь пробелов вокруг него.
Дмитри

67

Нижеследующее работает для нормального режима: я согласен с ответом Дэна Олсона о том, что для большинства удалений вы, вероятно, должны быть в нормальном режиме. Более подробная информация ниже.

Если курсор находится внутри слова:
diwудалить в слове (без пробелов),
dawчтобы удалить вокруг слова (включает пробелы перед следующим словом).

Если курсор находится в начале слова, просто нажмите dw.

Это можно умножить, добавив обычные числа для движения, например, 2w для перемещения вперед на 2 слова, поэтому d2w удалит два слова.

Режим вставки ^ w
Идея использования hjkl для перемещения в Vim состоит в том, что более продуктивно держать руки на домашнем ряду. В конце слова ^ отлично работает, чтобы быстро удалить слово. Если вы перешли в режим вставки, ввели некоторый текст и с помощью клавиш со стрелками попали в середину слова, которое вы пошли против философии домашнего ряда.
Если вы находитесь в обычном режиме и хотите изменить слово, вы можете просто использовать c(изменить) вместо d(удалить), если вы хотите полностью изменить слово, и снова войти в режим вставки, не нажимая iдля возврата печатать.


42

Вы имеете в виду как?

dw

10
Поздно к вечеринке, но dw удалит из текущей позиции до конца слова, чтобы удалить все слово с начала, используйте diw или daw
Dvid Silva

1
dwне удалится через дефис или другую пунктуацию.
ccpizza

* Примечание: это перезапишет буфер / последний рывок. Это скорее операция «Вырезать», а не только «Удалить».
доктор медицинских наук Мохиуддин Ахмед

23

Чтобы удалить все символы между двумя пробелами, в обычном режиме:

daW

Чтобы удалить только одно слово:

daw 

20

Не похоже, что есть какой-то встроенный способ сделать это в режиме вставки, что было вопросом. Некоторые из других ответов верны для обычного режима, а также указывают на то, что можно создать пользовательское сопоставление для добавления функциональности в режиме вставки.

Честно говоря, вы, вероятно, должны сделать большую часть удаления в обычном режиме. ^ W неплохо знать, но я не уверен, что могу придумать ситуацию, в которой я бы предпочел сделать это, чем перейти в обычный режим и получить более мощные команды удаления в моем распоряжении.

В этом отношении Vim сильно отличается от ряда других редакторов (включая TextMate). Если вы используете его продуктивно, вы, вероятно, обнаружите, что не проводите много времени в режиме вставки.


1
Я использую ^ ва, в основном, когда я неправильно набираю слово - вместо того, чтобы вернуться назад и добавить пропущенную букву / и т. Д., Я просто удаляю все это и начинаю снова .. Переход в обычный режим, чтобы удалить только одно слово, кажется пустой тратой нескольких нажатий клавиш. Например, «пример wrd [^ w] word» меньше нажатий клавиш, чем «пример wrd [^ c] [dw] [i] word»
dbr

1
dbr: Он не просил выполнить основное поведение ^ W, которое поддерживает vim. Он просил удалить все слова в середине, находясь в режиме вставки, что является странной ситуацией для vim, и поэтому нет команды сделать это. Вы всегда можете привязать ^ Q к <Esc>, если вам действительно нужна функциональность. О, также [i] в ​​[^ c] [dw] [i] является избыточным, вы можете использовать [^ c] [ciw]
bfabry

4
«Не похоже, что есть способ ...» - ну, есть бесчисленное множество способов сделать это - просто нет встроенного способа, афаик. Хотя я полностью согласен с утверждением Дэна о режиме вставки и обычном режиме, вы, конечно, можете просто определить отображение режима вставки, см. «: Help imap», который делает все, что вы хотите достичь, если вам действительно нужна функциональность в режиме вставки.
user55400

13

Чтобы удалить все слово, на котором находится ваш курсор, используйте. diw
Чтобы удалить все слово, на котором находится ваш курсор, и чтобы перевести вас в режим вставки, используйте, ciw
если вы не хотите удалять все слово, но удаляете оттуда, где вы находитесь.dw/cw


8

Поскольку существует так много способов удалить слово, давайте проиллюстрируем их.

Предполагая, что вы редактируете:

foo-bar quux

и вызовите команду, когда курсор находится на панели «a» in:

foo-bquux  # dw:  letters then spaces right of cursor
foo-quux   # daw: letters on both sides of cursor then spaces on the right 
foo- quux  # diw: letters on both sides of cursor
foo-bquux  # dW:  non-whitespace then spaces right of cursor
quux       # daW: non-whitespace on both sides of cursor then spaces on the right
 quux      # diW: non-whitespace on both sides of cursor

5

В режиме вставки такой команды, к сожалению, нет. В VIM, чтобы удалить все слово под курсором, вы можете ввести viwdв НОРМАЛЬНОМ режиме. Что означает " V isual-block I nner W ord D elete". Используйте верхний регистр, Wчтобы включить знаки препинания.


3

Принятый ответ не удаётся при попытке повторить удаление слов, попробуйте следующее решение:

" delete current word, insert and normal modes
inoremap <C-BS> <C-O>b<C-O>dw
noremap <C-BS> bdw

Он отображает CTRL-BackSpace, также работает в обычном режиме.


Мне больше нравится этот ответ только потому, что он также работает в обычном режиме.
Сивабуд

2

Для удаления определенного количества символов перед курсором вы можете использовать X. Для удаления определенного количества слов после курсора вы можете использовать dw (можно удалить несколько слов, используя 3dw для 3 слов, например). Для удаления вокруг курсора в целом, вы можете использовать галку.


2

В старом vi bперемещает курсор в начало слова перед курсором, wперемещает курсор в начало слова после курсора, eперемещает курсор в конец слова после курсора иdw удаляет курсор из конца слова.

Если вы печатаете wbdw, вы удаляете слово вокруг курсора, даже если курсор находится в начале или в конце слова. Обратите внимание, что пробелы после слова считаются частью слова, которое нужно удалить.


2

Не совсем уверен, что вы используете "до" и "после", но вы пытались

dw

?

Изменить: Я думаю, вы ищете что-то для использования в режиме вставки. Как ни странно, в документах ничего не найдено, кажется, что ctrl-w - это все, что есть.


2

Я сделал два сопоставления, чтобы получить согласованность в режиме вставки и выхода из режима вставки.

:map <'Key of your choice'> caw

:imap <'Key of your choice'> <'Esc'> caw


0

Я хотел бы удалить не только слово перед курсором, но и слово после или вокруг курсора.

В этом случае решение, предложенное ОП (т.е. использующее <c-w>), может быть объединено с принятым ответом, чтобы дать:

inoremap <c-d> <c-o>daw<c-w>

альтернативно (более короткое решение):

inoremap <c-d> <c-o>vawobd

Пример ввода:

word1 word2 word3 word4
               ^------------- Cursor location

Вывод:

word1 word4
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.