2015-12-03 19 views
9

Supponiamo che ho una lista di stringhe in un file (uno script Python, per esempio) in questo modo:vim: GQ ignora le virgolette aperte Quando A capo automatico

my_list_of_numbers = ["one two", 
    "three four", 
    "five six", 
    "seven eight", 
    "nine ten", 
    "eleven twelve"] 

Se faccio una selezione visuale di questo testo, posso usare gq per avvolgere il testo per ottenere:

my_list_of_numbers = ["one two", "three four", "five six", "seven eight", "nine 
    ten", "eleven twelve"] 

Tuttavia, l'elemento "nine ten" è ora diviso a metà su due righe.

Come si avvolge il testo evitando di inserire un carattere di fine riga all'interno di una quota aperta? Il mio risultato desiderato sarebbe simile a questa:

my_list_of_numbers = ["one two", "three four", "five six", "seven eight", 
    "nine ten", "eleven twelve"] 
+6

Vim non può farlo colpito; dovresti dargli il codice per farlo. ': help fp' (formattatore esterno) e': help fex' (formattatore di vimscript) per maggiori dettagli. – Amadan

+1

Sembra che usare 'gq' non abbia il rientro nel tuo esempio, giusto? A proposito, se vuoi ottenere il risultato desiderato, metti il ​​cursore in prima linea, prova "4JjJ' –

+0

@ lord63.j Grazie per il tuo contributo. 'gq' indenterà se si imposta': plugin per il tipo di file su', ': per il rientro del tipo di file 'e': set per ft = python'. '4JjJ' sicuramente fa il lavoro ma mi richiederebbe di capire nella mia testa quante linee porterebbero la linea fino a 80 caratteri. – christoph

risposta

1

Io non credo che ci sia un comando riservato per fare questo, ma possiamo farlo rendono ad una linea e poi da regex, rompere a il tuo desiderio desiderato

%s/\(.\{-}".\{-}".\{-}".\{-}".\{-}".\{-}".\{-}\)"/\1\r"/gec 

mappare l'intera cosa in una chiave. in modo da renderti facile.

+0

Grazie per lo sforzo ma sfortunatamente questo non fa esattamente quello che voglio. Se il testo tra virgolette è breve, vorrei più "parole" su ogni riga, e se sono più lunghe vorrei meno - mentre questo mette solo tre su ogni riga. – christoph

0

Si prega di salvare questo script in un file e caricare il tuo vim.

vnoremap a d:call Replace(@")<CR> 


function! Replace(arg1, ...) 
      let Var = Myfun(a:arg1) 
       call append(line('.') - 1, [Var]) 
       silent! %s/@@[email protected]@/ /g 
       silent! %s/@[email protected]/\r/g 
endfunc                  

function! Myfun(s) 
      let Var = a:s 
       let Var = substitute(Var, '\n', '@@[email protected]@', 'g') 
       let Var = substitute(Var, '\s\s*', ' ', 'g') 
       let Varlength = strlen(substitute(Var, '\(.\{-}\".\{-}\"\,.\{-}\".\{-}\"\,.\{-}\".\{-}\"\,\)', '\1', 'g')) 
       if Varlength < 120 
       let Var = substitute(Var, '\(.\{-}\".\{-}\"\,.\{-}\".\{-}\"\,.\{-}\".\{-}\"\,\)', '\[email protected][email protected]', 'g') 
       else 
       let Var = substitute(Var, '\(.\{-}\".\{-}\"\,.\{-}\".\{-}\"\,\)', '\[email protected][email protected]', 'g') 
       endif 
      return Var 
endfunc 

blocco di testo e la chiave "a"

Problemi correlati