2008-12-09 50 views
46

当我在编辑python文件的Vim中的空行上的插入模式中添加一个#时,vim将#移动到行的开头,但我希望在我输入的标签级别插入#号。如何配置vim在编辑python文件时不在行首加注释

例如,在VIM

for i in range(10): 
    # 

的#不呆在那里,我进入了它写这个的时候。

它是这样移动的,通过vim。

for i in range(10): 
# 

有没有人知道vim中的配置项会改变这种情况?

如果有帮助,我使用的是Ubuntu 8.10。

+0

另请参阅:http://stackoverflow.com/questions/191201/indenting-comments-to-match-code-in-vim – Dan 2010-05-13 23:39:17

回答

31

我发现这里http://vim.wikia.com/wiki/Restoring_indent_after_typing_hash

的答案似乎是,VIM smartindent选项是问题的原因。 上面引用的页面描述了工作轮回,但在阅读vim本身的smartindent帮助(:help smartindent)之后,我决定尝试cindent而不是smartindent。

我在.vimrc文件

,到目前为止,它是工作完美替代

set smartindent 

set cindent 

此更改还修复了'< <'和'>>'的行为,用于缩进包含python注释的可视块。

在vim帮助smartindent和cindent(:help smartindent和:help cindent)有更多的配置选项和缩进信息。

+2

啊,我在我的.vimrc文件中有“filetype plugin indent on”,也许这是它对我正确工作的原因。 http://vimdoc.sourceforge.net/htmldoc/filetype.html – m0j0 2008-12-09 22:38:29

+0

保存了我的一天。 +1! :) – 2014-05-07 19:55:50

1

我的Vim配置没有这样做。您可以尝试提供的脚本python.vim从这个链接:http://www.vim.org/scripts/script.php?script_id=790

+0

不幸的是,这并没有在我的情况下,使用它时仍然存在问题。 我使用2.6.3版本,因为我还没有升级到python 3.0。 也许问题出在Ubuntu vim-runtime软件包安装的/usr/share/vim/vim71/indent/python.vim文件中? – 2008-12-09 21:50:06

2

这是由'smartindent'功能引起的。如果您的.vimrc中有:set smartindent,则需要将其删除。

9

我在我的.vimrc以下行,似乎是被默认安装与我的Ubuntu 8.10

set smartindent 
inoremap # X^H# 
set autoindent 

而且我不遵守的问题。也许你可以试试这个。 (请注意,^ H应该通过Ctrl-V Ctrl-H输入)

19

@PolyThinker虽然我看到这个问题的答案很多,但我认为这不是一个好的解决方案。编辑器仍然认为它应该一直缩进 - 通过在以hash开头的行上按==来检查此操作,或者在包含注释的代码块突出显示时重新按=来检查该操作。

我强烈建议filetype indent on,并从您的vimrc中删除set smartindentset autoindent(或set cindent)行。其他人(显然,David Bustos)非常友好,可以为我们编写完整的缩进解析器;它位于$ VIMDIRECTORY/indent/python.vim。

(保罗cindent解决方案可能适用于Python,但filetype indent on是更为普遍有用。)

4

我解决#的,取消缩进:

如果使用cindent,认识到它是为C设计和C++编码。在这里,#表示您正在创建#DEFINE或#MACRO(),因此行为是正确的。但对于其中#是评论的其他语言,这是令人烦恼的。

以下为我工作:

" cindent  enable specific indenting for C code 
" set cin  nocin 
set cin 

" cinkeys  The default cinkeys causes leading # to unindent to column 0. 
"    To prevent this, remove the 0# from the definition. 
" set cinkeys=0{,0},0),:,0#,!^F,o,O,e - default 
set cinkeys=0{,0},0),:,!^F,o,O,e 
0

我从~/.vimrc删除set smartindent但它仍然没有禁用smartindent。当我打开一个.py文件并运行:set smartindent?时,它显示smartindent

原来,在~/.vimrc进一步下跌是这一行:

autocmd BufRead *.py set smartindent cinwords=if,elif,else,for,while,try,except,finally,def,class 
         ^^^^^^^^^^^ 

一旦我删除了“smartindent”从该行,然后smartindent终于残疾人和我的意见是缩进重新正常。

2

其他一些答案很有用,但没有一个足以防止Vim在'#'是第一个字符时重新排线。 PolyThinker的回答对我不起作用,但它给出了一条线索,可以将'#'重新映射为“插入一个字符,然后#,然后删除多余的字符并将光标放在应该出现的位置”。这是做了映射:

inoremap # X#<left><backspace><right> 

这是必要的,因为vim的语法包似乎把“#”作为一个特殊的人物,不管这些选项的设置。我希望以'#'开头的行与其他任何角色开始的行相同。我找到的最可靠的解决方案是上面的映射,它实际上确实改变了行的第一个字符。

注意:我发现这个映射在运行I#<esc>然后按下“。”后会导致问题。重做以前的插入。我还没有找到解决方案。