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

9

以下是我的问题。假设我有一个Python文件,我正在输入一行非常长的代码,就像这里的最后一行:

class SomeClass(object):
  def some_method(self):
    some_variable = SomeOtherClass.some_other_method(some_parameter=some_value)

当我在Vim中输入这个时,会发生这样的事情:
class SomeClass(object):
  def some_method(self):
    some_variable =
    SomeOtherClass.some_other_method(some_parameter=some_value)

这不仅是糟糕的风格,而且违反了PEP8规范。我希望发生的事情是:

class SomeClass(object):
  def some_method(self):
    some_variable = SomeOtherClass.some_other_method(
        some_parameter=some_value)

这与PEP8保持一致。(为了讨论,我只关注换行行为,而不是缩进行为。)

编辑:breakat仅在与linebreak结合使用时才起作用,以控制如何显示行。它似乎不能与textwidth结合使用以确定插入硬换行的位置。所以我的想法不会奏效…

令人惊讶的是,我没有发现其他人分享这个问题,这让我认为我做错了什么。尽管如此,我的想法是将(字符添加到breakat设置中(同时还包括[{)。

我已经尝试过这个方法;这是:set breakat的输出:

breakat= ^I!@*-+;:,./?([{

然而,这没有用。无论我做什么,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

我没有安装任何插件等来解决这个问题。

有人知道如何让Vim遵守我的breakat设置吗?或者有其他的想法来处理这种行为吗?


在我的回答中添加了关于PythonTidy的注释。 - Spencer Rathbun
1个回答

3
你没有设置换行符。没有它,vim会忽略breakat变量。详情请参见这里,以及许多vim技巧。还要注意需要设置nolist,因为它会破坏linebreak。
另一篇博客文章涉及自动换行在这里。该文章指出,某些文件类型不会自动包含格式选项“t”标志。没有它,自动换行就不会发生。
我认为最简单的方法是添加一个映射来运行:%!pythonTidypythonTidy是一个用Python编写的脚本,用于将Python代码输入stdIn并输出漂亮的版本到stdOut。有了这个映射,它将允许你在当前文件上运行它,并用重新格式化的版本替换整个内容。在Python文件中退出插入模式时添加一个autocommand,你就可以开始了。

嗯,我尝试了set linebreakset nolist,但对我没有用。实际上,我甚至尝试从breakat中删除空格字符,但这并没有改变行为。当我正在输入一行长文本时,无论我做什么,Vim都会在空格处强制换行... - jsdalton
由于他提到了PEP8,我认为他想要硬换行,即没有超过80个字符的行。然而,我更愿意使用100个字符的行 - 80个字符相当短,特别是如果您有一些硬编码字符串 - 而且现在几乎没有人真正限制于80个字符的终端宽度。 - ThiefMaster
我并不限制在79个字符内;但我使用垂直分割来同时查看多个源文件(或同一文件的多个位置),当该列有断点时,我发现阅读起来更容易。如果我真的需要处理许多单独的文件,我可以减小字体大小并获得三个分割!100列永远不会与垂直分割很好地配合。 - SingleNegationElimination
@SpencerRathbun 感谢您的回答和评论;我很遗憾地相信您是正确的。对于Python文件,我可能会将textwidth设置为0,并使用类似于colorcolumn的东西来视觉标记长行,除非有人提供替代方案。 - jsdalton
@jsdalton 没问题。您可能想要检查一下我添加的 pythonTidy 部分。为其添加自动命令是 vim 能够轻松完成的任务。获取脚本,将其运行在您的代码上,并查看是否喜欢它。如果您需要帮助设置自动命令,可以提出另一个问题。 - Spencer Rathbun
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接