Как удалить содержимое назад до «=» в предыдущей строке?

9

Я использую пример кода JavaScript:

1        var a = 1;
2        var b = |{};

Курсор находится в позиции |(на символе "{", когда форма курсора является блоком), я обнаружил, что мне нужно aназначить объект, поэтому я хочу изменить его, как показано ниже:

1        var a = {};

Поэтому я хочу знать, когда курсор находится на «{», как быстро удалить все содержимое перед «{», пока не появится пробел после знака «=» в строке 1?

В других обычных редакторах я просто нажму клавишу Backspace, чтобы удалить код. Но я не знаю, как этого добиться в VIM.

Аарон Шен
источник
Вы также можете нажать iи использовать клавишу возврата. Никто не застрелит тебя за это. Я думаю.
elyashiv
1
но Backspace не удалит символ выше линии
Аарон Шен
3
@AaronShen Это зависит от настроек «возврата». Если она включает в себя eolто забой будет удалить разрывы строк. Вы также должны startбыть включены в настройку. (См. :help backspace) Не используйте этот метод, хотя! Есть несколько намного более быстрых методов, детализированных в ответах ниже.
Рич

Ответы:

20

Не уверен, что я полностью понимаю вопрос, но если вы хотите удалить, пока у вас есть только var a = {};, вы могли бы, с позиции курсора, использоватьd?1Enter

dпринимает движение, и вы можете дать ему шаблон поиска /для прямого поиска или ?для обратного поиска.

Вот маленький GIF, демонстрирующий это:

введите описание изображения здесь

Акшай
источник
1
Вероятно, стоит упомянуть, что вам нужно нажать Enterпосле ввода d?1.
Рич
@ Действительно, спасибо, я обновил ответ, чтобы включить это.
Акшай
1
Какой шрифт использует эта оболочка?
Крис Бурт-Браун
@ ChrisBurt-Brown: конечная остановка
акшай
10

Если вы используете vim (а не classic vi), то в вашем примере вы можете это сделать vkd(или vkx).

  • v переведет его в «визуальный» (выборочный) режим
  • k поднимется на одну строку, чтобы навести курсор на «1», выбрав часть, которую вы хотите удалить
  • dили xудалит выделение
BobH
источник
5

Удалить вверх

Для этого конкретного примера, dgkэто один из самых быстрых способов сделать это.

За dкомандой, как объяснил Акшай , может следовать движение, удаляющее все символы между тем, где начинается курсор, и тем местом, куда его приводит движение.

В вашем коде вы хотите удалить все, что находится между позицией курсора и тем же столбцом на одну строку дальше вверх, поэтому перемещение курсора вверх вместе с gkдвижением (которое при использовании с оператором не является линейным) достигнет вашей цели.

РЕДАКТИРОВАТЬ: BobH указывает в комментариях, что этот метод работает, только когда 'wrap'установлен. Таким образом, если у вас не всегда установлена ​​обтекание, вам, вероятно, лучше использовать dvkили vkd, как подсказывают другие ответы на этой странице.

Удалить слова назад

Вы также можете использовать: d5bили d4B, который удалит 5 слов или 4 слова назад, соответственно. ( 1;это одно СЛОВО, но два обычных слова).

Богатые
источник
почему dk полностью удалит как текущую, так и верхнюю строки
Аарон Шен,
@AaronShen Нет. Попробуй это.
Рич
1
@Rich, если это работает для вас, то у вас есть настройка, которая позволяет удалить движение. Я только что проверил его, vim -u NONE -U NONEи он удаляет обе строки.
Витор
@Vitor Ты прав. Попытка выяснить, какая настройка делает это сейчас.
Рич
1
КСТАТИ, оказывается, использование gkкак символически очевидно требует :set wrap(несколько загадочно). Я не мог понять, почему это, по-видимому, работает для всех остальных, но не для меня, когда помощь, gkпохоже, подразумевает, что она должна работать. Единственная подсказка заключалась в том, что основное значение gkимело отношение к обернутым линиям. Однажды я попытался установить обертывание (вроде по прихоти), вуаля, это сработало.
BobH
1

Я пока не могу комментировать, поэтому мне нужно сделать новый ответ. Ключи, d kданные Rich, не работают для меня даже при использовании опции nocompatible. Причиной может быть то, что kvim считает движение аналогичным образом, и в этом случае обе строки удаляются. От :help d:

Исключение для команды d {motion}: если движение не является линейным, начало и конец движения не находятся на одной и той же строке, и есть только пропуски до начала и после окончания движения, удаление становится построчной. Это означает, что при удалении также удаляется строка пробелов, которая может остаться. Используйте | o_v | оператор, чтобы заставить движение быть символическим

Это также показывает лекарство: используйте, dvkчтобы заставить движение быть характерным. Это делает трюк для меня.

Я не знал o_v раньше, так что вот :help o_v:

v

При использовании после оператора, перед командой движения: вынудите оператора работать символично, также, когда движение аналогично. Если движение было аналогичным, оно станет | эксклюзивным |. Если движение уже было посимвольным, включите / исключите. Это может быть использовано для создания эксклюзивного движения включительно и эксклюзивного движения

PhilippFrank
источник
«Несовместимым» была полная красная сельдь. Я запутался, когда тестировал, потому что я идиот.
Рич
Мы также можем использовать dgk, где gk также является эксклюзивным, а не аналогичным образом.
MS.Kim