Вкладки и пробелы в vim

Как предотвратить vim от замены пробелов вкладками при включенном аутоиндикале?

Пример: если у меня есть две вкладки и 7 пробелов в начале строки и tabstop=3, и я нажимаю Enter, следующая строка имеет четыре вкладки и 1 пробел в начале, но я не хочу что...

Ответ 1

Возможно, неплохо вообще не использовать вкладки.

:set expandtab

Если вы хотите заменить все вкладки в своем файле на 3 пробела (что будет выглядеть примерно как tabstop=3):

:%s/^I/   /

(где ^I - символ TAB)

Из онлайн-справки VIM:

'tabstop' 'ts'      number  (default 8)
        local to buffer
Number of spaces that a <Tab> in the file counts for.  Also see
|:retab| command, and 'softtabstop' option.

Note: Setting 'tabstop' to any other value than 8 can make your file
appear wrong in many places (e.g., when printing it).

There are four main ways to use tabs in Vim:
1. Always keep 'tabstop' at 8, set 'softtabstop' and 'shiftwidth' to 4
   (or 3 or whatever you prefer) and use 'noexpandtab'.  Then Vim
   will use a mix of tabs and spaces, but typing <Tab> and <BS> will
   behave like a tab appears every 4 (or 3) characters.
2. Set 'tabstop' and 'shiftwidth' to whatever you prefer and use
   'expandtab'.  This way you will always insert spaces.  The
   formatting will never be messed up when 'tabstop' is changed.
3. Set 'tabstop' and 'shiftwidth' to whatever you prefer and use a
   |modeline| to set these values when editing the file again.  Only
   works when using Vim to edit the file.
4. Always set 'tabstop' and 'shiftwidth' to the same value, and
   'noexpandtab'.  This should then work (for initial indents only)
   for any tabstop setting that people use.  It might be nice to have
   tabs after the first non-blank inserted as spaces if you do this
   though.  Otherwise aligned comments will be wrong when 'tabstop' is
   changed.

Ответ 2

все, что я хочу, это автоиндексированная строка, имеющая точно такие же символы отступа, как предыдущая строка.

:help copyindent

'copyindent' 'ci' boolean (по умолчанию выключено); локальный буфер; {не в Vi}

Скопируйте структуру существующего отступа строки при автообновлении новая линия. Обычно новый отступ восстанавливается серией вкладки, за которыми следуют пробелы (если 'expandtab' не включен, в этом случае используются только пробелы). Включение этой опции делает новая строка копирует любые символы, используемые для отступов на существующая линия. Если новый отступ больше, чем на существующем строка, оставшееся пространство заполняется обычным образом.

ПРИМЕЧАНИЕ: 'copyindent' является reset, когда 'compatible'. Также см. 'preserveindent'.

:help preserveindent

'preserveindent' 'pi' boolean (по умолчанию выключено); локальный буфер; {не в Vi}

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

ПРИМЕЧАНИЕ. При использовании " → " несколько раз полученный отступ представляет собой смесь вкладки и пробелы. Возможно, вам это не понравится. ПРИМЕЧАНИЕ: 'preserveindent' есть reset, когда 'compatible'. Также см. 'copyindent'.
Используйте: retab для очистки пробела.

Ответ 3

Вы можете преобразовать все TAB в SPACE

:set et
:ret!

или преобразовать все SPACE в TAB

:set et!
:ret!

Ответ 4

Здесь часть моего .vimrc:

set autoindent
set expandtab
set softtabstop=4
set shiftwidth=4

Это хорошо работает для меня, потому что мне абсолютно не нужны вкладки в моем исходном коде. Кажется, из вашего вопроса, что вы хотите сохранить две вкладки и семь пробелов на следующей строке, и я не уверен, что есть способ научить vim учитывать этот стиль.

Ответ 5

Может быть, нижняя часть этого может вам помочь?

Стандарт vi интерпретирует ключ табуляции буквально, но есть популярные альтернативы vi, которые умнее, например vim. Чтобы заставить vim интерпретировать вкладку как команду `` indent '' вместо команды insert-a-tab, выполните следующее:

set softtabstop=2

Ответ 6

Если вы хотите заменить все вкладки пробелами на основе настройки "ts", вы можете использовать: retab. Он также может делать обратное.