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

9 投票
1 回答
4413 浏览
提问于 2025-04-17 03:43

我遇到了一些问题。假设我有一个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设置,或者有什么好的方法来处理这种行为?

1 个回答

3

你没有设置换行。没有这个设置,vim就会忽略breakat这个变量。想了解更多,可以查看这里,里面有很多关于vim的好东西。另外,你还需要设置nolist,因为它会影响换行的效果。

还有一篇关于自动换行的博客文章,可以在这里找到。这篇文章提到,有些文件类型不会自动包含格式选项的“t”标志。如果没有这个标志,自动换行就不会生效。

我觉得最简单的方法是添加一个映射来运行:%! pythonTidypythonTidy是一个用python写的脚本,可以把输入的python代码格式化成好看的版本并输出。通过这个映射,你可以在当前文件上运行它,并用重新格式化的内容替换整个文件。再加一个自动命令,让它在你退出插入模式时自动运行,这样就可以了。

撰写回答