Количество вкладок, которые я получаю после нажатия клавиши Tab в режиме Vim Insert

Я изучаю программирование на С.

Я столкнулся с проблемой конфигурации 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).

вкладка не всегда имеет одинаковую длину. вкладка всегда делает отступ до позиции, которая умножается на позицию табуляции. Итак, если ваш табулятор равен 4, табуляция остановится на 4,8,12,16... Это означает, что если вы вставите табулятор в позицию 3, он будет иметь только длину 1 (3-> 4). Но если вы вставите его в позицию 5, он будет иметь длину 3 (5-> 8)

Doktor OSwaldo 15.03.2019 07:04
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
175
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это результат взаимодействия между вашим softtabstop и (обычным) tabstop.

Ваш softtabstop говорит, что при нажатии клавиши Tab результаты должны быть выровнены по кратным 8 столбцам. Когда вы нажимаете Tab после a, вы уже находитесь в столбце 13, поэтому для этого достаточно одного символа табуляции шириной 4. В других случаях вы были на 16 и 8, соответственно, поэтому потребовалось два символа табуляции шириной 4 для выравнивания с вашей мягкой вкладкой шириной 8.

PS: если вы хотите странного поведения (не рекомендуется, конечно), установите tabstop=3 softtabstop=8. Затем вы получаете комбинации пробелов и символов табуляции, когда нажимаете клавишу Tab.

PPS: Все это является частью того, почему я не люблю буквальные символы табуляции. Они нестабильны, их отображение зависит от настроек табуляции каждого разработчика. В моей организации я настаиваю на том, чтобы все использовали :set expandtab (или эквивалент в редакторе каждого разработчика) и использовали символы пробела для стабильного и воспроизводимого отображения. Единственное место, где я терплю символы табуляции в своей работе, это make-файлы, где у меня нет выбора.

Другие вопросы по теме