Могу ли я удалить всю строку, кроме разрыва строки?

33

Довольно распространенная для меня операция в vim, так как я навязчиво навязчив и не хочу, чтобы мои файлы были свободными от пробелов, состоит в удалении содержимого всей строки, но не самой строки (то есть не прерывания строки).

Есть ли встроенный способ vim сделать это? Возможно d<movement command>операция?

Пока что лучшее, что у меня есть (по рассматриваемой линии) 0d$. Есть ли более быстрый способ?

Эндрю Ферье
источник
2
В качестве альтернативы обрезке пробелов вручную вы можете использовать плагин, такой как vim-better-whitespace , который выделяет конечные пробелы, предоставляет команду для удаления всего этого сразу и даже может сделать это автоматически при сохранении.
Deltab
3
Даже без плагина, вы можете глобально удалить конечные пробелы, используя поиск и замену, например,:%s/\s*$//
Kyle Strand

Ответы:

34

Вы можете использовать 0Dэто, чтобы перейти к первому символу в строке и удалить до конца строки. Обратите внимание, что вы можете использовать, ^Dесли вы хотите оставить все предыдущие пробелы в покое. Кроме того, эти операции не могут быть повторены с помощью .. Если вы хотите выполнить операцию, которую можно повторить с помощью .команды, обратитесь к ответу Дэвида Лорда.

Разделы помощи:

  • :help 0
  • :help D
  • :help ^
Вечнозеленое дерево
источник
4
Хотя это прямое, прямое и (возможно) наименьшее количество нажатий клавиш, его нельзя повторить с помощью .команды. По этой причине, я думаю cc<Esc>или S<Esc>более привлекательным, если вы хотите повторить.
Tommcdo
Это правда. Тем не менее, вы можете записать его как макрос и повторить, используя ..
EvergreenTree
Как правило, макросы не могут быть повторены с .. Они работают так, как если бы эти комбинации клавиш вводились в интерактивном режиме, поэтому отдельные команды обрабатываются отдельно. Использование .повторит только последнюю команду в макросе.
Tommcdo
Я проверил это, и это не так, как это работает для меня. Если запись макроса, а затем использовать его @{reg}, вы можете повторить его .позже.
EvergreenTree
1
Вы просто повторяете последнюю команду макроса, которая есть D. После 0Dоперации ваш курсор останется в столбце 0. Если ваш курсор уже находится в начале строки (после перехода к другой), он будет выглядеть так, как будто макрос был правильно повторен. Попробуйте переместить курсор вперед в строке и наберите .- вы увидите, что он только повторяется D.
Tommcdo
20

cc <Esc>будет делать, как вы просите, но больше нажатий клавиш, чем 0D. Если вы хотите поместить что-то в эту строку впоследствии, ccможет быть лучше.

Дэвид Лорд
источник
2
Если вы включите Shift, это то же самое и, возможно, проще.
Holloway
4
Хотя это не самое «чистое» решение, у него есть одно преимущество: это ровно одно действие, и поэтому его можно повторить с помощью .команды. В отличие от 0D(как предлагается в выбранном ответе) два действия: 0движение и Dкоманда.
Tommcdo
@ Скорее всего, это проще, чем 0Dдля меня, так как я jkнанес на карту <Esc>в свой vimrc, так что мои руки даже не должны были выходить из домашнего ряда.
EvergreenTree
1
См. Ответ @Nobilis: Sзадокументировано как «Синоним cc»
Volker Siegel,
14

Sа затем Ctrl+Cили, Escкажется, выполняет ту же функцию.

Затем его можно повторить, .поскольку оно представляет собой одно действие.

Nobilis
источник
2
Я просто думал добавить это как ответ, а затем увидел ваш
sbell
7

0Dэто, вероятно, то, что вы хотите. Он будет удален от курсора до конца строки, оставляя строку (и любые символы перед курсором) на месте.

SupBrah
источник
Altho этот ответ Álmos один год, стоит отметить , что 0Dудалит с начала строки , а не с позиции курсора
FliiFe
4

Я обычно использую ddO. ddудалить текущую строку и O(это заглавная буква o) добавить новую строку.

Это также 3 нажатия клавиш, но ddсчитается только 1 с половиной, и я считаю, Oлегче набрать, чем $.

Он отличается от 0Dрешения тем, что выполняет автоиндентирование, например, с помощью этого кода (где !···находится вкладка и █ курсор:

def asd():
!···if foo:
!···!···foo()█
!···!···foobar()

0D оставит вас с:

def asd():
!···if foo:
█
!···!···foobar()

И ddOоставит вас с:

def asd():
!···if foo:
!···!···█
!···!···foobar()

И если вы нажмете <Esc>сразу после этого, Vim должен удалить авто-отступ, так что вы получите то же самое, что и с 0D.

Не существует «правильного» способа, это будет зависеть от того, что именно вы хотите сделать. Я предпочитаю, ddOпотому что это более гибко, и потому что это "в моих пальцах" :-)

Мартин Турной
источник
2
^Dоставит пробел в покое.
EvergreenTree
Так как Oоставляет вас в режиме вставки, это эквивалентно cc, кроме как без авто-отступа .... если ваша строка уже не была автоматически с отступом.
Кайл Стрэнд,
Это будет вести себя по-разному в последней строке файла.
Tommcdo
0

И чтобы сохранить этот драгоценный ход, который вы можете использовать, 0Cвы удалите все символы в текущей строке и переведете вас в режим вставки.

Влатко Шурлан
источник