Использование более короткой ширины текста в комментариях и строках документов - PullRequest
26 голосов
/ 26 октября 2010

Из могучего PEP 8 :

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

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

Есть ли способ заставить Vim автоматически установить textwidth равным 72, когда я в комментарии или строке документации, и установить его обратно, когда я закончу?

Ответы [ 2 ]

14 голосов
/ 27 октября 2010

Итак, я никогда раньше не создавал сценариев 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
4 голосов
/ 12 февраля 2015

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

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

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

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

...