2012-02-29 18 views
12

Ho programmato Python con Vim per un po ', ma una cosa non sono riuscito a capire come farlo impostare il rientro automatico al livello dell'ultimo paren aperto.Vim: Come indentare un paren o una parentesi aperta quando si preme Invio?

Secondo pep8 se si dispone di un paren aperto e si deve interrompere la linea per adattarsi a 80 colonne, si suppone di continuare la riga successiva in quel paren aperto. Esempio:

calling_some_really_long_function(that, has, way, too, many, arguments, to, fit, 
            on, one, line) 

Ovviamente questo è un esempio di pazzesco, ma è così che si suppone di rompere le linee in python.

Quello che mi piacerebbe davvero essere in grado di fare è impostare Vim in modo che quando digito fit,<cr> e posizionerà il cursore sulla riga successiva proprio a destra del paren aperto, quindi posso semplicemente digitare on, ecc. al posto di alcune combinazioni di chiavi <tab> e <space>.

Non credo che mi fiderò mai dell'autoproduzione per codice Python in Vim ma punti bonus se anche questo funziona.

+1

Sto votando per chiudere questa domanda come off-topic perché questo attrae solo le risposte al link. –

+0

Il plugin [hynek/vim-python-pep8-indent] (https://github.com/hynek/vim-python-pep8-indent) funziona bene per me. – Matt

+0

[Ydgrasil] (http://orchistro.tistory.com/236 "Ygdrasil") sembra avere una modifica per il file '.vim/indent/python.vim' che farà proprio questo. – BurntSushi5

risposta

0

Usa gq, sia su tutta la selezione con un blocco VISUAL, oppure con un movimento, come gqq o gqj

1

Questo può essere raffinato un po ', ma dovrebbe funzionare il 99% del tempo. Aggiungere questo nel vostro Vimrc:

function! PythonEnterFunc() 
    let l:li = getline('.') 
    execute "normal! a\<Cr>" 
    if l:li =~ '([^)]*$' 
    let l:pos = stridx(l:li, '(') + 1 
    for i in range(l:pos) 
     execute "normal! a\<Space>" 
    endfor 
    endif 
endfunction 

au FileType python inoremap <Cr> <Esc>:call PythonEnterFunc()<CR>a 
0

E 'stato incluso in Vim dal V7.0 almeno:

Vedere il seguente frammento da usr/share/vim/vim80/indent/python.vim (linea 74) https://github.com/vim/vim/blob/master/runtime/indent/python.vim

function GetPythonIndent(lnum) 
    ... 
    " When inside parenthesis: If at the first line below the parenthesis add 
    " two 'shiftwidth', otherwise same as previous line. 
    " i = (a 
    "  + b 
    "  + c) 
    call cursor(a:lnum, 1) 
    let p = searchpair('(\|{\|\[', '', ')\|}\|\]', 'bW', 
     \ "line('.') < " . (a:lnum - s:maxoff) . " ? dummy :" 
     \ . " synIDattr(synID(line('.'), col('.'), 1), 'name')" 
     \ . " =~ '\\(Comment\\|Todo\\|String\\)$'") 
    if p > 0 
    if p == plnum 
     " When the start is inside parenthesis, only indent one 'shiftwidth'. 
     let pp = searchpair('(\|{\|\[', '', ')\|}\|\]', 'bW', 
     \ "line('.') < " . (a:lnum - s:maxoff) . " ? dummy :" 
     \ . " synIDattr(synID(line('.'), col('.'), 1), 'name')" 
     \ . " =~ '\\(Comment\\|Todo\\|String\\)$'") 
     if pp > 0 
    return indent(plnum) + (exists("g:pyindent_nested_paren") ? eval(g:pyindent_nested_paren) : shiftwidth()) 
     endif 
     return indent(plnum) + (exists("g:pyindent_open_paren") ? eval(g:pyindent_open_paren) : (shiftwidth() * 2)) 
    endif 
    if plnumstart == p 
     return indent(plnum) 
    endif 
    return plindent 
    endif 
    ... 
Problemi correlati