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

and*_*lei 75 python vim indentation

我正在使用Vim并编辑Python脚本.

Autoindent在一般情况下表现相当不错,但是当我开始一个新行并输入'#'来输入评论时,Vim会对我说明这一点.

例如,如果有

def foo():
Run Code Online (Sandbox Code Playgroud)

然后按回车键,Vim会正确缩进

def foo():
    pass
Run Code Online (Sandbox Code Playgroud)

但是,如果不是打字pass,我输入#,它会自动显示

def foo():
# comment

class Thing():
    def __init__(self):
         pass
# comment line gets unindented all the way
Run Code Online (Sandbox Code Playgroud)

我的.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
Run Code Online (Sandbox Code Playgroud)

Mic*_*zyk 57

设置smartindent使得Vim的行为就像你为我描述的那样,而对于nosmartindent(我倾向于使用它),它的行为就像你喜欢它一样.

更新:来自以下文档smartindent:

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

这似乎是它.


更新:可能没有必要打扰以下......我会留在这里为增加的信息价值.;-)

如果设置nosmartindent没有帮助,也许您可​​以使用:set命令 - 没有参数 - 来获取Vim会话中生效的所有设置的列表,然后将其粘贴到某处(也许在Pastie上).据我记忆,还有一些影响自动缩进的选项.

  • 使用CTRL-V CTRL-H我很难在这个答案中得到^ H,但我发现`inoremap#X <BS>#`可以解决问题. (8认同)

Cas*_*bel 18

虽然Michał的帖子解释了smartindent的作用,但你可以做得更好,而不仅仅是关闭它.您可以根据自己的喜好配置它,或者更好的是,让Vim为您选择更好的缩进.使用vimrc中的以下代码而不是其他缩进设置:

filetype indent on
Run Code Online (Sandbox Code Playgroud)

Vim会自动为python使用正确的缩进插件.这比仅仅不缩减#行更好 - 几乎所有内容都应该正确缩进.

  • Jefromi,我不明白你的答案.vim已经选择了python缩进插件 - 问题是插件碰巧不合理地缩进,完全删除了缩进.因此,您提出的解决方案无法解决问题中解释的问题. (4认同)
  • 啊,对.我应该澄清:我的意思是使用filetype indent*而不是*其他缩进设置. (4认同)
  • 无论是否打开`filetype indent`,`smartindent`都会导致行首字母"#"无意义.所以,你必须设置`nosmartindent`来解决问题. (2认同)

zza*_*art 6

您可以只为python文件尝试一个选项:

autocmd BufRead *.py inoremap # X<c-h>#<space>
Run Code Online (Sandbox Code Playgroud)