Do czego służy „softtabstop”?

21

Znam te ustawienia związane z kartami w Vimie:

  • ts
  • sw
  • expandtab
  • smarttab
  • sts

Moje normalne ustawienie to set ts=4 sw=4 expandtab smarttab.

Ale zgodnie z stsdokumentacją , jeśli expandtabnie jest ustawiony, spróbuje użyć kombinacji spacji i tabulatorów, aby uzupełnić żądaną liczbę spacji dla rozmiaru tabulacji.

Naprawdę nie mogę wymyślić przydatnego scenariusza dla tego ustawienia: Dlaczego ktoś chciałby mieć stałą liczbę tabulatorów i spacji, które mogą po prostu coś popsuć? Jedyną zaletą zrobienia tego, o czym mogę myśleć, jest zmniejszenie liczby znaków, a tym samym zmniejszenie rozmiaru pliku, co wydaje mi się dziwne.

KFL
źródło

Odpowiedzi:

20

Jak wspomniano w softtabstopdokumentacji, jest to przydatne, jeśli chcesz zachować domyślny rozmiar tabulatora 8, ale edytuj plik tak, jakby rozmiar tabulatora był inną wartością. Na przykład, jeśli chciałeś mieć poziom wcięcia 4 podczas edycji kodu, ale niektóre komentarze miały tekst z wcięciem tabulacji, na przykład tabelę zależną od tabulatora 8, możesz ustawić stsna 4.

Jedną różnicę, którą zauważam między ustawieniami tabulatorów ( set ts=4 sw=4 expandtab smarttab) a użyciem sts(np. set ts=8 sts=4) Jest to, że odstępy między spacjami w środku linii tekstu. Weźmy na przykład następujący wiersz tekstu, gdzie ·oznacza spację:

some·text·······more·text

W trybie wstawiania, przesuń kursor tuż przed mo more text. W ustawieniach naciśnięcie klawisza Backspace usuwa pojedynczą spację. Ale podczas używania sts=4Backspace usuwa całą drogę do poprzedniego tabulatora, tak jakby zachował się, gdyby spacje były znakiem tabulacji.

Możesz ustawić sts=4oprócz ustawień i uzyskać zachowanie backspace w linii środkowej bez mieszania tabulatorów i spacji. Tabulatory zostaną rozszerzone do czterech spacji, ale można cofać się w obrębie zakresu spacji na środku linii.

Lithis
źródło
3

Zobacz poniższy przykład

// Start vim without loading your vimrc. set only tabstop=8 softtabstop=4.
// This makes <Tab> in insert mode equals to 4 <Space> length at max.

// In insert mode, type 12, one <Tab>, 5. We get insertion below,
12··5
// Quit insert mode. Move cursor back, we find 2 <Space> inserted.

// In insert mode, type 12, two <Tab>, 9. We get insertion below,
12······9
// Quit insert mode. Move cursor back, you find a <Tab> inserted.

// In insert mode, type 12, three <Tab>, 3. We get insertion below,
12··········3
// Move the cursor back, you find a <Tab> and 4 <Space> inserted.

// We can even set sotftabstop=12, but this time we only need type one <Tab>, then 3.
12··········3
// Move the cursor back, you find a <Tab> and 4 <Sapce> inserted.

Podobnie tabstopjest z szerokością Tabzdefiniowanego a, a z softtabstoptym, jak daleko kursor przesuwa się podczas pisania Tab . Jeśli nie są ustawione na tę samą wartość, oznacza to, że Tabnaciśnięcie klawisza nie oznacza trywialnie Tabznaku. W każdym przypadku to vim decyduje, kiedy wyjdziesz z trybu wstawiania. Vim najpierw spróbuje dopasować wstawienie tak wielu, tabstopjak to możliwe; jeśli w końcu nie może zrobić pełnego tabstop, vim po prostu kompensuje Space.

Mówiąc trochę więcej, jeśli ustawisz expandtab, możesz powiedzieć vim:

Proszę nie przeszkadza, aby obliczyć, ile Tabi Sapcejest potrzebne. Po prostu włóż Space.

Chen XI
źródło
Twoja odpowiedź wydaje się raczej rantem i nie wydaje się odpowiadać na pytanie.
Herb Wolfe
@Herb Wolfe Chciałbym, aby moja odpowiedź pomogła PO dowiedzieć się, co dzieje się, gdy powstają niezwykłe ustawienia :set st=7 sts=13. Ponieważ vim jest przeznaczony nie tylko do kodowania, ale pierwotnie do edycji tekstu.
Chen XI
1

Prosta odpowiedź:

Na przykład jest wyjątkowo przydatny do programowania, szczególnie w języku Python, w którym kluczowe znaczenie ma tabulacja. Kiedy naciśniesz backspace ze sts = 4, spowoduje to cofnięcie wiersza, a nie usunięcie pojedynczego znaku spacji.

SergeyR
źródło