2010-03-02 117 views
69

我正在使用Vim并编辑Python脚本。Vim自动删除Python注释中的缩进

Autoindent在一般情况下工作得很好,但是当我开始一个新行并键入'#'来输入注释时,Vim将为我排除这些内容。

例如,如果有

def foo(): 

和我按enter键,Vim会缩进正确

def foo(): 
    pass 

但是,如果不是打字pass,I型#,它会自动unindents

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 
+0

对于搜索引擎:dedent,outdent。 – naught101 2014-04-09 01:11:11

回答

53

设置上使Vim的行为像你描述的我,而用nosmartindent(这是我倾向于使用)smartindent它像你更喜欢它。

更新:从上smartindent文档:

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

这似乎是它。


更新:可能不需要打扰以下...我会留在这里为附加的信息价值。 ;-)

如果设置nosmartindent没有帮助,也许你可以使用:set命令 - 无参数 - 获得的所有设置列表中的效果在你的Vim会话,然后将其粘贴的地方(上Pastie也许)。据我所知,还有一些影响自动缩进的选项。

+8

我很难用CTRL-V CTRL-H得到这个答案中提出的^ H,但是我发现'inoremap#X #'确实有效。 – Glenn 2012-04-03 13:04:57

17

尽管Michał的文章解释了smartindent的功能,但您可以做得比只关闭它好很多。您可以根据自己的喜好进行更多的配置,或者更好地让Vim为您选择更好的缩进。随着你的vimrc,而不是其他缩进设置如下:

filetype indent on 

Vim会自动使用正确的缩进插件蟒蛇。这比仅仅不去除缩进#行更好 - 几乎所有东西都应该正确缩进。

+3

Jefromi, 我不明白你的答案。 vim已经在选择python缩进插件 - 问题在于插件发生了不合逻辑的缩进,完全消除了缩进。所以你提出的解决方案不能解决问题中所解释的问题。 – 2010-03-02 11:42:18

+2

'smartindent'将导致行初始''''不管'filetype indent'是否被打开。所以,你必须设置'nosmartindent'来解决问题。 – 2010-03-02 13:07:38

+4

啊,对。我应该澄清:我的意思是使用filetype indent *而不是其他缩进设置。 – Cascabel 2010-03-02 17:00:33

5

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

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

对于一些未知原因上述行为是由于我在cindent上造成的。把它关掉为我固定。上述其他修复无一帮助。

+1

原因在于C代码中的约定(cindent是为什么)是取代以'#'开头的proprocessor指令。所以,这对C有帮助,但对Python来说却是一个大问题。 – 2015-02-06 18:05:35