Usando uma largura de texto mais curta em comentários e documentos
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?
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 let
Ting 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.