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?

Était-ce utile?

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 letting 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top