2010-11-10 23 views
5

Edytowałem pliki w Vimie i logowałem linie poleceń terminala wraz z opisami tego, co zrobiłem. Wszystkie moje wiersze polecenia rozpocząć $, więc moje pliki wyglądać następująco:Jak zdefiniować wyjątek dla podziałów linii w Vimie?

This is a description of what this 
command does, it can be quite long and 
should have line breaks. 

$ ./the_command.sh 

Są faktycznie Viki pliki, ale myślę, że kwestia ta powinna mieć zastosowanie do dowolnego typu pliku. Mam wykrywanie typów plików, a pliki są poprawnie identyfikowane.

Teraz powstaje pytanie:

chcę (hard) linia łamie być włożona do wszystkich tekstów z wyjątkiem rzeczywistych egzemplarzy linii poleceń, które mogą być łatwo zidentyfikowane przez wiodącego $.

Czy w Vimie można zdefiniować wyjątek dotyczący stosowania reguły podziału linii na podstawie wzorca? Czy zrobiłbym to w pliku składni dla plików viki?

UPDATE Za pomocą kombinacji co Herbert i Jefromi zasugerował, teraz mam to w moim .vimrc:

au CursorMovedI *.viki call SetTextWidth() 

function! SetTextWidth() 
    if getline(".")=~'^\$' 
     set textwidth=1000 
    else 
     set textwidth=80 
    endif 
endfunction 

Robi dokładnie to, co chcę. Dzięki chłopaki!

+0

prostu do wyjaśnienia: Chcę linebreaks być wstawiane automatycznie podczas pisania. W moim .vimrc mam wiersz "autocmd FileType viki setlocal textwidth = 80", aby ustawić przepływność specjalnie dla plików viki, co działa dobrze, oprócz tego, że zrywa również moje linie "$ COMMAND". – tospo

Odpowiedz

3

wnoszę, kiedy mówisz, że chcesz „twarde podziały wiersza” masz na myśli chcesz Vim przełamać linię automatycznie, a gdy osiągnie kolumnę textwidth. Najlepszym sposobem na to, jak sądzę, jest zdefiniowanie polecenia "au", które ustawia szerokość tekstu na dużą liczbę (wyższą niż najdłuższa możliwa linia), gdy jest w linii zaczynającej się od "$".

Więc coś takiego byłoby zmienić textwidth gdy wpiszesz lub tryb wstawiania wyjście na linię:

au InsertEnter call SetTextWidth() 
au InsertLeave call SetTextWidth() 

function! SetTextWidth() 
    if getline(line('.')) =~ '^\$' 
     " [edit: 'set textwidth = 0' is preferable to line below] 
     set textwidth =1000 
    else 
     set textwidth=78 
    endif 
endfunction 

może chcesz użyć CursorMoved/grupy CursorMovedI zamiast InsertEnter/Leave ponieważ są one bardziej w porządku -gryziony. Są uruchamiane za każdym razem, gdy poruszasz kursorem, więc funkcja kończy się na wywoływaniu wielu razy, ale funkcja jest na tyle prosta, że ​​prawdopodobnie nie spowoduje zauważalnej degradacji wydajności.

Dla robi bez funkcji w ogóle można chyba użyć czegoś takiego:

au InsertEnter exec "set tw=" . getline(line('.'))=~'^\$' ? 1000 : 78 
au InsertLeave exec "set tw=" . getline(line('.'))=~'^\$' ? 1000 : 78 
+0

Prawdopodobnie można użyć 'CursorMovedI' do ręcznego zaimplementowania zawijania linii i pozostawić samą szerokość tekstu. – Cascabel

+0

Wielkie dzięki za to rozwiązanie. Czy nie powinien to być po prostu "getline (". ') "Zamiast getline (linia ('. '))? Problem z tym podejściem polega na tym, że działa on tylko po rozpoczęciu edycji linii, wpisaniu "$", a następnie wyjściu i powrocie do trybu wstawiania. W przeciwnym razie nie ma "$" na początku linii po wprowadzeniu INSERT, co oznacza, że ​​wstawione zostaną linie podziału, a zatem nie ma wiodącego "$" w bieżącym wierszu po wyjściu z trybu INSERT. Muszę spróbować z CursorMovedI teraz, myślę, że to powinno działać. – tospo

+0

OK, działa dobrze z CursorMovedI - wielkie dzięki! – tospo

0

Chociaż nie jestem pewien, co chcesz (powinien być nieco bardziej szczegółowe na którym (dlaczego, w jaki sposób) chcesz wstawić twarde podziały wiersza), ale można wydać polecenie podobne

:v:^\s*$: <Your command to insert line break, e.g. s/something/\r/ > 

Powyższe polecenie wyszukuje dowolną linię, która nie zaczyna się od żadnych białych znaków, po których następuje $, a następnie wykonuje określone polecenie.

HTH

+0

jak już powiedziałem, chcę, aby twarda linia łamała się wszędzie w pliku oprócz linii zaczynających się od $ (kopie wierszy poleceń). Chcę, aby te podziały wierszy były wstawiane w locie, tj. Ustawiając wartość vairable dla textwidth (co zrobiłem specjalnie dla typu filii viki). Więc to, co sugerujesz, nie jest tym, czego szukałem, i tak dziękuję! – tospo

+0

OK, teraz rozumiem. W takim przypadku powinieneś rozważyć inne odpowiedzi. –

2

Wierzę, że to będzie spełniać kryteria:

set textwidth=78 
v/^$/normal gq/^$\|\%$^M 

^M jest ctrl-v następnie enter

Pozwala podzielić to na mniejsze kawałki

/^$\|\%$ to wzór pasujący do każdej linii, która nie zaczyna się od $. \%$ będzie zawierał linie między ostatnim $ rozpoczętym wierszem a końcem pliku.

gq/^$\|\%$ formatów od aktualnej linii aż do wzorca /^$\|\%$

:normal {cmd} wykonuje normalne polecenia MODE na bieżącej linii.

:v/pattern/ jest równoważna :g!/pattern/ który wykonuje polecenie na każdym linia partii pasującym/wzorzec/

To rozwiązanie nie formatować podczas wpisywania jako rozwiązanie @Herbert Sitz robi. Zamiast tego formatuje tekst za jednym zamachem na końcu.

Można oczywiście zastosować to przed każdym pisać

au BufWritePre filename-pattern-here set textwidth=78 | v/^$/normal gq/^$\|\%$^M 
au BufWritePost filename-pattern-here set textwidth=0 
+0

dzięki za rozwiązanie. Pójdę z Herbertem po prostu dlatego, że wolę, żeby te linie łamania były stosowane podczas pisania, ale dziękuję za wyjaśnienie !! – tospo

Powiązane problemy