来自强大的PEP 8:
[P]租约将所有行限制为最多79个字符。对于流动的长文本块(文档字符串或注释),建议将长度限制为72个字符。
在Vim中编辑Python代码时,我将textwidth
设置为79,当我达到字符限制时,Vim会自动为我包装长行的Python代码。但是在评论和文档字符串中,我需要将文本换成72个字符。
当我在评论或文档字符串中时,有没有办法让Vim自动将textwidth
设置为72,并在我完成后将其设置回来?
答案 0 :(得分:14)
所以,我以前从未做过任何Vim脚本,但是基于this question about doing something similar in C和this tip for checking if you're currently in a comment,我已经将解决方案混为一谈。
默认情况下,这使用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
答案 1 :(得分:4)
接受的答案很棒!但是,它不支持我对格式化/编辑注释的习惯:我进行编辑然后使用gqj命令,基本上,"重新格式化当前行与下一个"。然后我点击了。'。为每一行重复一次(命令本身将光标前进到下一行)。我不太了解vim脚本语言,因此有人可能会将此支持添加到已接受的答案中。与此同时,我所做的是映射一个功能键(F6)将textwidth更改为72,格式化该行,然后将textwidth更改回79.
nmap <F6> :set textwidth=72<CR>gqj:set textwidth=79<CR>
现在,当我在文档字符串中时,我只是进行编辑,(ESC)然后重复按F6,直到所有行格式正确。
我将我的map命令和接受的答案脚本添加到我的.vim / after / ftplugin / python.vim。