Использование более короткой текстовой пропускания в комментариях и DocStrings
Вопрос
От могущественного 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.