Использование более короткой текстовой пропускания в комментариях и DocStrings

StackOverflow https://stackoverflow.com/questions/4027222

  •  26-09-2019
  •  | 
  •  

Вопрос

От могущественного PEP 8.:

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

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

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

Это было полезно?

Решение

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

По умолчанию это использует ширины PEP8, предложенные 79 символов для нормальных линий и 72 символов для комментариев, но вы можете переопределить их letтинг 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

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top