Jak dodać prowadnice / linie wcięcia

42

W Sublime Text 2 masz pionowe linie pomocnicze, w których wcięcie jest następujące:

Zrzut ekranu Sublime Text

ale w vim oczywiście nie:

zrzut ekranu vim

Czy istnieje sposób na pokazanie takich linii w vimie? Nawiasem mówiąc, moje wcięcie to 2 spacje.

:set tabstop=2 softtabstop=2 shiftwidth=2 expandtab
aharris88
źródło

Odpowiedzi:

39

Ujednolicona odpowiedź:

Jeśli używasz kart

Spróbowałbym użyć listchars:

:set listchars=tab:\|\ 
:set list

Uwaga: po ostatnim \powyżej jest spacja .

Ta metoda jest dobra, ponieważ wykorzystuje wbudowane wsparcie Vima do pokazywania tego rodzaju rzeczy.

Przykładowe dane wyjściowe:

|       if (1) {
|       |       func();
|       }

zrzut ekranu próbki tekstu powyżej

Nie działa to jednak w przypadku wiodących miejsc. Jak zauważył @Josh Petrie, istnieje łatka do pracy ze spacjami , ale wtedy trzeba będzie ponownie skompilować Vima, co jest poza zakresem tej odpowiedzi.

Jeśli używasz spacji i nie masz nic przeciwko użyciu wtyczki

Vaibhav Sagar wskazuje, że wtyczka indentLine wykonuje tę funkcję.

Zainstaluj w normalny sposób (zobacz instalowanie wtyczek ) i wydaje się, że magicznie po prostu działa bez dalszych danych wejściowych. Jeśli nie masz nic przeciwko paskom ASCII, nie musisz nic robić z czcionkami. Przykładowe dane wyjściowe przykładu po ustawieniu ustawień wcięcia i uruchomieniu:IndentLinesReset

45   ¦ var move = function(direction) {
46   ¦ ¦ if(!initialized) { initialize(); }
47 
48   ¦ ¦ if(shiftBoard(direction)) {
49   ¦ ¦ ¦ setTimeout(addRandomPiece, 100);
50   ¦ ¦ }
51   ¦ };

zrzut ekranu przykładu ze spacjami

Wtyczka wymaga Vima 7.3 lub nowszego i sprawia, że ​​cleaver używa funkcji ukrywania tej wersji. Zamiast faktycznie ukrywać tekst, zamienia tekst na paski w widoku, ale nie na rzeczywisty bufor. W rezultacie widzisz słupki, ale nie są one zapisywane w pliku (ponieważ w rzeczywistości są spacjami)

Zastrzeżenie

Obie te metody zakładają „prawidłowo” wcięty kod. Nie umieszczają linii wcięcia na poziomie wcięcia, gdy otwierany jest „blok” (który wydaje się podniosły), ale zamiast tego umieszczają linie w regularnych odstępach czasu w oparciu o ustawienia wcięcia. Dodatkowo pokazuje tylko słupki na liniach, na których faktycznie jest miejsce (dlatego linia w wyjściu vima pod pierwszym ifnie ma żadnych słupków, tworząc wizualną przerwę)

