2012-12-10 19 views
5

La configurazione di My Vim include set formatoptions=c,q,a. Sono completamente seccato con il seguente problema (| indica la posizione del cursore, la sua esatta posizione non importa, come probabilmente sapete solo il fatto della sua presenza in questo importa linea commentata):Vim: il comando "gq" per commenti hard-wrap, ma non il codice (anche se nessuna riga vuota è compresa nell'intervallo)

" 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 

Ora abbiamo colpito 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 

Quello che fa è - in realtà tratta l'intera cosa come un singolo paragrafo. (! Sì, lo so che la separazione con una riga vuota impedisce questo comportamento, ma non risolve il problema) Che cosa vorrei che fosse è davvero:

" 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 

In altre parole, sarebbe bello se gq potrebbe in qualche modo dimenticare il codice e lavorare solo con i commenti.

BONUS: come fare questo formattazione (avvolgimento commenti solo) su tutto il buffer in un colpo solo? Perché, idealmente, vorrei spostare quella roba in un gancio di formattazione speciale per il salvataggio dei file.

risposta

3

Con il mio SameSyntaxMotion plugin, è possibile utilizzare l'oggetto di testo ay per rappresentare l'intero blocco di commenti in cui si trova il cursore e riformattarlo utilizzando gqay.

+0

Sick stuff man, buon lavoro, grazie per aver condiviso questo plugin. Solo un'osservazione - è stato un po 'complicato installarlo a causa dell'imballaggio "vimball' da quando uso il patogeno. Inoltre, mi sento come un nome molto migliore sarebbe 'SyntaxGroupMotion', sarà molto più facile da trovare allora e più intuitivo. Ora una domanda - funziona bene con la mappatura di default 'y' e' Y', ma ho provato a rimapparlo con 'g' e' G' (seguendo quel "gruppo" mnemonico) e non ero fortunato. Qual è il trucco qui? –

+0

Ah, mi dispiace, lo rimappa a 'g'. Il problema era con la mappatura della combinazione come questo 'nnoremap gwag'. Fai attenzione, dovresti mapparlo come questo 'nmap gwag', altrimenti non può catturare la mappatura' g' del plugin. –

+0

Pollice in alto per un ottimo plugin ragazzi! : D –

2

Ricerca di righe di commento che utilizzano :g, quindi avvolgere quelle linee:

:%g/^"/normal gq_ 
+0

... e mappa questo comando! – Ves

+0

La tua soluzione racchiude le singole righe, mentre l'obiettivo principale era di avvolgere ** paragrafi ** di commenti - che è più generico.Un altro svantaggio è che hai codificato il leader di commento '" 'per VimL. È meglio trovare una soluzione generica, per qualsiasi linguaggio di programmazione (o almeno qualsiasi), che sia semplice se si ha accesso a una variabile che memorizza il leader di commento corrente. Io stesso non so qual'è il nome della variabile e se esiste. –

10

si tratta in realtà il tutto come un singolo paragrafo

Bene, con gqip, ti ha detto che a ! Devi scegliere la moto giusta. In questo caso di una singola riga, sarebbe gqq. Per 3 linee, è . Se ci sono troppe righe da contare, usa la modalità visiva: Vjjjjjjgq.

+0

Questo è qualcosa di contro-intuitivo in questo contesto. Ciò che Vim vuole veramente fare in questo caso è pensare a più righe di commenti (senza righe vuote intermedie) come paragrafi a se stanti, indipendentemente dal fatto che siano separate da righe vuote (sopra e sotto) dal codice. Il codice è codice, i commenti sono commenti. Contare quante righe di commenti avvolgere ogni volta è fastidioso e sprecare il proprio tempo, anche se sembra un'azione veloce - il tempo che in realtà tende ad accumulare si sa. C'è un modo in cui posso insegnare a Vim a trattare i commenti come un paragrafo, indipendentemente dalla separazione? –

+0

Mi aspettavo davvero di vedere un tale comportamento fuori dalla scatola a causa di 'q' in' formatoptions', tuttavia non risulta essere il caso, che è una grande disgrazia, penso. –

+0

L'altro modo, come hai detto, è di fornire un movimento corretto. Puoi venire con un movimento generico (che funziona per commenti in qualsiasi lingua, eventualmente utilizzando alcune variabili che denotano il commento corrente) in modo tale che quando sono all'interno di tale blocco commenti va all'inizio (quando non ci sono linee commentate adiacenti * * sopra **) di questo blocco e seleziona il testo fino alla fine (quando non ci sono linee commentate adiacenti ** sotto **) di questo blocco. Questo sarebbe davvero, fare il trucco. –

3

Il significato dell'oggetto di testo ip è piuttosto limitato, come sottolineato da @IngoKarkat: si tratta semplicemente di qualsiasi paragrafo del testo delimitato da righe vuote.

Ho anche creato un plugin che è possibile utilizzare per risolvere questo problema.

textobj-comment - oggetti di testo per i commenti

in contrasto con la SameSyntaxMotion plug-in, textobj-commento si basa sul 'comments' un'impostazione specifica per tipo di file per identificare i commenti. Ciò significa che dovrebbe funzionare anche con l'evidenziazione della sintassi disattivata.

Utilizzare gqic per formattare un commento.

Suggerimento per professionisti: Preferire gw su gq poiché mantiene la posizione del cursore.

+0

più 1 per includere le linee di installazione degli agenti patogeni, in modo da poterli tagliare e incollare direttamente nel mio terminale. di bello se potesse lasciare commenti appesi alla fine della linea, e quindi rientrare in quel punto – Orwellophile

0

So che sono un po 'in ritardo per la festa, ma ho trovato questa domanda mentre indagavo sullo stesso problema io stesso. Che ne dite di:..

set formatprg = fmt \ --prefix = '\ "'

Con questo gqip sembra comportarsi come richiesto sicuramente il check-out il plugin SameSyntaxMotion se