Używanie krótszych textwidth w komentarzach i docstringach

From The mighty PEP 8:

[P]dzierżawa ogranicza wszystkie linie do maksymalnie 79 znaków. Do przesyłania długich bloków tekstu (docstringi lub komentarze) zaleca się ograniczenie długości do 72 znaków.

Podczas edycji kodu Pythona w Vimie ustawiłem mój textwidth Na 79, A Vim automatycznie zawija długie linie kodu Pythona dla mnie, gdy osiągnę limit znaków. Ale w komentarzach i docstringach muszę zamiast tego zawinąć tekst na 72 znaki.

Czy jest jakaś sposób, aby vim automatycznie ustawić textwidth Na 72, gdy jestem w komentarzu lub docstringu, i ustawić go z powrotem, gdy skończę?

Author: Roman Konoval, 2010-10-26

2 answers

Nigdy wcześniej nie robiłem żadnych skryptów Vim, ale bazując na to pytanie o zrobienie czegoś podobnego w C i Ta wskazówka do sprawdzenia, czy jesteś obecnie w komentarzu , zhakowałem rozwiązanie.

Domyślnie używa szerokości sugerowanej przez PEP8 79 znaków dla zwykłych linii i 72 znaków dla komentarzy, ale można je zastąpić odpowiednio zmiennymi let ting g:python_normal_text_width lub g:python_comment_text_width. (Osobiście zawijam normalne linie na 78 postaci.)

Wrzuć to dziecko do swojego .vimrc i powinieneś być gotowy. Mogę spakować to jako wtyczkę później.

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
Author: Eric Naeseth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:09:13

Przyjęta odpowiedź jest świetna! Nie obsługuje jednak nawyku formatowania / edycji komentarzy: dokonuję edycji, a następnie używam polecenia gqj, które jest zasadniczo "sformatuj bieżącą linię połączoną z następną". Potem Uderzyłem.'aby powtórzyć to dla każdego wiersza (samo polecenie przesuwa kursor do następnego wiersza). Nie znam zbyt dobrze języka skryptowego vim, więc może ktoś będzie w stanie dodać wsparcie dla tego do zaakceptowanej odpowiedzi. W międzyczasie, to co zrobiłem to Mapuj klawisz funkcyjny (F6), aby zmienić textwidth na 72, sformatuj linię, a następnie zmień textwidth z powrotem na 79.

nmap <F6> :set textwidth=72<CR>gqj:set textwidth=79<CR>

Teraz, Kiedy jestem w docstringu, po prostu robię edycję, (ESC), a następnie wciskam F6 wielokrotnie, aż wszystkie linie są poprawnie sformatowane.

Dodałem moje polecenie map i zaakceptowany skrypt odpowiedzi do mojego .vim / after / ftplugin / python.vim.

 4
Author: twildfarmer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-12 17:56:51