видалити слово після або навколо курсору у VIM


212

Зараз переходжу до VIMTextMate. Я вважав, що ^+Wв режимі INSERT дуже корисний. Однак я хотів би видалити не тільки слово перед курсором, але й слово після або навколо нього.

Я зробив якийсь гуглінг, але єдине, що я міг знайти, - ^+Wце видалити слово ПЕРЕД курсором.

Відповіді:


78

Що вам слід зробити, це створити зображення певної клавіші для серії команд; у цьому випадку команди перейдуть у звичайний режим, видалять поточне слово, а потім повернуть вас у вставку:

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

29
": h diw" для багатьох корисних штук!
Клокоп

12
Бонусні бонусні бали за використання <Co>. Він виконує одну команду в звичайному режимі і стрибає прямо назад в Insert, тому щось подібне 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)ніколи про це не думав!
Небо

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 полягає в тому, що більш продуктивно тримати руки в домашньому ряду. В кінці слова ^ w працює чудово, щоб швидко видалити слово. Якщо ви перейшли в режим вставки, ввели текст і скористалися клавішами зі стрілками в середині слова, яке ви суперечили філософії домашнього ряду.
Якщо ви перебуваєте в звичайному режимі і хочете змінити слово, ви можете просто скористатися c(змінити), а не d(видалити), якщо ви хочете повністю змінити слово, і знову ввести режим вставки, не натискаючи, iщоб повернутися до набору тексту.


42

Ви маєте на увазі, як?

dw

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

1
dwне видалить дефіс чи інші розділові знаки.
ccpizza

* Примітка. Це замінить буфер / останній вимикання. Це скоріше операція "Вирізати", а не лише "Видалити".
д.м.н. Мохуддін Ахмед

23

Щоб видалити всі символи між двома пробілами в звичайному режимі:

daW

Щоб видалити лише одне слово:

daw 

20

Схоже, немає вбудованого способу зробити це в режимі вставки, в чому полягало питання. Деякі з інших відповідей є правильними для звичайного режиму, а також вказують, що для додавання функціональності у режимі вставки можна створити спеціальне відображення.

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

Vim сильно відрізняється від ряду інших редакторів (включаючи TextMate) таким чином. Якщо ви використовуєте його продуктивно, ви, ймовірно, виявите, що не витрачаєте багато часу в режимі вставки.


1
Я використовую ^ wa lot, здебільшого, коли я ввожу помилку слова - замість того, щоб повертатися назад і додавати пропущену букву / тощо, я просто видаляю всю річ і починаю заново .. Перехід у звичайний режим просто для видалення одного слова здається марною Наприклад, кілька натискань клавіш. Наприклад, "example wrd [^ w] слово" - менше натискань клавіш, ніж "example wrd [^ c] [dw] [i] слово"
dbr

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

4
"Це не схоже на те, що існує спосіб ..." - ну безлічі способів це зробити - просто немає вбудованого способу, афаік. Хоча я повністю погоджуюся з твердженням Дана щодо режиму вставки проти звичайного режиму, ви, звичайно, можете просто визначити відображення режиму вставки, див. ": Help imap", що робить все, що ви хочете досягти, якщо вам дійсно потрібна функціональність у режимі вставки.
користувач55400

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, також працює в звичайному режимі.


Мені подобається ця відповідь краще лише тому, що вона працює і в звичайному режимі.
sivabudh

2

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


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.