Eri*_*eth 14
所以,我之前从未做过任何Vim脚本,但是基于这个关于在C中做类似事情的问题以及这个提示来检查你目前是否正在发表评论,我已经破解了一个解决方案.
默认情况下,这使用PEP8建议的正常行宽度为79个字符,注释为72个字符,但您可以分别通过letting 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
Run Code Online (Sandbox Code Playgroud)
接受的答案很棒!然而,它不支持我格式化/编辑注释的习惯:我进行编辑然后使用 gqj 命令,它本质上是“重新格式化当前行与下一行”。然后我点击“。” 对每一行重复该操作(命令本身将光标移到下一行)。我不太了解 vim 脚本语言,所以有人可以在接受的答案中添加对此的支持。同时,我所做的是映射一个功能键 (F6) 以将 textwidth 更改为 72,格式化该行,然后将 textwidth 更改回 79。
nmap <F6> :set textwidth=72<CR>gqj:set textwidth=79<CR>
Run Code Online (Sandbox Code Playgroud)
现在,当我在文档字符串中时,我只需进行编辑(ESC),然后反复按 F6,直到所有行都正确格式化。
我将我的地图命令和接受的答案脚本添加到了我的 .vim/after/ftplugin/python.vim。