it-swarm-ru.tech

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

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

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

70
RQ

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

: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.
77
user11211

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

:set et
:ret!

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

:set et!
:ret!
41
kev

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

:help copyindent

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

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

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

:help preserveindent

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

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

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

40
Aristotle Pagaltzis

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

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

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

25
Greg Hewgill

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

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

set softtabstop=2
1
svrist

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

1
graywh