En utilisant textwidth plus court dans les commentaires et docstrings
Question
De la puissante PEP 8 :
[P] limite de bail toutes les lignes jusqu'à un maximum de 79 caractères. Pour couler de longs blocs de texte (docstrings ou commentaires), ce qui limite la longueur de 72 caractères est recommandée.
Lors de l'édition du code Python dans Vim, je tournerai ma textwidth
à 79, et passe automatiquement de longues Vim lignes de code Python pour moi quand je frappe la limite de caractères. Mais dans les commentaires et docstrings, je dois envelopper le texte à 72 caractères au lieu.
Y at-il moyen de faire Vim textwidth
automatiquement réglé sur 72 quand je suis dans un commentaire ou docstring, et mettez-le quand je suis fait?
La solution
Alors, je ne l'ai jamais fait de scripts avant Vim, mais d'après cette question de faire quelque chose de similaire en C et cette astuce pour vérifier si vous êtes actuellement dans un commentaire , j'ai piraté ensemble une solution.
Par défaut, il utilise les largeurs suggérées pep8-de 79 caractères pour les lignes normales et 72 caractères pour commentaires, mais vous pouvez les remplacer par let
ting variables g:python_normal_text_width
ou g:python_comment_text_width
, respectivement. (Personnellement, j'envelopper des lignes normales à 78 caractères).
Déposez ce bébé dans votre .vimrc et vous devriez être bon d'aller. Je peux emballer cela comme un plug-in 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
Autres conseils
La réponse acceptée est grande! Il n'a pas, cependant, soutenir l'habitude que j'ai pour formater / éditer les commentaires: je fais mes modifications puis utilisez la commande gqj, qui est essentiellement, « reformater la ligne courante combinée à la prochaine ». Puis je frappe. » à répéter pour chaque ligne (la commande se déplace le curseur à la ligne suivante). Je ne connais pas le langage de script vim très bien, si quelqu'un peut être en mesure d'ajouter le support pour cela à la réponse acceptée. En attendant, ce que je l'ai fait est de changer la carte à 72 la largeur du texte, formater la ligne, puis changer l'arrière textwidth à 79 une touche de fonction (F6).
nmap <F6> :set textwidth=72<CR>gqj:set textwidth=79<CR>
Maintenant, quand je suis dans un docstring, je viens de faire le modifier, (ESC) et puis appuyez sur F6 jusqu'à ce que toutes les lignes sont correctement formatées.
J'ai ajouté ma commande carte et le script de réponse acceptée à mon .vim / après / ftplugin / python.vim.