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é?

26
demandé sur Roman Konoval 2010-10-26 23:22:30

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 letting 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
14
répondu Eric Naeseth 2017-05-23 12:09:13

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.

4
répondu twildfarmer 2015-02-12 17:56:51