Vim自动删除Python注释上的缩进

78

我在使用 Vim 编辑 Python 脚本。

自动缩进通常还是很好用的,但当我开始一行新的代码输入 '#' 注释符时,Vim 会自动减少该行的缩进。

例如,如果我有以下代码:

def foo():

当我按下回车键时,Vim会正确缩进

def foo():
    pass

但是,如果我不输入 pass,而是输入 #,它会自动取消缩进。

def foo():
# comment

class Thing():
    def __init__(self):
         pass
# comment line gets unindented all the way

这是我的.vimrc文件。有人知道为什么会出现这种情况吗?

set tabstop=4
set smartindent
set shiftwidth=4
set expandtab
set backspace=indent,eol,start
set scrolloff=3
set statusline=%f%m%r%h%w\ [%Y\ %{&ff}]\ [%l/%L\ (%p%%)]
set laststatus=2

对于搜索引擎:dedent,outdent。 - naught101
5个回答

63

smartindent设置为on后,Vim的行为就像你为我描述的那样,而使用nosmartindent(这是我经常使用的选项)时,它的行为就像你所期望的那样。

更新:从smartindent的文档中可以看到:

当在新行中作为第一个字符键入“#”时,该行的缩进将被删除,“#”将放在第一列。下一行将恢复缩进。如果您不想这样,使用此映射:“:inoremap # X ^ H#”,其中^ H用CTRL-V CTRL-H输入。当使用“>>”命令时,以“#”开头的行不会向右移动。

似乎就是这样。


更新:可能没有必要烦扰以下内容……我会将其保留下来增加信息价值。 ;-)

如果设置nosmartindent没有帮助,也许你可以使用:set命令——不带参数——来获取你的Vim会话中生效的所有设置列表,然后将其粘贴到某个地方(例如Pastie)。据我所记,还有一些其他影响自动缩进的选项。


9
我用CTRL-V CTRL-H的方法无法获得此答案中建议的^H字符,但我发现inoremap # X<BS>#可以解决问题。 - Glenn
如果你真的想要CTRL-H,你也可以使用inoremap # X<c-h># - chew socks
我尝试了这个和@zzart的答案,但它并没有完全解决问题。如果你已经有一个未缩进的#,那么>>命令不会改变缩进。 - Alex Jasmin

22

虽然Michał的帖子解释了smartindent的作用,但你可以做得更好,不仅仅是关闭它。你可以将其配置得更符合你的喜好,或者更好的是,让Vim为你选择更好的缩进。在你的vimrc中使用以下设置而不是其他缩进设置:

filetype indent on

Vim会自动使用适合Python的缩进插件。这比不对#行进行取消缩进要好得多-几乎所有内容都应该被正确地缩进。


4
我不明白你的回答。vim已经选择了Python缩进插件——问题在于该插件的缩进方式存在逻辑错误,会完全删除缩进。因此,你提出的解决方案并不能解决问题,正如问题所述。 - Thomas Vander Stichele
3
smartindent命令会导致行首的#符号无论是否开启了filetype indent都会自动缩进,因此您必须设置nosmartindent才能解决问题。 - Michał Marczyk
5
啊,对了。我应该澄清一下:我真正的意思是使用filetype indent 代替其他缩进设置。 - Cascabel
1
你的 .vimrc 文件中没有提到 filetype 这一事实。 - Cascabel
1
@Jefromi 可能是因为我在VIM方面缺乏经验,所以仅仅阅读答案无法使其正常工作。如果有一些示例,比如.py ident onpython ident one或类似的内容,那就太好了。 - Saullo G. P. Castro
显示剩余7条评论

6
您可以尝试仅针对Python文件的选项:
autocmd BufRead *.py inoremap # X<c-h>#<space>

4
由于某种未知原因,当我开启cindent时,出现了上述行为。关闭它后问题得到解决。以上其他方法都没有起作用。

1
原因是C代码(这就是“cindent”的用途)的约定是取消缩进预处理器指令,该指令以“#”开头。因此,这对于C很有帮助,但对于Python来说是一个大问题。 - Nate C-K

-2

这看起来更糟糕了。 - tr33hous
没关系。即使建议的答案似乎失败了,可能是我安装的某个插件的问题。 - tr33hous

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