Word Wrap in Vim (zachowywanie wcięć)

92

Właśnie patrzyłem na ten post, który opisuje jak zawijać całe słowa w vimie. Zaakceptowanym rozwiązaniem było:

:set formatoptions=l
:set lbr

Który przyjmuje ten tekst (karty są wyświetlane jako \ t):

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will wr|ap here                            
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

W ten sposób uzyskuje się takie zachowanie (karty są wyświetlane jako \ t):

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will   |
|wrap here                              |
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

Chciałbym jednak przedefiniować tę funkcję. Chciałbym, aby zawinięty wiersz miał taką samą liczbę zakładek przed sobą, jak powyższy wiersz plus jeden. To znaczy:

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will   |
|\t\t\twrap here                        |
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

Jakieś pomysły?

sixtyfootersdude
źródło
34
+1 za wysiłek włożony w wyjaśnienie pytania.
Jeffrey Jose
Czy chcesz, aby tekst był zawijany miękko na krawędzi okna, czy też zawijany mocno, gdy linia osiągnie określoną długość? Myślę, że chcesz zawijać na sztywno (gdzie nowa linia jest wstawiana do twojego tekstu po słowie „will”), ale trudno to stwierdzić na podstawie twoich przykładów.
Bill Odom
@Bill, jestem zainteresowany głównie pakowaniem w oprogramowanie, ale rozwiązanie do pakowania w twarde byłoby również dopuszczalne.
sixtyfootersdude
1
Funkcjonalność, której potrzebujesz, nie jest obecnie wbudowana w Vima. Jest jednak łatka, która jest bliska: groups.google.com/group/vim_dev/web/vim-patches (numer 15, „Prawidłowe wcięcie zawiniętych wierszy”).
Bill Odom
Powiązane: VimCasts miał niezły epizod na temat używania zewnętrznych narzędzi uniksowych do rozwiązania tego problemu: vimcasts.org/e/18
Damien Wilson

Odpowiedzi:

18

Łata breakindent ma to, czego szukasz. Z powodzeniem zastosowałem go, korzystając z instrukcji zawartych w tym wątku:

Załataj Vima przełomową łatką na OS X za pomocą Homebrew

W szczególności formuła Homebrew firmy Echristopherson.

Wiem, że ten wątek jest stary, ale jest popularny w Google i natknąłem się na niego wiele razy, próbując znaleźć rozwiązanie.

EDYCJA: Ta poprawka jest teraz dołączona do vima jako łatka 7.4.338. Zobacz: https://retracile.net/blog/2014/07/18/18.00

Na Yosemite (Mac OS X) użyłem polecenia snowbound z hombrew:

brew install macvim --with-features=huge --override-system-vim --HEAD 
Wyjście42
źródło
poprawka nie działa z najnowszym macvimem na homebrew? @ Exit42, jak to się stało?
śnieg w
nvm. Skompilowałem macvima z homebrew bleeding edgebrew install macvim --with-features=huge --override-system-vim --HEAD
snowbound
1
Zobacz moją odpowiedź poniżej: stackoverflow.com/questions/2828174/ ... Nie ma potrzeby instalowania łatki w nowszych wersjach vima.
JoshuaD
26

To nie zadziałało, gdy pierwotnie zadano pytanie, ale od 25 czerwca 2014 r. Będzie działać. (Zakładając, że zaktualizujesz swój vim do wersji nowszej niż ta data)

Dodaj do swojego .vimrc:

" Indents word-wrapped lines as much as the 'parent' line
set breakindent
" Ensures word-wrap does not split words
set formatoptions=l
set lbr

I to wszystko!

-

Niektóre osoby (łącznie ze mną) współużytkują jeden plik .vimrc na wielu komputerach. W takim przypadku ważne jest, aby ta linia była solidna (aby uniknąć irytujących komunikatów o błędach). To jest trochę lepsze:

if has("patch-7.4.354")
    " Indents word-wrapped lines as much as the 'parent' line
    set breakindent
    " Ensures word-wrap does not split words
    set formatoptions=l
    set lbr
