Mam dość duży plik tekstowy utworzony z bloków takich jak
Short line.
Really long line.
Short line.
oddzielone pustymi liniami i chciałbym użyć vima (w Linuksie) do podziału długich linii i uzyskania bloków podobnych
Short line.
This was
part of
a long line.
Short line.
Mój problem z gq
(i gw
) polega na tym, że przepełnia każdy blok jako cały akapit, tzn. Nie zachowuje dwóch podziałów wiersza w każdym bloku i zgodnie z :help fo-table
żadną z gq
opcji formatu nie pozwala mi robić tego, co chcę. Pomyślałem również, że mógłbym osiągnąć swój cel, gdybym mógł zdefiniować znaki nowej linii jako ograniczniki akapitów, ale zgodnie z :help paragraph
nimi są one zakodowane na stałe.
Edycja: Wiem, że mógłbym użyć gq
lub gw
sformatować każdą długą linię jeden po drugim, ale ponieważ mój plik ma kilka tysięcy wierszy, szukam sposobu na osiągnięcie tego automatycznie.
gq
igw
. Cieszę się również, że nie poprzestałem na tym, bo inaczej nie dowiedziałbym się o:g
poleceniu. :)Odpowiedzi:
To stosuje
normal
poleceniegww
(które formatuje bieżącą linię jak w przypadkugw
) do całego bufora, bez uwzględnienia niestandardowych mapowań (aby uniknąć problemów, jeśli np.gw
Został zamapowany na coś innego).Widzieć
:help :%
:help :norm
:help gww
Ta alternatywa jest zgodna z sugestią Bena w komentarzach i jest prostsza niż oryginalne rozwiązanie, które zostało zapisane poniżej, ponieważ może pasować lepiej w innych podobnych okolicznościach ze względu na zdolność dopasowywania wyrażeń regularnych. W przypadku „dopasuj wszystkie linie” jest to jednak niepotrzebnie brutalne.
gww
Programowe zastosowanie do każdej linii w buforze:Zobacz
:help :g
i:help norm
.^
dopasowuje początek linii, co w praktyce sprawia, że pasuje do każdej linii.Można również wybrać tylko linie dłuższe niż np. 60 znaków za pomocą
(patrz
:help \%<
), ale w praktycegww
formatowanie linii będzie dłuższe niż wtextwidth
każdym razie, więc może nie mieć większego znaczenia ani w szybkości, ani w wyniku.(Używam
v
„wirtualnej kolumny” zamiastc
„kolumny”, ponieważ ta ostatnia naprawdę oblicza pewną liczbę bajtów do linii. Może to prowadzić do nieoczekiwanych wyników przy stosowaniu kodowania wielobajtowego, co często jest powodem do ostrożności. W praktyce nie jest to realny problem z tego samego powodu, co powyżej, ponieważgww
nie zmieni on formatowania linii krótszych niż wtextwidth
każdym razie.)źródło
:g
zawodzi bez wzoru, więc:g//norm gww
nie działa, ale:g/.*/norm gww
działa.:g//
ponownie wykorzystuje ostatni wzorzec wyszukiwania; jeśli nie ma, to zawiedzie. Użyj,:g/^/
aby zastosować do wszystkich linii.:help last-pattern
podczas normalnego wyszukiwania dotyczą również:global
polecenia.Skoro masz już przeczytać podręcznik dla
gq
igw
poleceń, I postać prawdopodobnie chcesz coś bardziej wygodniejsze niż ręczne przenoszenie do długich linii, a następnie przy użyciugw0
,gw$
lub innegogw
polecenia tylko sformatować bieżącą linię.Nie znam łatwego sposobu na łamanie długich linii w Vimie na bloku tekstu. Ponieważ jednak wspomniałeś, że używasz Vima w systemie GNU / Linux, sugeruję filtrowanie tekstu za pomocą
fmt
polecenia GNU .Dla całego pliku:
Dla bieżącego akapitu (przy użyciu krótkich opcji):
Wyjaśnienie odpowiednich
fmt
opcji to:-w, --width=WIDTH
- maksymalna szerokość linii (domyślnie 75 kolumn). Opcja-WIDTH
jest skróconą formą--width=DIGITS
(jeśli używasz tej wersji skróconej, musi to być pierwsza opcja).-s, --split-only
- podziel długie linie, ale nie uzupełniaj; jest to opcja, która pozwala zachować istniejące wcześniej przerwy w linii.źródło
fmt
. Wolałem jednak zaakceptować drugą odpowiedź, ponieważ wymaga ona tylko vim.Od:
Umieszczanie znacznika na linii „lorem ipsum” i
gww
uzyskiwanie wydajności prasowania (textwidth=40
dla większej przejrzystości):co wydaje mi się tym, o co prosisz. Jeśli nie, prosimy o wyjaśnienie.
źródło