Я изучаю программирование на С.
Я столкнулся с проблемой конфигурации vim.
Ниже приведены мои настройки vim, записанные в .vimrc:
set nu
set shiftwidth=4
set tabstop=4
set softtabstop=8
set autoindent
set cindent
set smartindent
syntax on
Чтобы увидеть, где находятся вкладки, я использовал :set list
:
#include <stdio.h>$
int main(void)$
{$
^Iprintf("ab\n");$
^Ireturn 0;$
}$
Теперь в строке 4 в режиме вставки я хочу увидеть, сколько вкладок я могу получить после нажатия клавиши Tab в разных местах.
Вот результат:
Когда я ударяю Tab после n
, я получаю ^Iprin^I^Itf("ab\n");$
.
Когда я ударяю Tab после \n
, я получаю ^Iprintf("ab\n^I^I");$
.
Вышеуказанные две ситуации мне вполне понятны.
Но когда я ударяю Tab после a
, я получаю ^Iprintf("a^Ib\n");$
.
Это выше моего понимания.
Кто-нибудь может объяснить, почему заменена только одна вкладка?
Я думал, что их должно быть два, потому что softtabstop
занимает 8 пробелов, что в два раза больше tabstop
(4).
Это результат взаимодействия между вашим softtabstop
и (обычным) tabstop
.
Ваш softtabstop
говорит, что при нажатии клавиши Tab результаты должны быть выровнены по кратным 8 столбцам. Когда вы нажимаете Tab после a, вы уже находитесь в столбце 13, поэтому для этого достаточно одного символа табуляции шириной 4. В других случаях вы были на 16 и 8, соответственно, поэтому потребовалось два символа табуляции шириной 4 для выравнивания с вашей мягкой вкладкой шириной 8.
PS: если вы хотите странного поведения (не рекомендуется, конечно), установите tabstop=3 softtabstop=8
. Затем вы получаете комбинации пробелов и символов табуляции, когда нажимаете клавишу Tab.
PPS: Все это является частью того, почему я не люблю буквальные символы табуляции. Они нестабильны, их отображение зависит от настроек табуляции каждого разработчика. В моей организации я настаиваю на том, чтобы все использовали :set expandtab
(или эквивалент в редакторе каждого разработчика) и использовали символы пробела для стабильного и воспроизводимого отображения. Единственное место, где я терплю символы табуляции в своей работе, это make-файлы, где у меня нет выбора.
вкладка не всегда имеет одинаковую длину. вкладка всегда делает отступ до позиции, которая умножается на позицию табуляции. Итак, если ваш табулятор равен 4, табуляция остановится на 4,8,12,16... Это означает, что если вы вставите табулятор в позицию 3, он будет иметь только длину 1 (3-> 4). Но если вы вставите его в позицию 5, он будет иметь длину 3 (5-> 8)