2012-02-29 18 views
12

He estado programando Python con Vim por un tiempo, pero una cosa que no he podido descifrar cómo hacerlo es establecer la sangría automática al nivel de la última página abierta.Vim: ¿Cómo sangría a una paren abierta o un corchete al presionar enter?

De acuerdo con pep8 si tiene un paréntesis abierto y necesita romper la línea para caber en 80 columnas, se supone que debe continuar con la siguiente línea en ese paréntesis abierto. Ejemplo:

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

Obviamente, esto es un ejemplo loca, pero eso es lo que se supone que romper sus líneas en Python.

Lo que realmente me gustaría poder hacer es configurar Vim para que cuando escribo fit,<cr> y coloque el cursor en la siguiente línea justo a la derecha de la página abierta, así que puedo escribir on, etc. en lugar de una combinación de claves <tab> y <space> de antemano.

No creo que alguna vez confíe en el auto-formateador para el código python en Vim, pero puntos de bonificación si eso también funciona.

+1

Votaré para cerrar esta pregunta como fuera de tema porque esto está atrayendo solo respuestas de enlace. –

+0

El complemento [hynek/vim-python-pep8-indent] (https://github.com/hynek/vim-python-pep8-indent) funciona bien para mí. – Matt

+0

[Ydgrasil] (http://orchistro.tistory.com/236 "Ygdrasil") parece tener una modificación para el archivo '.vim/indent/python.vim' que hará justamente esto. – BurntSushi5

Respuesta

0

Uso gq, ya sea sobre toda la selección con un bloque VISUAL, o con un movimiento, como gqq o gqj

1

Esto puede ser refinado un poco, pero debe trabajar 99% del tiempo. Añadir esto en su .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

Se ha incluido en Vim desde V7.0 al menos:

Ver el siguiente fragmento de usr/share/vim/vim80/indent/python.vim (línea 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 
    ... 
Cuestiones relacionadas