使用smartindent或文件类型缩进的Vim中的奇数缩进行为

时间:2013-05-06 13:53:52

标签: c++ vim indentation

我发现无论有没有选择,缩进并不总是有效,而且似乎是因为这些设置。
从我可以告诉它的代码是有效和正确缩进的,但它不会发生在任何地方。除了下面的例子,我还没有找到一个模式。

set filetype plugin indent on
set smartindent

以C ++代码为例:

#include <iostream>
#include <sstream>

int main(void) {
    std::string move;
    int x, y;
    char c;

    while(true) {
        std::cout << "Enter move (x,y): ";
        std::getline(std::cin, move);

        std::stringstream ss(move);
        ss >> x; ss >> c; ss >> y;

        std::cout << "x: " << x << "\n";
        std::cout << "y: " << y << "\n" << std::endl;
    }
}

缩进:

  • #include以外的任何正确代码,例如:
    • &lt;&lt; &gt;&gt; std::getline(std::cin, move);
    • viB&lt; std::cout << "Enter move (x,y): ";,因此缩进块
  • 如果#include被错误地缩进,则
  • &gt;&gt; &gt;&gt;
  • 如果从包含中移除了#,则代码不正确,&gt;&gt; 正常工作

不缩进:

  • &gt;&gt; #include <iostream>
  • vip&gt; :1,因此选择包含并尝试缩进它们

如果缩进失败,即使实际没有更改任何字符,文件仍会标记为已更改。

  1. 这是正确的行为吗?
  2. 为什么Vim会区分正确的代码?
  3. 我想保留smartindent功能,但即使Vim认为它是正确的,仍然可以手动缩进代码。
  4. 如果需要我的Vim configuration

1 个答案:

答案 0 :(得分:2)

根据smartindent的文档,您看到的行为是正确的。以下是#indenting

的相关部分
  

当键入“#”作为新行中的第一个字符时,缩进为   该行被删除,'#'放在第一列。缩进   恢复下一行。如果你不想这样,请使用它   mapping:“:inoremap#X ^ H#”,其中^ H是用CTRL-V CTRL-H输入的。   使用“&gt;&gt;”时命令,以'#'开头的行不会移位   右。

手动转移它的一种方法是更改​​cinkeys。此选项默认为"0{,0},0),:,0#,!^F,o,O,e",其中第五个选项为0#。根据帮助表单here更改#缩进的行为。 (注意:你需要向上滚动一段)

  

如果符合以下条件,Vim会在第1列中添加一行:    - 如果'cinkeys'包含'#',则以'#'(预处理程序指令)开头。

要从cinkeys中删除此内容,您可以将以下内容放入vimrc

set cinkeys-=0#

你也应该从indentkeys删除它。

set indentkeys-=0#