如何修复Vim在Python中对长行的换行行为?
我遇到了一些问题。假设我有一个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 个回答
你没有设置换行。没有这个设置,vim就会忽略breakat这个变量。想了解更多,可以查看这里,里面有很多关于vim的好东西。另外,你还需要设置nolist,因为它会影响换行的效果。
还有一篇关于自动换行的博客文章,可以在这里找到。这篇文章提到,有些文件类型不会自动包含格式选项的“t”标志。如果没有这个标志,自动换行就不会生效。
我觉得最简单的方法是添加一个映射来运行:%! pythonTidy
。pythonTidy是一个用python写的脚本,可以把输入的python代码格式化成好看的版本并输出。通过这个映射,你可以在当前文件上运行它,并用重新格式化的内容替换整个文件。再加一个自动命令,让它在你退出插入模式时自动运行,这样就可以了。