2012-02-29 2 views
12

Я программировал Python с Vim на некоторое время, но одна вещь, которую я не смог понять, как это сделать, устанавливает его в автоматический отступ до уровня последнего открытого пара.Vim: Как отступать к открытому парку или скобке при попадании?

В соответствии с pep8, если у вас открытый парен, и вам нужно разбить линию, чтобы она соответствовала 80 столбцам, тогда вы должны продолжить следующую строку в этом открытом паре. Пример:

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

Очевидно, что это сумасшедший пример, но это, как вы должны разорвать свои строки в Python.

То, что я действительно хотел бы сделать, это настроить Vim так, что когда я нахожу fit,<cr>, и он поместит мой курсор на следующую строку справа от открытого пара, поэтому я могу просто набрать on, и т. д. вместо некоторой комбинации <tab> и <space> ключей заранее.

Я не думаю, что когда-либо буду доверять автоформаттеру для кода python в Vim, но бонусные баллы, если это тоже работает.

+1

Я голосую, чтобы закрыть этот вопрос как вне темы, потому что это привлекает только ссылки. –

+0

Плагин [hynek/vim-python-pep8-indent] (https://github.com/hynek/vim-python-pep8-indent) хорошо работает для меня. – Matt

+0

[Ydgrasil] (http://orchistro.tistory.com/236 «Ygdrasil»), похоже, имеет модификацию для файла '.vim/indent/python.vim', который будет делать именно это. – BurntSushi5

ответ

0

Использование gq, либо по всей селекции с использованием визуального блока, или с движением, как gqq или gqj

1

Это может быть уточнена немного, но должен работать 99% времени. Добавьте это в вашем .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

Он был включен в Vim, так как V7.0, по крайней мере:

Смотрите следующий фрагмент из usr/share/vim/vim80/indent/python.vim (строка 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 
    ...