Zakładki do wcięcia, spacje do wyrównania

17

Próbuję zrobić automatyczne wcięcie vim za pomocą tabulatorów i wyrównanie do białych znaków, ale tak naprawdę wcięcie vim za pomocą tabulatorów i wypełnienie wyrównania tabulatorami + białymi spacjami.

Vim to robi:

wprowadź opis zdjęcia tutaj

(każdy blok to zakładka)

{
>--long a = 1,
>-->--..b = 2,
>-->--..c = 3;
}

Może to zrobić:

{
>--long a = 1,
>--.....b = 2,
>--.....c = 3;
}

Myślę, że jest wiele pytań na temat tabulatorów i spacji, ale żadne z nich nie zapewnia rozwiązania Just Works:

Właściwie używam:

set ai
set cindent
set cinoptions=(0,:0,u0,U0,g0)

Próbowałem wtyczki Smart Tab , która wydaje się działać dobrze, ale kiedy próbuję, gg=Gpojawiają się dziwne błędy:

Error detected while processing function CtabRedoIndent..<SNR>12_CheckAlign:
line   11:
E108: No such variable: "b:ctab_lastalign"
Press ENTER or type command to continue
Error detected while processing function CtabRedoIndent:
line   10:
E170: Missing :endwhile

Ta dyskusja wydaje się być bardzo stara, więc teraz, w 2015 roku istnieje oficjalne rozwiązanie, aby sobie z tym poradzić?

tjbrn
źródło
Nie mam na to odwzorowania, tylko pomysł ... ale co, jeśli ustawisz Vima, aby wstawiał tabulatory (o dowolnej szerokości) po naciśnięciu klawisza tab, ale faktycznie rozszerzysz tabulator na spacje, jeśli wpiszesz Shift -Patka? Czy nie ułatwiłoby to tego rodzaju wyrównania?
Wildcard
(PS: Fajna dyskusja na temat „Tabs vs. Spaces” na forum „Wojny religijne” komiksu xkcd . Ciesz się;)
Wildcard

Odpowiedzi:

3

Wykonanie tego naprawdę automatycznie jest trudne. Vim nie wie, co to jest „wcięcie”, a co „wyrównanie”; a niektórzy ludzie mogą nie zgadzać się co do tego, co dokładnie stanowi wcięcie i wyrównanie.

To powiedziawszy, wtyczka Smart Tabs została zaprojektowana do robienia tego, co chcesz; Przekonałem się, że działa dość dobrze w przypadku plików C, ale ma wiele zastrzeżeń; to łamie plików Python, na przykład, a nie jakiś nieoczekiwany (przynajmniej dla mnie) rzeczy dla plików C w czasie.
Patrząc na źródło, nie mogę naprawdę zrozumieć, jak to działa w ciągu 5 minut, aw połączeniu z faktem, że psuje pewne rzeczy, powinieneś powiedzieć, abyś postępował ostrożnie ...

Martin Tournoij
źródło
3

Wspomniana wtyczka Smart Tabs jest tak dobra, jak to tylko możliwe. Początkowo napotkałem ten sam błąd, który zrobiłeś i zrezygnowałeś, ale ostatecznie poświęciłem kilka minut, aby go naprawić. Spróbuj zastosować następującą łatkę:

--- ctab.vim.orig   2016-08-11 17:05:20.767275274 +0800
+++ ctab.vim    2016-08-11 17:15:20.039286525 +0800
@@ -221,7 +221,7 @@
       if a:line == line('.')
         let b:ctab_lastalign=a:line
       else
-        unlet b:ctab_lastalign
+        unlet! b:ctab_lastalign
       endif
       set ts=50
       set sw=50

Później odkryłem, że ktoś zaproponował podobną poprawkę w sekcji wiki Smart Tabs . Niestety, nie było nowej wersji.

MartinR
źródło
0

Wcięcie w vimie wykonuje się po prostu za pomocą następującego skryptu

Skrypt do wykonania wcięcia pojedynczego pliku

#!/bin/bash 
#Author: Ankit shah
#Enter file name to indent as argument
file=$1
vim $file -c "normal gg=G" -c "wq"
#Use expand command to turn tabs into spaces. Code uniform across different vim environment
expand -t 4 $file $file 
Ankit Shah
źródło
2
To nie jest odpowiedź na pytanie
Martin Tournoij