Вкладки и пробелы в vim - PullRequest
69 голосов
/ 16 сентября 2008

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

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

Ответы [ 6 ]

77 голосов
/ 16 сентября 2008

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

: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.
40 голосов
/ 26 апреля 2011

Вы можете конвертировать все TAB в SPACE

:set et
:ret!

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

:set et!
:ret!
40 голосов
/ 16 сентября 2008

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

:help copyindent

'copyindent' 'ci' логический (по умолчанию отключено); локально для буфера; {не в Vi}

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

ПРИМЕЧАНИЕ: 'copyindent' сбрасывается, когда установлено 'совместимый' .
Также см. 'preserveindent' .

:help preserveindent

'preserveindent' 'pi' логический (по умолчанию отключено); локально для буфера; {не в Vi}

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

ПРИМЕЧАНИЕ. При многократном использовании символа «>>» результирующий отступ представляет собой смесь табуляция и пробелы. Вам может не понравиться это.
ПРИМЕЧАНИЕ: 'preserveindent' сбрасывается, когда установлена ​​ 'совместимая' .
Также см. 'copyindent' .
Использование: retab для очистки пробелов.

25 голосов
/ 16 сентября 2008

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

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

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

1 голос
/ 01 октября 2008

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

1 голос
/ 16 сентября 2008

Может быть, это поможет вам?

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

set softtabstop=2
...