2012-02-29 18 views
12

Programowałem Pythona z Vimem przez jakiś czas, ale jedno, czego nie byłem w stanie wymyślić, jak to zrobić, ustawić automatyczne wcięcie na poziom ostatniego otwartego okna.Vim: Jak wgrać do otwartego okna lub klamry po naciśnięciu klawisza Enter?

Według pep8, jeśli masz otwartą parenkę i musisz przerwać linię, aby zmieścił się w 80 kolumnach, powinieneś kontynuować następną linię na tym otwartym polu. Przykład:

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

Oczywiście jest to szalony przykład, ale w ten sposób powinieneś przerwać linie w pythonie.

To, co naprawdę chciałbym móc zrobić, to skonfigurować Vima, tak aby po wpisaniu fit,<cr> umieścić kursor na następnej linii po prawej stronie otwartego okna, więc mogę po prostu wpisać on, itp. zamiast wcześniejszej kombinacji klawiszy <tab> i <space>.

Nie sądzę, bym kiedykolwiek ufał automatycznemu formatowaniu kodu Pythona w Vimie, ale również punktom dodatkowym, jeśli to też działa.

+1

Głosuję, aby zamknąć to pytanie jako niezwiązane z tematem, ponieważ powoduje to przyciąganie tylko linków. –

+0

Wtyczka [hynek/vim-python-pep8] (https://github.com/hynek/vim-python-pep8-indent) działa dobrze dla mnie. – Matt

+0

[Ydgrasil] (http://orchistro.tistory.com/236 "Ygdrasil") wydaje się mieć modyfikację dla pliku '.vim/indent/python.vim', który zrobi właśnie to. – BurntSushi5

Odpowiedz

0

Zastosowanie gq albo na całej wyboru wizualnym bloku lub o przepływie, jak gqq lub gqj

1

ten może być rafinowany trochę, ale powinien działać w 99% przypadków. Dodaj ten w swoim .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

Zostało ono zawarte w vim od 7.0 przynajmniej:

Zobacz następujący urywek z usr/share/vim/vim80/indent/python.vim (linia 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 
    ... 
Powiązane problemy