Zastanawiałem się, czy Vim ma możliwość inteligentnego zawijania wierszy kodu, tak aby zachowywał to samo wcięcie co wiersz, który wcina. Zauważyłem to w innym edytorze tekstu, takim jak edytor e-tekstu, i stwierdziłem, że pomogło mi to zrozumieć, na co patrzę.
Na przykład zamiast
<p>
<a href="http://www.example.com">
This is a bogus link, used to demonstrate
an example
</a>
</p>
wyglądałoby jak
<p>
<a href="somelink">
This is a bogus link, used to demonstrate
an example
</a>
</p>
:set autoindent
i:set smartindent
Odpowiedzi:
Ta funkcja została zaimplementowana 25 czerwca 2014 r . W patchu 7.4.338. Nastąpiło kilka poprawek udoskonalających tę funkcję, ostatnia to 7.4.354, więc to jest wersja, którą chcesz.
Fragmenty pomocy Vima poniżej:
W tym przypadku istotne jest również
showbreak
ustawienie, które doda wielkość zmiany do określonego znaku (ów).Przykładowa konfiguracja
Uwaga dotycząca zachowania
Jeśli nie określisz
sbr
opcji,showbreak
wszelkie znaki zostaną dołączone do wcięcia. Usunięciesbr
z powyższego przykładu powoduje efektywne wcięcie 4 znaków; z tym ustawieniem, jeśli chcesz używać tylkoshowbreak
bez dodatkowego wcięcia, określshift:0
.Możesz również wprowadzić przesunięcie ujemne, które spowodowałoby przeciągnięcie
showbreak
znaków i zawiniętego tekstu z powrotem w dowolne dostępne wcięcie.Podczas określania
min
wartości przesunięta kwota zostanie zmniejszona, jeśli szerokość terminala jest węższa, aleshowbreak
znaki są zawsze zachowane.źródło
set breakindent
do konfiguracji vima spowoduje złamanie linii i zawijanie w wcięciu - zamiast przerywać i zaczynać od następnej linii, jakby to była nowa linia.set breakindentopt=shift:4
do konfiguracji vima spowoduje wcięcie dodatkowych 4 spacji.breakindentopt
. Składnia nie jest oczywista z dokumentu pomocy. Dzięki @fritzo za przykład w komentarzu.Jest na to łatka, ale trwa od lat i ostatnim razem, gdy sprawdzałem, nie została nałożona czysto. Zobacz wpis „Prawidłowe wcięcie zawiniętych wierszy” na http://groups.google.com/group/vim_dev/web/vim-patches - naprawdę chciałbym, żeby to znalazło się w głównym wierszu.
Aktualizacja: ten link wydaje się być bitrotowany. Oto bardziej aktualna wersja poprawki .
Aktualizacja 2: została scalona w górę (stan na 7.4.345), więc teraz musisz tylko
:set breakindent
.źródło
Nie sądzę, aby można było mieć dokładnie to samo wcięcie, ale nadal można uzyskać lepszy widok, ustawiając opcję „showbreak”.
Przykład:
Rzeczywistość wygląda lepiej niż powyższy przykładowy kod, ponieważ Vim używa innego koloru dla '>>>'.
źródło
:set showbreak=\ \ \ \ \ \ \ \ \ \ \ \ \ \
(kombinacja odwrotnego ukośnika tworzy odstęp między znakami łamania. W ten sposób możesz dodać wystarczająco dużo spacji, aby były głębsze niż większość zawiniętego kodu (np. 10 spacji byłoby głębszych niż 2 tabulatory z czterema spacjami, a 14 byłoby głębsze niż 3 cztery spacje); fajną cechą przestrzeni jest to, że jest mniej rozpraszająca wizualnie (jeśli tego chcesz).set showbreak=\ \ \ \ \ \ \ \ \ \ \ \ \ \
jest znacznie mniej czytelna niżlet &showbreak=repeat(' ', 14)
AKTUALIZACJA: W czerwcu 2014 r. Łatka obsługująca
breakindent
opcję została włączona do Vima (wersja 7.4.346 lub nowsza dla najlepszego wsparcia).Możesz też spróbować
:set nowrap
co pozwoli vimowi wyświetlać długie linie przewijając w prawo. Może to być przydatne do zbadania ogólnej struktury dokumentu, ale może być mniej wygodne w przypadku faktycznej edycji.Inne opcje zbliżone do tego, czego szukasz, to
linebreak
ishowbreak
. Za pomocąshowbreak
możesz modyfikować to, co jest wyświetlane na lewym marginesie zawijanych wierszy, ale niestety nie pozwala to na zmienne wcięcie w zależności od bieżącego kontekstu.źródło
Jedynym sposobem, w jaki wiem, że możesz to zrobić, byłoby użycie znaku powrotu (jak wspomniał Cfreak) i połączenie tej
textwidth
opcji z różnymi opcjami wcięć. Jeśli wcięcie jest skonfigurowane poprawnie (tak jak jest to domyślnie w przypadku składni html, jak sądzę, ale poza tym zobacz opcjeautoindent
ismartindent
), możesz:Jeśli dostosujesz
formatoptions
ustawienia, lepiej po prostu:Co to oznacza:
Zauważ, że to nie to samo, co miękkie zawijanie: zawinie linie w pliku źródłowym, a także na ekranie (chyba że go oczywiście nie zapiszesz!). Istnieją inne ustawienia, które można dodać,
formatoptions
które będą formatowane automatycznie podczas wpisywania: szczegóły w:help fo-table
.Aby uzyskać więcej informacji, zobacz:
źródło
Myślę, że nadal musisz użyć zwrotu
źródło
Jeśli twój HTML jest wystarczająco dobrze sformułowany, może pomóc przepuszczenie go przez xmllint :
źródło
Rozwiązanie makro:
Edytować:
Operacja
gq{motion}
auto formatuje na dowolną wartość zmiennej "textwidth". Jest to łatwiejsze / lepsze niż użycie opcji80lBi^M
I have dla mojego makra.Jeśli masz włączone automatyczne wcięcie
Następnie wprowadzenie zwrotu na końcu wiersza spowoduje wcięcie następnego wiersza o tę samą kwotę. Możesz użyć tego do twardego wpisywania linewraps, jeśli chcesz. Poniższe makro wykorzystuje to do automatycznego wcięcia tekstu:
ustaw rejestr z na:
i ustaw rejestr x na:
Następnie zrób
aby aktywować makra. Po kilku sekundach cały tekst będzie miał odpowiednio wcięte wiersze o długości maksymalnie 80 znaków.
Wyjaśnienie:
Oto sekcja makr:
Część 1 (makro z):
Część 2 (makro x):
Ostrzeżenia:
To makro zepsuje się, jeśli istnieje SŁOWO, które ma 80 znaków lub więcej.
To makro nie będzie robić inteligentnych rzeczy, takich jak wcięcia wierszy za znacznikami.
Użyj ustawienia lazyredraw (: set lazyredraw), aby to przyspieszyć
źródło