Vim 中带有智能缩进或文件类型缩进的奇怪缩进行为

Odd indentation behaviour in Vim with smartindent or filetype indent on

本文关键字:缩进 类型 智能 Vim 文件      更新时间:2023-10-16

我发现缩进,无论有没有选择,并不总是有效,这似乎是因为这些设置。
据我所知,这是代码有效且正确缩进的时间,但它不会发生在任何地方。除了下面的例子之外,我还没有找到一种模式。

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 之外的任何正确代码,例如:
    • <<</kbd>或>>std::getline(std::cin, move);
    • viB<</kbd> 在 std::cout << "Enter move (x,y): "; 处,从而缩进块
  • >>>>#include是否错误缩进
  • 如果从包含中删除#,使代码不正确,>>工作

不缩进:

  • >>#include <iostream>
  • VIP>:1 ,从而选择包含并尝试缩进它们

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

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

如果需要,我的 Vim 配置。

根据smartindent的文档,您看到的行为是正确的。以下是关于#缩进的相关部分

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

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

如果出现以下情况,Vim 会在第 1 列中放置一行: - 它以"#"(预处理器指令(开头,如果"cinkeys"包含"#"。

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

set cinkeys-=0#

您可能也应该将其从indentkeys中删除。

set indentkeys-=0#