2012-12-10 22 views
5

Moja konfiguracja Vima obejmuje set formatoptions=c,q,a. Jestem kompletnie poirytowany następujący problem (| oznacza pozycję kursora, jego dokładna pozycja nie ma znaczenia, jak zapewne wiesz tylko fakt jej obecności w tym komentowanych spraw liniowych):Vim: Polecenie "gq" do komentarzy o twardym zawijaniu, ale nie do kodu (nawet jeśli nie ma pustej linii pomiędzy)

" This is a long line which we would like to wrap. However, something sick is go|ing to happen if we hit "gqip" here! 
if has('win32') || has('win64') 
    set runtimepath^=~/.vim 
    set runtimepath+=~/.vim/after 
endif 

Teraz hit gqip:

" This is a long line which we would like to wrap. However, something sick is 
" go|ing to happen if we hit "gqip" here! 
if has('win32') || has('win64') set runtimepath^=~/.vim set 
    runtimepath+=~/.vim/after endif 

Co to jest - traktuje całość jako pojedynczy akapit. (! Tak, wiem, że oddzielenie z pustą linią Zapobiega to zachowanie, ale to nie rozwiązuje problemu) Co chciałbym go mieć rzeczywiście:

" This is a long line which we would like to wrap. However, something sick is 
" go|ing to happen if we hit "gqip" here! 
if has('win32') || has('win64') 
    set runtimepath^=~/.vim 
    set runtimepath+=~/.vim/after 
endif 

Innymi słowy, byłoby wspaniale, gdyby gq może jakoś zapomnieć o kodzie i pracować tylko z komentarzami.

BONUS: Jak to zrobić formatowanie (zawijania komentarze tylko) na całej bufora za jednym razem? Ponieważ, najlepiej, chciałbym przenieść te rzeczy do specjalnego haka formatowania do zapisywania plików.

Odpowiedz

3

Za pomocą mojego SameSyntaxMotion plugin można użyć obiektu tekstowego ay do reprezentowania całego bloku komentarzy, w którym znajduje się kursor, i ponownie sformatować go za pomocą gqay.

+0

Chore rzeczy, dobra robota, dziękuję ci za udostępnienie tej wtyczki. Tylko uwaga - instalacja była trochę uciążliwa ze względu na opakowanie "vimball", ponieważ używam patogenu. Ponadto, wydaje mi się, że o wiele lepszą nazwą byłoby "SyntaxGroupMotion", będzie to o wiele łatwiejsze do odnalezienia i bardziej intuicyjne. Teraz pytanie - działa dobrze z domyślnym odwzorowaniem "y" i "Y", ale starałem się zmapować go do 'g' i' G' (idąc za tym "mnemonicznym" grupą) i nie miałem szczęścia. O co tu chodzi? –

+0

Ach, przepraszam, zmienia to na "g". Problem polegał na odwzorowaniu kombinacji takiej jak ta 'nnoremap gwag'. Bądź ostrożny, należy raczej odwzorować go w ten sposób 'nmap gwag', w przeciwnym razie nie może uchwycić mapowania wtyczki" g ". –

+0

Kciuki w górę za wspaniałą wtyczkę! : D –

2

Szukaj skomentował linii używając :g, następnie owinąć te linie:

:%g/^"/normal gq_ 
+0

... i zamapuj to polecenie! – Ves

+0

Twoje rozwiązanie owija poszczególne wiersze, a głównym celem jest zawijanie ** akapitów ** komentarzy - co jest bardziej ogólne. Kolejną wadą jest to, że masz mocno zakodowany lider komentarza '' 'dla VimL. Lepiej wymyślić ogólne rozwiązanie dla dowolnego języka programowania (lub przynajmniej dowolnego), co jest proste, jeśli mamy dostęp do zmiennej przechowującej bieżącego lidera komentarzy. Ja sam po prostu nie wiem, jak nazywa się zmienna i czy w ogóle istnieje. –

10

faktycznie traktuje całą sprawę jako pojedynczy akapit

Dobrze, ze gqip, kazałeś go ! Musisz wybrać właściwy ruch. W tym przypadku pojedynczej linii będzie to gqq. W przypadku 3 linii to gq2j. Jeśli jest za dużo linii do zliczenia, użyj trybu wizualnego: Vjjjjjjgq.

+0

To jest coś sprzecznego z intuicją w tym kontekście. Tym, czego naprawdę chcesz, aby Vim robił w tym przypadku, jest myślenie o wielu liniach komentarzy (bez pustych linii pośrednich) jako własnych akapitów, niezależnie od tego, czy są oddzielone pustymi liniami (powyżej i poniżej) od kodu. Kod to kod, komentarze to komentarze. Liczenie, ile linii komentarzy do zawijania za każdym razem jest denerwujące i marnuje swój czas, mimo że wydaje się szybką akcją - czas faktycznie ma tendencję do akumulowania, o której wiesz. Czy istnieje sposób, w jaki mogę nauczyć Vima traktować komentarze jako akapit, niezależnie od separacji? –

+0

Naprawdę spodziewałem się zobaczyć takie zachowanie po wyjęciu z pudełka z powodu 'q' w' formatoptions', jednak okazuje się, że tak nie jest, co wydaje mi się wielkim nieszczęściem. –

+0

Na odwrót, jak wspomniano, jest zapewnienie prawidłowego ruchu. Czy możesz wymyślić rodzajowy (działający na komentarze w dowolnym języku, ewentualnie wykorzystując pewną zmienną, która oznacza bieżący lider komentarza) ruch, tak, że gdy znajdę się w takim bloku komentarza, przejdzie on na początek (gdy nie ma sąsiedniej skomentowanej linii * * powyżej **) tego bloku i zaznacza tekst do końca (gdy nie ma sąsiedniej skomentowanej linii ** poniżej **) tego bloku. To by naprawdę wystarczyło. –

3

Znaczenie obiektu tekstowego ip jest dość wąskie, jak zauważył @IngoKarkat: jest to po prostu dowolny akapit tekstowy ograniczony pustymi wierszami.

Utworzyłem też wtyczkę, której można użyć do rozwiązania tego problemu.

textobj-comment - Obiekty tekstowe komentarze

w przeciwieństwie do SameSyntaxMotion wtyczki, textobj-komentarzu polega na filetype specyficzne 'comments' ustawienie identyfikacji komentarze. Oznacza to, że powinien działać nawet przy wyłączonym podświetlaniu składni.

Użyj formatu gqic, aby sformatować komentarz.

Wskazówka: wolą gw niż gq, ponieważ zachowuje pozycję kursora.

+0

plus 1 za uwzględnienie linii instalacyjnych patogenu, więc mogłem wyciąć i wkleić je bezpośrednio do mojego terminala. przez fajne, jeśli może zostawić komentarze wiszące na końcu linii, a następnie wcięcie do tego miejsca – Orwellophile

0

Wiem, że trochę się spóźniłem na imprezę, ale znalazłem to pytanie, badając sam ten sam problem. Jak o..

zestaw formatprg = fmt \ prefix = '\ "'

Z tego gqip wydaje się zachowywać jak wymaga I z pewnością będą zatrzymywać się na zewnątrz wtyczki SameSyntaxMotion chociaż