如何修复Vim在Python中长行的换行行为?

jsd*_*ton 7 python vim pep8

所以这是我的问题.假设我有一个Python文件,我输入的行很长,就像最后一行一样:

class SomeClass(object):
  def some_method(self):
    some_variable = SomeOtherClass.some_other_method(some_parameter=some_value)
Run Code Online (Sandbox Code Playgroud)

当我在Vim中键入它时,会发生这种情况:

class SomeClass(object):
  def some_method(self):
    some_variable =
    SomeOtherClass.some_other_method(some_parameter=some_value)
Run Code Online (Sandbox Code Playgroud)

这不仅仅是糟糕的风格,它打破了PEP8.我想要发生的是:

class SomeClass(object):
  def some_method(self):
    some_variable = SomeOtherClass.some_other_method(
        some_parameter=some_value)
Run Code Online (Sandbox Code Playgroud)

这符合PEP8.(为了讨论的目的,我只对换行行为感兴趣,而不是缩进行为.)

编辑: breakat仅与linebreak控制线的显示方式配合使用.它(显然)不与textwidth确定插入硬线断裂的位置一起工作.所以我的想法不起作用......

令人惊讶的是,我没有发现任何迹象表明其他人分享了这个问题,这让我觉得我做错了什么.然而,我的想法是把添加(字符的breakat设置(连同[{,而我是在它).

我试过这个; 这是输出:set breakat:

breakat= ^I!@*-+;:,./?([{
Run Code Online (Sandbox Code Playgroud)

但是,这无济于事.无论我做什么,Vim坚持在上面的"="之后打破.我也有同样的问题,长函数名称,它会在之后突破def.

以下是我的.vimrc的完整内容:

set nobackup
set nowritebackup
set noswapfile
set columns=80
set tabstop=4
set shiftwidth=4
set softtabstop=4
set autoindent
set smarttab
set smartindent
set textwidth=80
set wrap
set breakat=\ ^I!@*-+;:,./?\(\[\{
filetype indent on
filetype on
filetype plugin on
Run Code Online (Sandbox Code Playgroud)

(我没有安装插件等,试图解决这个问题.)

有没有人知道如何让Vim服从我的破坏设置,或任何其他关于处理这种行为的最佳方法的想法?

Spe*_*bun 3

您没有设置换行符。没有它,vim 会忽略breakat 变量。请参阅此处了解详细信息以及许多 vim 优点。另请注意,您需要设置 nolist,因为它会破坏换行符。

另一篇关于自动换行的博客文章在这里。这篇文章指出,某些文件类型不会自动包含格式选项“t”标志。没有它,就不会发生自动换行。

我认为最简单的做法是添加要运行的映射:%! pythonTidypythonTidy是一个 Python 脚本,用于在 stdIn 上获取 python 代码并将漂亮的版本输出到 stdOut。通过该映射,它将允许您在当前文件上运行它,并用重新格式化的版本替换整个内容。添加一个自动命令,以便在每次退出 python 文件中的插入模式时运行它,并且应该进行设置。