John O'M.
źródło
Właściwie używam spacji do wcięcia zamiast tabulatorów. Zaktualizowałem moje pytanie.
aharris88
O. Będzie to wymagało dalszych badań.
John O'M.
1
Dostępna jest łatka, która pozwala, aby listy działały dla spacji nieskończonych, które można wykopać na liście mailingowej. Nie zostało to jednak zaakceptowane do oficjalnej dystrybucji :(
1
Zaktualizowana odpowiedź zawierająca informacje od Vaibhav Sagar i Josh Petrie. Wypróbowałem wspomnianą wtyczkę Vaibhav i pokazałem wyniki w edytowanej odpowiedzi. Myślę, że sam zacznę używać tej wtyczki. To nie jest fantastyczne, ale ogólnie działa całkiem nieźle.
John O'M.
1
indentLine działa poprawnie dla Pythona, Jsona, Vimla, C, C ++ itp. Ale niestety nie działa z vim-javascript, więc zamiast tego używam vim-indent-guide.
Sassan
19

Inną opcją, której używam, która nie jest dokładnie tym, o co prosiłeś, ale realizuje ten sam cel, ułatwiając zobaczenie, co jest w tej samej kolumnie, jest ustawienie następujących opcji w vimrc:

set cursorcolumn
set cursorline

ilustracja kolumny kursora

Ma to tę zaletę, że musisz przesunąć kursor do kolumny, którą chcesz zobaczyć, ale masz mniej wizualnego bałaganu. Zwykle, gdy zależy mi na poziomach wcięcia, i tak utrzymuję swoje miejsce za pomocą kursora. Moja droga też nie jest tak niewygodna w językach takich jak python bez zamykania nawiasów klamrowych.

Karl Bielefeldt
źródło
Użytkownicy Pythona vi umrą za tę funkcję
shuva
18

Dla kompletności dostępna jest również wtyczka Indent Guides , która pokazuje poziomy wcięcia poprzez naprzemienne kolory białych spacji. Wymaga wersji 7.2 lub nowszej. Ponieważ używa zmiennych tabstopi shiftwidth, prawdopodobnie będzie od razu działał dla twoich ustawień wcięć.

Imgur

Po zainstalowaniu wtyczki możesz po prostu użyć :IndentGuidesEnablelub :IndentGuidesDisable. Jeśli używasz terminalu vim, zwróć uwagę, że zgodnie z instrukcją

W tej chwili Terminal Vim ma tylko podstawowe wsparcie. Oznacza to, że kolory nie będą automatycznie obliczane na podstawie Twojego schematu kolorów. Zamiast tego stosuje się niektóre wstępnie ustawione kolory w zależności od tego, czy tło jest ustawione na ciemne, czy jasne.

Aby zmienić kolory przewodników na zrzucie ekranu, zastosowałem następujące

let g:indent_guides_auto_colors=0

więc kolory nie są ponownie obliczane podczas zamiany buforów, a następnie ustaw kolory za pomocą

hi IndentGuidesEven ctermbg=238
hi IndentGuidesOdd ctermbg=236

Podobnie jak w przypadku innych przedstawionych rozwiązań, pokazuje tylko wcięcia na liniach, w których są spacje.

gilema
źródło
dodaj let g:indent_guides_enable_on_vim_startup=1do mojego .vimrc, aby włączyć to podczas uruchamiania.
inye
9

Uważam, że wtyczka indentLine jest najlepsza do tego. Potrzebujesz czcionki z odpowiednimi symbolami, uważam, że Consolas w Windows i Menlo w Mac OS X działają dobrze. Jak wskazano w ujednoliconej odpowiedzi powyżej, działa on poprzez (ab) użycie concealfunkcji vima do umieszczenia pionowych pasków (z użytej czcionki) we właściwym miejscu. Jestem całkiem zadowolony z tego rozwiązania, ale jego wadą jest to, że moje pionowe paski są częścią glifów rysujących ramki i są wyśrodkowane, a nie wyrównane do lewej, jak w innych edytorach. Przyzwyczaiłem się do tego, ale można to naprawić, ręcznie łatając czcionkę lub używając czcionki takiej jak Fantasque Sans Mono (zwróć uwagę, jak zrzuty ekranu w połączonym repozytorium github używają indentLine).

Vaibhav Sagar
źródło
4
Zapoznaj się z naszą dyskusją na temat odpowiedzi zawierających tylko wtyczki i rozważ zaktualizowanie swojej odpowiedzi o dodatkowe informacje.
Mój błąd, zaktualizowałem swoją odpowiedź.
Vaibhav Sagar,
Który glif to łatana linia pionowa? Czy możesz to tutaj wkleić? Dzięki.
Timtro,
2

Wtyczka indentLine działa dość wolno na niemałych plikach, co można zaobserwować po kliknięciu Enter, ponieważ opóźnia się o sekundę.

Odkryłem, że vim-indentguides jest szybszą i podobną wizualnie wtyczką, która również wizualnie odróżnia wcięcia tabulatorów od wcięć spacji.

jaybay
źródło