Vim自动删除Python注释的缩进

78 投票
5 回答
11137 浏览
提问于 2025-04-15 19:53

我在用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

5 个回答

6

你可以尝试一个只针对Python文件的选项:

autocmd BufRead *.py inoremap # X<c-h>#<space>
22

虽然Michał的帖子解释了smartindent的作用,但你可以做得比仅仅关闭它要好得多。你可以根据自己的喜好进行更多的配置,或者更好的是,让Vim为你选择更合适的缩进方式。只需在你的vimrc文件中添加以下内容,而不是其他的缩进设置:

filetype indent on

这样,Vim就会自动为Python使用合适的缩进插件。这比仅仅不对#行进行缩进要好得多——几乎所有的内容都应该正确缩进。

63

smartindent 设置为开启后,Vim 的表现就像你描述的那样,而如果设置为 nosmartindent(这是我通常使用的设置),它的表现就会像你希望的那样。

更新:关于 smartindent 的文档说明:

当你在新的一行输入 '#' 作为第一个字符时,这一行的缩进会被去掉,'#' 会被放在第一列。下一行的缩进会恢复。如果你不想要这个效果,可以使用这个映射命令:":inoremap # X^H#",其中 ^H 是通过 CTRL-V 然后按 CTRL-H 输入的。当使用 ">>" 命令时,以 '#' 开头的行不会向右移动。

就这样。


更新:可能没必要去管下面的内容……我把它留在这里是为了增加一些信息价值。;-)

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

撰写回答