Страницы

Поиск по вопросам

пятница, 1 марта 2019 г.

Vim превратил табулатор в пробелы после отключения expandtab

Вот здесь я спрашивал про одну ошибку. Причиной ошибки оказалось, что вместо табулятора ввелись пробелы.
Я выполнил в viм - :set noexpandtab, чтобы не было пробелов. Ввёл клавишей табулятор и затем EOF.
А в файле после сохранения действительно пробелы:
~$ xd tabs 000000 20 20 20 20 45 4f 46 0d 0a > EOF..<
Устранил ошибку с Ctrl-V+Tab
Почему viм превратил табулятор в пробелы после noexpandtab?


Ответ

В вашем случае просто получился такой вариант: softwidth < tabstop. Смотрите!
На ввод пробельных символов (которые обычно отображатся в виде пропуска в тексте) клавишей TAB в Vim влияют упомянутый вами параметр expandtab, но также softwidth и tabstop следующим образом. При активированном noexpandtab (это ваш случай) при нажатии на клавишу табуляции редактор вычисляет ближайшую позицию для вставляемого отступа, которой задаётся настройкой softwidth, затем вставляет столько символов табуляции, чтобы не выйти за новую рассчитанную позицию курсора, считая при этом '\t' (U+0009) по ширине эквивалентным tabstop пробелам. Остальное пространство заполняется обычными пробелами.
Возможно, это выглядит слишком замудрёно, но рассмотрим пример. Допустим, softwidth=2, tabstop=4, ваш редактор находится в режиме вставки, а курсор стоит в начале строки (в колонке №1). Вы нажимаете на клавиатуре клавишу TAB и вставляются два обычных пробела ' ' (U+0020), а курсор переходит в колонку №3. Вы второй раз нажимаете на табуляцию — эти пробелы заменяются на одну '\t' (курсор в 4 колонке). Нажмите в третий раз — получите одну табуляцию, а за ней два пробела (теперь курсор в 6 колонке). Четвёртое нажатие приведёт к вводу двух символов табуляции и т.д.
Иными словами, нажатие TAB заставляет редактор увеличить отступ курсора на единицу, но ширина одного отступа задаётся настройкой softwidth. А ширина одного символа табуляции настраивается с помощью tabstop.
Поэкспериментируйте с конфигурацией Vim, а легко различать табулиции '\t' от пробелов ' ' вам поможет примерно такая команда для подсветки пробельных символов.
set list lcs=tab:>\ ,space:.

Комментариев нет:

Отправить комментарий