Czy mogę uzasadnić tekst w Vimie?

38

Jedynym powodem, dla którego kiedykolwiek edytowałem plik tekstowy w Pico lub Nano, a nie w Vimie, było polecenie „Justify” ^J. Przeformatuje akapit tekstu, tworząc podziały wierszy przy podziale wyrazu, dzięki czemu tekst będzie ładnie unosił się na ekranie o stałej szerokości - sformatuj tekst, aby pasował do predefiniowanych 80 kolumn, tworząc podziały wierszy tylko między wyrazami. Ograniczona funkcja była bardzo przydatna, czy sformatować długie bloki komentarzy, pliki dokumentacji, czy po prostu zastąpić niekończącą się linię parametrów czymś bardziej czytelnym.

Czy mogę zrobić coś takiego w Vimie?

SF.
źródło

Odpowiedzi:

37

Możesz użyć operatorów gqlub w gwpołączeniu z poleceniem ruchu. Domyślnie używa fmtprogramu (w systemie Linux) do sformatowania podanego tekstu. Jednak, zgodnie z moją najlepszą wiedzą, nie uzasadnia to linii, więc będziesz miał nierówne marginesy.

Sposób, w jaki go używam, to gwip(tryb normalny) z kursorem na akapicie. Spowoduje to sformatowanie bieżącego akapitu, utrzymując kursor w tej samej pozycji. Używam go w ten sposób, aby mieć pewność, że tylko bieżący akapit jest sformatowany. Podczas edycji pliku tekstowego wydanie gwG(tryb normalny) na początku pliku sformatuje cały tekst. Jako dobrą praktykę należy pozostawić co najmniej jedną pustą linię między akapitami.

Istnieje wiele konfiguracji, które można wykonać. Na początek, oto niektóre istotne help: :h gq, :h gw, :h fo(opcje Format), :h fp(Program Format), :h fo-table(wyjaśnienie możliwych opcji).

gilema
źródło
1
gq / gw to zdecydowanie najlepsza droga. aby dodać do tej wiadomości, możesz zmienić program formatu na par, aby mieć więcej opcji. Zamówienie vimcasts.org/episodes/formatting-text-with-par
Bambu
3
Domyślnie Vim nie korzysta z żadnego zewnętrznego programu, chociaż możesz go wybrać, ustawiając 'formatprg'opcję.
jamessan
15

Na ten temat jest świetny VimCast.

http://vimcasts.org/episodes/formatting-text-with-par/

Zasadniczo musisz zainstalować par:

$ brew install par
# or
$ sudo apt-get install par

A potem, ponieważ chcesz zawinąć kolumny w 80 kolumn:

:set formatprg=par\ -w80

Teraz możesz używać gqoperatora, jak w innych odpowiedziach (np. gqip), A on użyje Par zamiast wbudowanego formatyzatora Vima.

Par jest dość zaawansowany i ładnie sformatuje takie komentarze:

/* This is a long */
/* multiline comment */
janko-m
źródło
11

Od :help usr_25:

JUSTIFYING TEXT                                                                 

Vim has no built-in way of justifying text.  However, there is a neat macro     
package that does the job.  To use this package, execute the following          
command:                                                                        

        :runtime macros/justify.vim                                             

This Vim script file defines a new visual command "_j".  To justify a block of  
text, highlight the text in Visual mode and then execute "_j".

Wszystko, co musisz zrobić, to uruchomić

:ru macros/justify.vim

a następnie wpisz

_j

uzasadnić tekst w całym pliku.

(Oczywiście możesz również dodać ru macros/justify.vimdo swojego .vimrc, więc nie musisz go wpisywać za każdym razem.)

Uwaga : nie dodaje to podziałów linii. Musisz dodać je ręcznie za pomocą gq. W tym celu należy również ustawić textwidth(domyślnie 0) żądaną wartość za pomocą

set textwidth=80

i - jeśli chcesz - automatyczne zawijanie tekstu poprzez ustawienie opcji t-flag za pomocą

set formatoptions+=t

Jeśli chcesz, możesz ustawić mapowanie w swoim .vimrc, aby zrobić wszystko za Ciebie:

nnoremap <C-j> gggqG_j

Przenosi się na początek pliku ( gg), zawija wszystkie linie ( gqdo G), a następnie _justala tekst.

Klamka
źródło
Aby uzyskać szczegółowe informacje na temat formatowania, patrz: INSTRUKCJA OBSŁUGI VIM - Edycja sformatowanego tekstu
Suuuehgi,
Właśnie znalazłem bardzo przydatną :set fo+=aopcję automatycznego formatowania całego akapitu. Sprawdź :help fo-tableinne opcje. Jest też ładny poradnik wideo tutaj .
Suuuehgi,
+1 za całkowicie wbudowane rozwiązanie. _jMapowanie dodane przez makro wydaje się uzasadniać cały plik dla mnie, albo może być ograniczona z linewise selekcji wizualnej.
ches
5

Chociaż pomoc nano wywołuje ^Jpolecenie „Justify”, tak naprawdę nie usprawiedliwia tekstu, ale formatuje tekst przerywając linie przed prawym marginesem ekranu (lub, jak sądzę, w jakiejś konfigurowalnej kolumnie).

Możesz zrobić to samo w VIM, ustawiając zmienną textwidthz :help 'textwidth':

Maksymalna szerokość wstawianego tekstu. Dłuższa linia zostanie przerwana po spacji, aby uzyskać tę szerokość. Wartość zerowa wyłącza to.

To znaczy: kiedy piszesz, jeśli linia jest dłuższa niż textwidthznaki, VIM zawinie linię na pierwszej spacji, aby długość linii była mniejsza lub równa textwidth.

Aby to zadziałało, opcja formatoptionsmusi zawierać literę t. Zobacz :help 'formatoptions'i :help fo-tabledla dostępnych opcji, na przykład może być zainteresowany w copcji do formatowania pracę z komentarzami.

Edit : można wykonać tę samą operację, bez konieczności umieścić tw formatoptions, używając polecenia gw{motion}, to formatuje tekst pomiędzy bieżącym położeniu kursora i pozycji kursora po {motion}. gwPolecenie jest dostępne również w trybie wizualnym, to formatowanie zaznaczonego tekstu.

toro2k
źródło
1
To jest dobre do pisania. Czy mogę zastosować to do wcześniej istniejącego tekstu?
SF.
3

Oto dwie proste opcje:

  1. z zaznaczonym blokiem tekstu wpisz !fmt
  2. kursorem na początku bloku wpisz !}fmt

Oba z nich wysyłają blok tekstu do unixa fmt, sprawdź man fmtopcje. Możesz przekazać argumenty opcji z vima. Na przykład, aby sformatować blok o szerokości 50 znaków, wpisz !}fmt -w 50.

kaan
źródło
przepraszam za to, teraz naprawione
kaan
Możesz również sformatować cały plik, pisząc :%!fmti cofając za pomocą jednego, ujeśli nie podoba ci się wynik.
Wildcard
-1

Zaznacz tekst za pomocą polecenia wizualnego, a następnie użyj:

:!par 40j 

gdzie 40 oznacza szerokość kolumny i joznacza uzasadnienie.

użytkownik16937
źródło
2
Witamy na naszej stronie! Twoje pytanie jest obecnie niskiej jakości, ponieważ brakuje wyjaśnień na temat narzędzia, którego używasz ( par) i dlaczego twoje rozwiązanie działa. Możesz dodać więcej szczegółów, aby poprawić jakość odpowiedzi i uczynić ją bardziej przydatną dla przyszłych czytelników.
statox