endif

W ten sposób, jeśli korzystasz z wcześniejszej wersji vima, nie otrzymasz komunikatu o błędzie.

JoshuaD
źródło
Co ciekawe, działa to na vim mojego cygwina 7.4, ale nie na vimie 7.4 mojego unbuntu. Domyślam się, że musi stać się trochę bardziej rozpowszechniony, ale wkrótce doczeka się powszechnego przyjęcia.
JoshuaD
1
Działa w Vim 7.4 @ ArchLinux.
Andy Mikhaylenko
1
Możesz zamiast tego użyć tego testu:if has("patch-7.4.354")
Lawrence Kesteloot
To nie odpowiada na pytanie dotyczące uwagi OP: ta sama liczba zakładek (...) plus jedna . Swoją drogą jest to też moim zdaniem bardzo ważne, często możesz chcieć zachować dodatkowe wcięcia i optycznie przesuwać zawinięte segmenty w prawo (ciasno ułożone zestawienia, notatki itp.);
krwawy
8

Najlepsze, co dostaniesz, to showbreakopcja, która umieści stały ciąg przed każdym zawiniętym wierszem (używam set showbreak=...).

za dużo php
źródło
@AlexanderBird Według :help 'showbreak', nie, nie możesz - showbreakto tylko ciąg.
Rory O'Kane
4

Zgadzam się z odpowiedzią, która mówi, że „showbreak” jest najlepszą opcją. Showbreak zazwyczaj nie pozwala na umieszczanie znaków niedrukowalnych (np. Spacji lub tabulatorów) w ciągu showbreak, więc jak zwykle jest używany, daje tylko wskaźnik wzdłuż lewego marginesu, tj. Bez rzeczywistego wcięcia. To nie jest świetne, ponieważ moim zdaniem głównym celem OP jest nadanie zawiniętym liniom wcięcia, aby nie zaśmiecały lewego obszaru marginesu i nie wyglądały jak własne linie.

Tak więc jednym ze sposobów dodania (brzydkiego) wcięcia przy użyciu funkcji showbreak jest po prostu użycie dużej liczby znaków, .eg, ": set showbreak => --------------->". Powoduje to coś, co wygląda tak:

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will   |
|>--------------->wrap here             |
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

Lepszą alternatywą może być użycie nierozdzielających znaków spacji (zakładając, że twoja instancja Vima obsługuje Unicode), z których każdy można wprowadzić do ciągu showbreak za pomocą sekwencji klawiszy ctrl-v, 160. W ten sposób możesz wprowadzić ciąg showbreak, który jest pusty po lewej stronie i wygląda jak prawdziwe wcięcie. Np. ": Set showbreak =.......... >>" gdzie każdy '.' w poleceniu jest właściwie nierozerwalnym znakiem spacji wprowadzanym przez naciśnięcie Ctrl-V, 160. W ten sposób otrzymasz opakowanie, które jest ładnie wcięte, na przykład:

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will   |
|            >>wrap here                |
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

Nadal nie masz możliwości zmiany poziomu wcięcia w zależności od wcięcia poprzedniej linii, ale przynajmniej otrzymujesz czyste wcięcie zawiniętych linii bez dużej ilości wizualnego bałaganu wzdłuż lewego marginesu okna. Wciąż może być zamieszanie, jeśli wcięcie zawiniętej linii jest mniejsze niż na początku rzeczywistej linii, ale można by tego uniknąć, ustawiając dość duże „wcięcie” showbreak (tj. Większe niż jakiekolwiek wcięcie powszechnie występujące w kodzie ), ale wciąż na tyle mały, że zapewnia wystarczająco dużo miejsca na czytelne zawijanie tekstu. W przypadku wielu zastosowań myślę, że wcięcie typu showbreak z 40 lub 50 spacjami zrobiłoby to całkiem dobrze.

Herbert Sitz
źródło
7
Można umieścić spacji showbreak przez ich ucieczki: :set showbreak=\ \ \ \ . Jednak nadal nie działa w przypadku kart.
Bill Odom