Подтвердить что ты не робот

Vim: используйте более короткую текстовую ширину в комментариях и docstrings

От могучего PEP 8:

[P] лизинг ограничивает все строки не более 79 символами. Для потоков длинных блоков текста (docstrings или comments) рекомендуется ограничить длину до 72 символов.

При редактировании кода Python в Vim я устанавливаю textwidth в 79, и Vim автоматически обматывает длинные строки кода Python для меня, когда я нажимаю ограничение персонажа.

Но в комментариях и docstrings мне нужно обернуть текст вместо 72 символов. Есть ли способ заставить Vim автоматически установить textwidth на 72, когда я в комментарии или docstring, и вернул его, когда закончите?

4b9b3361

Ответ 1

Итак, я никогда не делал никаких сценариев Vim раньше, но на основе этого вопроса о выполнении чего-то подобного в C и этот совет для проверки, если вы в настоящее время комментируете, я взломал решение.

По умолчанию для стандартных строк используется предложенная PEP8 ширина 79 символов для обычных строк и 72 символа для комментариев, но вы можете переопределить их с помощью переменных let ting g:python_normal_text_width или g:python_comment_text_width, соответственно. (Лично я обертываю обычные строки с 78 символами.)

Отбросьте этого ребенка в ваш .vimrc, и вам должно быть хорошо идти. Я могу упаковать это как плагин позже.

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

Ответ 2

Принятый ответ велик! Однако он не поддерживает привычку, которую я использую для форматирования/редактирования комментариев: я делаю свои изменения, а затем использую команду gqj, которая по существу "переформатирует текущую строку в сочетании со следующей". Затем я ударил '.' повторить это для каждой строки (сама команда продвигает курсор к следующей строке). Я не очень хорошо знаю язык сценариев vim, поэтому кто-то может добавить поддержку этому к принятому ответу. Тем временем, что я сделал, сопоставьте функциональный ключ (F6), чтобы изменить текстовую ширину на 72, отформатировать строку и затем изменить текстовую ширину на 79.

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

Теперь, когда я нахожусь в docstring, я просто делаю редактирование (ESC), а затем нажимаю F6 до тех пор, пока все строки не будут правильно отформатированы.

Я добавил команду map и принятый ответ script в мой .vim/after/ftplugin/python.vim.