【问题标题】:How to configure vim to not put comments at the beginning of lines while editing python files如何配置vim在编辑python文件时不在行首添加注释
【发布时间】:2008-12-09 20:21:40
【问题描述】:

当我在编辑 python 文件时在 Vim 的空行上添加 # 以插入模式时,vim 将 # 移动到行的开头,但我希望 # 插入到我输入它的选项卡级别.

比如用vim写这个的时候

for i in range(10):
    #

# 不会停留在我输入的位置。

它是这样被 vim 移动的。

for i in range(10):
#

有谁知道 vim 中的配置项会改变这一点?

如果有帮助,我正在使用 Ubuntu 8.10。

【问题讨论】:

标签: python vim


【解决方案1】:

我在这里找到了答案http://vim.wikia.com/wiki/Restoring_indent_after_typing_hash

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

我换了

set smartindent

set cindent

在我的 .vimrc 文件中

到目前为止,它运行良好。

此更改还修复了 '>' 用于缩进包含 python cmets 的可视块的行为。

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

【讨论】:

  • 啊,我的 .vimrc 中有“filetype plugin indent on”,也许这是它对我正常工作的原因。 vimdoc.sourceforge.net/htmldoc/filetype.html
  • 拯救了我的一天。 +1! :)
  • cindent有什么推荐的/常用的配置设置吗?
  • 这一直困扰着我,我终于花了 5 分钟来修复它(听起来像大多数 vim 问题,对吧?)。谢谢你的面包屑!
【解决方案2】:

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

我强烈推荐filetype indent on,并从您的vimrc 中删除set smartindentset autoindent(或set cindent)行。其他人(显然是 David Bustos)为我们编写了一个完整的缩进解析器。它位于 $VIMDIRECTORY/indent/python.vim。

(Paul 的 cindent 解决方案可能适用于 python,但 filetype indent on 更普遍有用。)

【讨论】:

  • 谢谢 - 这帮助了我。我遇到了一个问题,那就是我在 gvim (MacVim) 中尝试“文件类型缩进”,但没有看到行为改变。一旦我开始通过将它添加到 .vimrc 来测试它,然后重新启动,我看到了行为变化。
  • 同样的问题,尝试了可接受的解决方案(和排列),将 'filetye indent on' 放在 .vimrc 的末尾,现在 #comment'ing python 不会 de/outdent。但现在这件事对我来说是自动缩进的。叹息。
  • 关闭 smartindent 对我不起作用(在 ubuntu vim 和 osx mac-vim 上)。将“filetype indent on”添加到我的 $HOME/.vimrc 并重新启动 [g]vim 解决了我的问题(在 python 和 bash 脚本编辑上)。
【解决方案3】:

我的 .vimrc 中有以下几行,似乎默认安装在我的 Ubuntu 8.10 中

set smartindent
inoremap # X^H#
set autoindent

而且我没有发现问题。也许你可以试试这个。 (注意^H要按Ctrl-V Ctrl-H输入)

【讨论】:

  • 文档 (:help smartindent) 中概述了此修复程序。我认为set autoindent 是多余的; smartindent 包含它
【解决方案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

【讨论】:

    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

      其他一些答案很有用,但没有一个足以阻止 Vim 在 '#' 是第一个字符时重新缩进一行。 PolyThinker 的回答对我不起作用,但它提供了一个线索,即“#”可以重新映射为“插入一个字符,然后 #,然后删除多余的字符并将光标放在它应该在的位置”。这是执行此操作的映射:

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

      这是必需的,因为无论选项如何设置,vim 的语法包似乎都将 '#' 视为特殊字符。我希望以“#”开头的行与以任何其他字符开头的行相同。我找到的最可靠的解决方案是上面的映射,它实际上确实改变了行的第一个字符。

      注意:我发现此映射在运行 I#&lt;esc&gt; 然后按“。”后会导致问题。重做之前的插入。我还没有找到解决办法。

      【讨论】:

        【解决方案7】:

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

        【讨论】:

        • 不幸的是,这在我的情况下不起作用,使用它时问题仍然存在。我使用的是 2.6.3 版本,因为我还没有升级到 python 3.0。也许问题出在从 Ubuntu vim-runtime 包安装的 /usr/share/vim/vim71/indent/python.vim 文件中?
        【解决方案8】:

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

        原来在~/.vimrc 的下方是这一行:

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

        一旦我从该行中删除“smartindent”,smartindent 最终被禁用,我的 cmets 再次正确缩进。

        【讨论】:

          猜你喜欢
          • 2011-01-03
          • 1970-01-01
          • 1970-01-01
          • 2020-06-28
          • 2012-06-13
          • 1970-01-01
          • 2015-09-08
          • 2011-04-30
          • 1970-01-01
          相关资源
          最近更新 更多