28

来自强大的PEP 8

[P]lease 将所有行限制为最多 79 个字符。对于流动的长文本块(文档字符串或注释),建议将长度限制为 72 个字符。

在 Vim 中编辑 Python 代码时,我将 my 设置textwidth为 79,当我达到字符限制时,Vim 会自动为我包装长行 Python 代码。但在注释和文档字符串中,我需要将文本换成 72 个字符。

当我在评论或文档字符串中时,有什么方法可以让 Vim 自动设置textwidth为 72,并在我完成后将其设置回来?

4

2 回答 2

16

所以,我以前从来没有做过任何 Vim 脚本,但是基于这个关于在 C 中做类似事情的问题这个检查你当前是否在评论中的提示,我已经破解了一个解决方案。

默认情况下,这使用 PEP8 建议的 79 个字符用于普通行和 72 个字符用于注释的宽度,但您可以分别通过lettingg:python_normal_text_widthg: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
于 2010-10-26T22:04:01.217 回答
6

接受的答案很棒!但是,它不支持我格式化/编辑注释的习惯:我进行编辑,然后使用 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 中。

于 2015-02-12T17:56:51.577 回答