2015-12-03 7 views
9

Załóżmy, że mam listy ciągów znaków w pliku (skrypt Pythona, na przykład) tak:vim: GQ ignoruje otwarte cytaty podczas zawijania tekstu

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

Jeśli zrobię wizualny wybór tego tekstu mogę użyć gq zawinąć tekst dostać:

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

Jednakże element "nine ten" jest teraz podzielona na pół na dwie linie.

Jak zawinąć tekst, unikając wprowadzania znaku nowej linii wewnątrz otwartego cytatu? Mój pożądany rezultat będzie wyglądać następująco:

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

Vim nie może tego zrobić; musielibyśmy podać kod, żeby to zrobić. ': help fp' (zewnętrzny formater) i': help fex' (vimscript formatter) po więcej szczegółów. – Amadan

+1

Wygląda na to, że użycie 'gq' nie będzie miało wcięcia w twoim przykładzie, prawda? Przy okazji, jeśli chcesz uzyskać pożądany wynik, ustaw kursor w pierwszej linii, spróbuj '4JjJ' –

+0

@ lord63.j Dzięki za twój wkład. 'gq' będzie wcięte, jeśli ustawisz': filetype plugin on', ': filetype indent on' i': set ft = python'. '4JjJ' z pewnością wykonuje tę pracę, ale wymagałoby to ode mnie ustalenia, ile linii przyniosłoby linię do 80 znaków. – christoph

Odpowiedz

1

Nie sądziłem, że nie jest zarezerwowanym polecenie, aby to zrobić, ale możemy to zrobić przez uczynić go do jednej linii, a następnie przez regex, aby go złamać Twoje życzenie.

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

Po prostu zamapuj całość w klucz. aby ci ułatwić.

+0

Dzięki za wysiłek, ale niestety nie robi dokładnie to, co chcę. Jeśli tekst w cudzysłowie jest krótki, chciałbym więcej "słów" w każdej linii, a jeśli są dłuższe, chciałbym mniej - podczas gdy to po prostu umieszcza trzy w każdej linii. – christoph

0

Zapisz ten skrypt w pliku i załaduj go do swojego vima.

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 

blok tekst i wciśnij klawisz "a"