Pergunta

Do poderoso PEP 8:

P] Limitar todas as linhas a um máximo de 79 caracteres. Para blocos longos de texto que fluem (documentos ou comentários), é recomendado limitar o comprimento a 72 caracteres.

Ao editar o código python em vim, eu defino meu textwidth para 79, e o VIM envolve automaticamente as longas linhas de código Python para mim quando eu atingi o limite do caractere. Mas em comentários e documentos, preciso envolver o texto em 72 caracteres.

Existe alguma maneira de fazer o vim definido automaticamente textwidth Para 72, quando estou em um comentário ou docstring, e retiro -o quando terminar?

Foi útil?

Solução

Então, eu nunca fiz nenhum script de vim antes, mas com base em Esta pergunta sobre fazer algo semelhante em c e Esta dica para verificar se você está atualmente em um comentário, Eu invadi uma solução.

Por padrão, isso usa as larguras sugeridas por Pep8 de 79 caracteres para linhas normais e 72 caracteres para comentários, mas você pode substituí-los por letTing g:python_normal_text_width ou g:python_comment_text_width variáveis, respectivamente. (Pessoalmente, envolvo linhas normais em 78 caracteres.)

Solte este bebê em seu .vimrc E você deve estar pronto para ir. Posso empacotar isso como um plug -in mais tarde.

function! GetPythonTextWidth()
    if !exists('g:python_normal_text_width')
        let normal_text_width = 79
    else
        let normal_text_width = g:python_normal_text_width
    endif

    if !exists('g:python_comment_text_width')
        let comment_text_width = 72
    else
        let comment_text_width = g:python_comment_text_width
    endif

    let cur_syntax = synIDattr(synIDtrans(synID(line("."), col("."), 0)), "name")
    if cur_syntax == "Comment"
        return comment_text_width
    elseif cur_syntax == "String"
        " Check to see if we're in a docstring
        let lnum = line(".")
        while lnum >= 1 && (synIDattr(synIDtrans(synID(lnum, col([lnum, "$"]) - 1, 0)), "name") == "String" || match(getline(lnum), '\v^\s*$') > -1)
            if match(getline(lnum), "\\('''\\|\"\"\"\\)") > -1
                " Assume that any longstring is a docstring
                return comment_text_width
            endif
            let lnum -= 1
        endwhile
    endif

    return normal_text_width
endfunction

augroup pep8
    au!
    autocmd CursorMoved,CursorMovedI * :if &ft == 'python' | :exe 'setlocal textwidth='.GetPythonTextWidth() | :endif
augroup END

Outras dicas

A resposta aceita é ótima! No entanto, não apoia o hábito que tenho para formatar/editar comentários: faço minhas edições e depois uso o comando GQJ, que é essencialmente, "reformate a linha atual combinada com a próxima". Então eu bati '.' para repetir isso para cada linha (o próprio comando avança o cursor para a próxima linha). Não conheço muito bem a linguagem de script de vim, para que alguém possa adicionar suporte a isso à resposta aceita. Enquanto isso, o que fiz é mapear uma chave de função (f6) para alterar a largura de texto para 72, formatar a linha e depois alterar a largura de texto de volta para 79.

nmap <F6> :set textwidth=72<CR>gqj:set textwidth=79<CR>

Agora, quando estou em uma documentação, eu apenas faço a edição (ESC) e depois bati no F6 repetidamente até que todas as linhas estejam adequadamente formatadas.

Adicionei meu comando do mapa e o script de resposta aceita para o meu .vim/depois/ftplugin/python.vim.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top