Utilisation de textwidth plus court dans les commentaires et docstrings
Du puissant PEP 8:
[P] location limite toutes les lignes à un maximum de 79 caractères. Pour les longs blocs de texte (docstrings ou comments), il est recommandé de limiter la longueur à 72 caractères.
Lors de l'édition de code Python dans Vim, je mets mon textwidth
à 79, et Vim encapsule automatiquement de longues lignes de code Python pour moi lorsque j'atteint la limite de caractères. Mais dans les commentaires et docstrings, j'ai besoin d'envelopper le texte à 72 caractères à la place.
Y en a-t-il façon de faire en sorte que Vim définisse automatiquement textwidth
à 72 quand je suis dans un commentaire ou docstring, et de le remettre quand j'ai terminé?
2 réponses
Donc, je n'ai jamais fait de script Vim auparavant, mais basé sur cette question sur faire quelque chose de similaire dans C et Cette astuce pour vérifier si vous êtes actuellement dans un commentaire , j'ai piraté une solution.
Par défaut, cela utilise les largeurs suggérées par PEP8 de 79 caractères pour les lignes normales et de 72 caractères pour les commentaires, mais vous pouvez les remplacer par des variables let
ting g:python_normal_text_width
ou g:python_comment_text_width
, respectivement. (Personnellement, j'enroule les lignes normales à 78 caractère.)
Déposer ce bébé dans votre .vimrc et vous devriez être prêt à partir. Je peux emballer cela en tant que plugin plus tard.
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
La réponse acceptée est géniale! Il ne supporte cependant pas l'habitude que j'ai pour le formatage / l'édition des commentaires: je fais mes modifications et utilise ensuite la commande gqj, qui est essentiellement, "reformater la ligne actuelle combinée avec la suivante". Puis j'ai frappé '.'pour répéter cela pour chaque ligne (la commande elle-même avance le curseur sur la ligne suivante). Je ne connais pas très bien le langage de script vim, donc quelqu'un peut être en mesure d'ajouter un support pour cela à la réponse acceptée. En attendant, ce que j'ai fait est mappez une touche de fonction (F6) pour changer la largeur de texte à 72, formatez la ligne, puis changez la largeur de texte à 79.
nmap <F6> :set textwidth=72<CR>gqj:set textwidth=79<CR>
Maintenant, quand je suis dans une docstring, je fais juste l'édition, (ESC) et puis appuie sur F6 à plusieurs reprises jusqu'à ce que toutes les lignes soient correctement formatées.
J'ai ajouté ma commande map et le script de réponse accepté à mon .vim/après/ftplugin/python.vim.