Удалить расширенную пробелом вкладку в Vim одним нажатием клавиши?

19

Я редактирую код Python с помощью Vim.

С tabключом я получаю четыре пробела для отступа. Как я могу удалить эти пробелы одним ударом «Backspace» (?) Вместо четырех?

Для этого должна быть какая-то опция "set" ...

Вот мой .vimrc:

set autoindent
set ts=4
set sw=4
set et
Евгений
источник

Ответы:

23

Вы можете использовать Ctrl+Dдля резервного копирования одной остановки табуляции. Это фактически перемещает всю строку влево на одну позицию табуляции; Ctrl+Tделает то же самое с правой стороны. Обратите внимание, что эти нажатия клавиш работают только в режиме вставки (используйте <<и >>для эквивалента в командном режиме).

Грег Хьюгилл
источник
30
set softtabstop=4
sf17k
источник
10
ИМО, это именно то, о чем просил ОП. Заслуживает больше голосов.
Людвиг Вайнцерль
2
Это правильный ответ.
Mk12
1
Не знал об этом, и это было именно то, что я искал. +1
NigoroJr
5

ТЛ; др: set tabstop=4 softtabstop=-1 shiftwidth=0 expandtab

короткая форма: set ts=4 sts=-1 sw=0 et

объяснение

Если вы установите softtabstop(или sts) на -1него, он будет автоматически вести себя так же, как tabstop( ts), что избавит вас от хлопот, если вы сильно измените вкладки. Параметр shiftwidth( sw) 0должен эффективно делать то же самое, tabstopчто и.

В деталях

shiftwidth sw

Количество пробелов для каждого шага (авто) отступа. Используется для cindent, >>, <<и т.д.
Когда нуль tabstopзначение будет использовано.

tabstop ts

Количество пробелов, которые в файле учитываются. Также см . : команда retab и softtabstopопция.

softtabstop sts

Количество пробелов, которые Tabучитываются при выполнении операций редактирования, таких как вставка Tabили использование BS. Такое ощущение, что Tabs вставляются, хотя на самом деле используется сочетание пробелов и s. Это полезно, чтобы сохранить tabsнастройку is в ее стандартном значении, в то же время имея возможность редактировать, как установлено sts. Когда stsотрицательно, используется значение shiftwidth. Это избавит вас от хлопот, если вы сильно меняете табуляции. Если expandtabне установлено, количество пробелов минимизируется с помощью Tabs.

expandtab et

В режиме вставки: используйте соответствующее количество пробелов для вставки. Пространства используются в абзацах с >и <команд , и когда autoindentвключен. Чтобы вставить реальную вкладку, когда expandtabона включена, используйте Ctrl- V Tab. Смотрите также : retab

Orwellophile
источник
Отлично, я использую vim в течение многих лет, но наследование sts / sw / ts никогда не бросалось в глаза.
Тимс
2

Я написал GreedyBackspace.vim для тех, кто хотел что-то подобное. Лично я не пользуюсь им, так что я давно его обновил. Я не получал сообщений об ошибках в последнее время, хотя.

Heptite
источник
1

Несколько вариантов:

  1. Вы можете «восстановить» все пробелы, чтобы они были заменены вкладками. Таким образом, они могут быть легко удалены.
  2. Вы могли бы (это не проверено, поэтому я просто предлагаю идеи здесь) сделать функцию, которая 'выполняет в нормальном режиме 4 раза клавишу возврата. Затем сопоставьте это с чем-то. Однако он не может знать, будут ли удаляться пробелы или некоторые важные символы, так что это потенциально небезопасно.
  3. «4X» удалит последние 4 символа (это большой X, а не маленький, маленький будет действовать как клавиша Del ».
ладья
источник
0

Самый простой способ <<, повторите с.

vimmer
источник
Привет и добро пожаловать в суперпользователя. Хотя я согласен с вашим ответом, будучи самим пользователем vi. Ваш ответ короткий, не объясняет, почему вы предлагаете то, что вы предлагаете, и почему вы не предлагаете то, что соответствует заданному вопросу.
Mogget
-1

Вы проверили, используя настройки расширенных вкладок в VIM?

:set noet

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

:%s/<ctrl+V><tab>/    /g
                  ----

В качестве небольшого бонуса, ваш исходный файл короче на 3 символа за вкладку :-)

Nik
источник
о, у меня есть et, потому что мне нужно расширять вкладки - я думаю - потому что код, который я редактирую, изначально был написан именно так. теперь я просто следую этому соглашению.
Евгений
Вы все еще можете делать то, что я говорю, и восстанавливать пробелы в конце (когда вам нужно вернуть файл в хранилище)
Ник
Может быть, у вас может быть функция vim, которая расширяет их до открытых вкладок и сворачивает до пробелов при закрытии? У кого-нибудь есть идеи?
sixtyfootersdude
Это действительно бесполезный ответ - он без необходимости заново открывает дебаты «tabs-vs-space», фактически не предоставляя никакой полезной информации.
Дитрих Эпп
-2

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

Дэвид Макинтош
источник
4
-1: недостаток фантазии.
sixtyfootersdude