Miękkie zawijanie 80 znaków w Vimie w oknie o dowolnej szerokości

126

Chcę użyć możliwości zawijania miękkiego Vima ( :set wrap), aby zawijać kod do 80 znaków, niezależnie od mojej rzeczywistej szerokości okna.

Nie udało mi się jeszcze znaleźć na to sposobu - całe miękkie opakowanie wydaje się związane z szerokością okna

  • textwidthi wrapmarginoba służą do twardego zawijania (wstawiają znaki nowej linii do pliku)
  • pionowe podzielenie na wiele okien i użycie :vertical resize 80(prawdopodobnie z, :set breakat=aby umożliwić przerwy w dowolnym znaku) na jednym z nich rodzaj pracy (nawet jeśli jest to trochę hakerskie), ale przerywa się, gdy używa się :set numberjako, że numery linii zajmują zmienną liczbę kolumn (w zależności na długości pliku) i są częścią 80.

Czy jest jakiś sposób, aby to zrobić w vimie? Według innych źródeł nie wygląda to obiecująco .

W tej chwili moje przybliżenie jest takie, że /^.\{80}\zs.\+jako domyślne wyszukiwanie, więc przynajmniej jest podświetlone. Myślałem o dodaniu do niego :syntaxelementu, ale to się zepsuło, gdy nałożyło się na inne elementy składni, więc porzuciłem ten pomysł.

rampion
źródło
Właściwie, jak skonfigurowałeś domyślne wyszukiwanie?
thethinman

Odpowiedzi:

37

Mógłbyś

  • ustaw dużą minimalną szerokość kolumny numerów wierszy za pośrednictwem :set numberwidth=6i
  • wtedy możesz zmienić rozmiar okna za pomocą :set columns=86(lub myszki) do odpowiedniego rozmiaru.

Jeśli edytujesz plik zawierający milion wierszy, możesz mieć problemy, ale jest to mało prawdopodobne. W ten sposób marnujesz również 6 kolumn ekranu. Więc nadal istnieje wiele problemów.

Możesz podświetlić miejsce poza 80. kolumną, używając :matchtak, jak jest napisane tutaj i tutaj .

Poza tym nie widzę żadnego sposobu, aby to zrobić. Wygląda na to, że byłaby to fajna funkcja.

Brian Carper
źródło
Niestety vim nie zachowuje ustawień kolumn, jeśli rozmiar okna jest zmieniany. Prowadzi to do niefortunnej sytuacji z menedżerami okien kafelkowymi, gdzie nie ma dobrego sposobu na miękkie zawijanie do 80 kolumn, jeśli okno jest zbyt szerokie.
grawitacja
To działa, ale nie jest lepkie. Myślę, że następnym krokiem jest skonfigurowanie autocmd, aby utrzymać kolumny w nowym pożądanym rozmiarze dla żądanych typów plików.
xer0x
1
To jest właściwa odpowiedź, ponieważ potwierdza, że ​​nie możesz tego zrobić. I jestem pewien, że nie tylko ja nie chcę zmieniać rozmiaru okna terminala tylko w tym celu. Chcę mieć dużo większą szerokość dla zastosowań innych niż vim.
Sridhar Sarnobat
20

Spróbuj tego:

set columns=80
autocmd VimResized * if (&columns > 80) | set columns=80 | endif
set wrap
set linebreak
set showbreak=+++

Możesz usunąć, if (&columns > 80) |jeśli zawsze chcesz 80 kolumn.

eborisch
źródło
Na moim terminalu iTerm powoduje to zmniejszenie okna. Nie jestem pewien, czy jest to problem z moim środowiskiem (widzę, że robisz coś z automatyczną zmianą rozmiaru), ale poza tym nie jest to pożądane. Jednak dzięki za sugestię.
Sridhar Sarnobat
Autocmd działał idealnie dla mnie (używając terminala guake).
mzcarlos
Działa jak urok z Tmux + NeoVim w Alacritty.
meh
16

Nie mam rozwiązania na miękkie zawijanie, ale jeśli chodzi o oznaczanie kolumny, od Vim 7.3 (wydany 2010-08-15) :set colorcolumn=80podświetli kolumnę 80. Kolor będzie zależał od pliku składni.

Zobacz Vim 80 kolumna układ obawy , :h colorcolumn.

ftvs
źródło
Cytaty nie są prawidłowymi adresami URL, więc ma to sens. Nazwa kotwicy nie powinna zawierać nieprawidłowych znaków adresu URL, SO nie powinna naprawiać błędów innych twórców witryny.
Shadow Wizard is Ear For You
1
Shadow Wizard odnosi się do poprzedniej wersji mojej odpowiedzi, w której zastanawiam się, jak umieszczać pojedyncze cudzysłowy w adresach URL za pomocą Markdown. Następnie ib zasugerował użycie% 27, co zadziałało. Dzięki, ib.
ftvs
Niedawno odkryłem, jak wyróżniać tylko kolumny po 80 ~:let w:eighty_column_match = matchadd('ColorColumn', '\%81v.\+', 100)
rampion
Ta colorwidthrzecz jest pomocna z innych powodów, więc cieszę się, że to opublikowałeś.
Sridhar Sarnobat
2

Czy próbowałeś 'linebreak'?

        *'linebreak'* *'lbr'* *'nolinebreak'* *'nolbr'*
  'linebreak' 'lbr' boolean (default off)
        local to window
        {not in Vi}
        {not available when compiled without the  |+linebreak|
        feature}
If on Vim will wrap long lines at a character in 'breakat' rather
than at the last character that fits on the screen.  Unlike
'wrapmargin' and 'textwidth', this does not insert <EOL>s in the file,
it only affects the way the file is displayed, not its contents.  The
value of 'showbreak' is used to put in front of wrapped lines.
This option is not used when the 'wrap' option is off or 'list' is on.
Note that <Tab> characters after an <EOL> are mostly not displayed
with the right amount of white space.
TK.
źródło
3
Hmm ... ale breakatto tylko wzór (nie długość), więc nie wiem, jak mógłbym go użyć do wymuszenia miękkiego owinięcia przy 80 ...
rampion
Hmmm, zastanawiam się, czy możliwe jest utworzenie wyrażenia regularnego, które będzie pasowało do słów, których całkowita długość (plus spacje między nimi) jest mniejsza lub równa n znakom.
Shane Creighton-Young
@ ShaneCreighton-Young: ^.{,80}\bbyłby odpowiedni dla osób używających miękkich / rozwijanych zakładek. Zwróć uwagę, że to wyrażenie regex perl, a nie vim regex.
Mark K Cowan
0

Nie ma na to dobrego sposobu. Możemy włamać prowizorycznym setlocal softwrapze autocmdjeśli będziemy modyfikować @eborisch odpowiedź. Jeśli zmieniamy rozmiar za każdym razem, gdy wchodzimy do bufora i zmieniamy rozmiar do określonej długości, gdy ustawiana softwrapjest zmienna lokalna , uzyskujemy pożądane zachowanie.

Załóżmy, że chcemy miękko zawinąć do 80 kolumn, możemy napisać w .vimrc.

augroup softwrap
    autocmd VimResized * if (exists('b:softwrap') && &columns > 80) | set columns=80 | endif
    autocmd BufEnter * set columns=999
augroup END

Aby włączyć tryb dla konkretnego bufora, użyj następujących poleceń:

let b:softwrap=1
set columns=80
durum
źródło
To po prostu przekształca moje pliki w bełkot.
Suuuehgi