удалить слово после или вокруг курсора в 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.