缩进

Nvim :help 页面,从 生成源代码, 使用 tree-sitter-vimdoc 解析器。


本文件介绍如何缩进 C 程序和其他文件。

1. 缩进 C 风格的程序

用户手册第 30.2 节介绍了 C 风格缩进的基础知识。
Vim 拥有选项用于自动缩进 C 风格的程序文件。包括 Java 和 C++ 在内的许多编程语言都非常接近于 C 中建立的格式约定。这些选项只影响缩进,不会执行其他格式化操作。还有一些其他选项会影响格式化和缩进,请参阅 format-commentsfo-tablegqformatting 等主要选项。
事实上,有四种主要方法可用于缩进,每种方法在启用时都会覆盖之前的设置,或者对于 'indentexpr' 来说是非空的:'autoindent' 使用前一行的缩进。 'smartindent' 类似于 'autoindent',但也会识别一些 C 语法,在适当的地方增加/减少缩进。 'cindent' 比其他两种方法更智能,可以配置不同的缩进风格。 'indentexpr' 最灵活的方法:评估表达式来计算一行的缩进。如果它是非空的,则此方法将覆盖其他方法。请参阅 indent-expression。本节的其余部分描述了 'cindent' 选项。
请注意,'cindent' 缩进并非适用于所有代码场景。Vim 不是 C 编译器:它不识别所有语法。一个要求是,顶层函数必须在第一列包含一个 "{"。否则,它们很容易与声明混淆。
以下五个选项控制 C 程序的缩进:'cindent' 使 Vim 能够自动执行 C 程序的缩进。 'cinkeys' 指定在插入模式下哪些键会触发重新缩进。 'cinoptions' 设置您首选的缩进风格。 'cinwords' 定义在下一行开始额外缩进的关键字。 'cinscopedecls' 定义被识别为 C++ 范围声明的字符串。
如果 'lisp' 未启用,并且 'equalprg' 为空,则 "=" 运算符将使用 Vim 的内置算法执行缩进,而不是调用外部程序。
请参阅 autocommand,了解如何为 C 代码文件自动设置 'cindent' 选项,并为其他文件重置该选项。
cinkeys-format indentkeys-format 'cinkeys' 选项是一个字符串,它控制 Vim 在响应某些字符或命令的输入时如何执行缩进。请注意,这不仅仅会触发 C 缩进。当 'indentexpr' 不为空时,会使用 'indentkeys' 替代。 'cinkeys''indentkeys' 的格式相同。
默认值为 "0{,0},0),0],:,0#,!^F,o,O,e",它指定了缩进发生的以下情况
"0{" 如果您在行首输入 "{" "0}" 如果您在行首输入 "}" "0)" 如果您在行首输入 ")" "0]" 如果您在行首输入 "]" ":" 如果您在标签或 case 语句后输入 ":" "0#" 如果您在行首输入 "#" "!^F" 如果您输入 CTRL-F(不会插入) "o" 如果您在任何位置输入 <CR> 或使用 "o" 命令(不在插入模式下!) "O" 如果您使用 "O" 命令(不在插入模式下!) "e" 如果您在行首输入 "else" 的第二个 'e'
每个键之前可以出现的字符:i_CTRL-F
! 当一个 "!" 位于键之前时,Vim 不会插入该键,而是会重新缩进当前行。这允许您为重新缩进当前行定义一个命令键。CTRL-F 是此功能的默认键。如果为此定义 CTRL-I,请小心,因为 CTRL-I<Tab> 的 ASCII 码。* 当一个 "*" 位于键之前时,Vim 会在插入键之前重新缩进该行。如果 'cinkeys' 包含 "*<Return>",Vim 会在打开新行之前重新缩进当前行。0 当一个零位于键之前(但出现在 "!" 或 "*" 之后)时,Vim 只会在键是您在行中输入的第一个字符时重新缩进该行。当用在 "=" 之前时,Vim 仅会在单词之前只有空格时重新缩进该行。
当键之前既没有 "!" 也没有 "*" 时,Vim 会在您输入键后重新缩进该行。因此,";" 会设置包括 ";" 的一行的缩进。
特殊键名
> 尖括号表示键的拼写名称。例如:"<Up>","<Ins>"(请参阅 key-notation)。^ 用脱字符 (^) 作为前缀的字母是控制字符。例如:"^F" 是 CTRL-F。o 当您使用 "o" 命令或 Vim 在当前行下方打开新行(例如,当您在插入模式下输入 <Enter> 时)时,会重新缩进一行。O 当您使用 "O" 命令时,会重新缩进一行。e 当您在行首输入 "else" 的第二个 'e' 时,会重新缩进一行。: 当您在标签或 case 语句后输入 ":" 时,会重新缩进一行。不要为 "class::method" 中的 ":", 在 C++ 中重新缩进。要为任何 ":" 重新缩进,请使用 "<:>"。=word 当您输入 "word" 的最后一个字符时,会重新缩进。 "word" 实际上可能是另一个单词的一部分。因此,"=end" 会在您输入 "endif" 或 "endwhile" 中的 "d" 时触发重新缩进。但不会在您输入 "bend" 时触发。在完成操作生成以 "word" 开头的单词时,也会重新缩进。 "0=word" 只会在单词之前只有空格时重新缩进。 =~word 类似于 =word,但不区分大小写。
如果您确实希望在输入 'o'、'O'、'e'、'0'、'<'、'>'、"*"、':' 或 '!' 时重新缩进,请分别使用 "<o>"、"<O>"、"<e>"、"<0>"、"<<>"、"<>>"、"<*>"、"<:>" 或 "<!>" 来表示这些键。
对于 emacs 风格的缩进模式,其中行不是每次按 <Enter> 键时都缩进,而是在按 <Tab> 键时才缩进,我建议
:set cinkeys=0{,0},:,0#,!<Tab>,!^F
您可能也希望关闭 'autoindent'
注意:如果您手动更改当前行的缩进,Vim 将忽略该行的 cindent 设置。这可以防止 vim 在您通过在缩进中输入 <BS><Tab><Space> 来更改缩进,或者使用 CTRL-TCTRL-D 后重新缩进。
cinoptions-values
'cinoptions' 选项设置 Vim 如何执行缩进。选项字符后的值可以是以下之一(N 是任何数字):N 缩进 N 个空格 -N 向左缩进 N 个空格 Ns N 倍 'shiftwidth' 个空格 -Ns 向左缩进 N 倍 'shiftwidth' 个空格
在以下列表中,"N" 表示您选择的数字(数字可以为负数)。当数字后面有 's' 时,Vim 会将数字乘以 'shiftwidth':"1s" 是 'shiftwidth',"2s" 是 'shiftwidth' 的两倍,等等。您也可以使用小数点:"-0.5s" 是负的 'shiftwidth' 的一半。以下示例假设 'shiftwidth' 为 4。 cino->
>N 用于 "普通" 缩进的添加量。用于在应该增加缩进的行之后(以 "if"、开括号等开头的行)。(默认值为 'shiftwidth')。
cino= cino=>2 cino=>2s
if (cond)              if (cond)                  if (cond)
{                      {                          {
    foo;                foo;                          foo;
}                      }                          }
cino-e
eN 如果开括号在行尾(更准确地说,不是行的第一个字符),则在括号集中添加 N 到当前缩进。这在您希望开括号在行首的缩进与在行尾的缩进不同时很有用。(默认值为 0)。
cino= cino=e2 cino=e-2
if (cond) {              if (cond) {          if (cond) {
    foo;                    foo;            foo;
}                      }                          }
else                      else                  else
{                      {                          {
    bar;                  bar;                      bar;
}                      }                          }
cino-n
nN 如果语句不在括号集中,则在 "if"、"while" 等之后添加 N 到当前缩进。这在您希望没有 "{" 之前的语句缩进与有 "{" 之前的语句缩进不同时很有用。(默认值为 0)。
cino= cino=n2 cino=n-2
if (cond)              if (cond)                  if (cond)
    foo;                    foo;            foo;
else                      else                  else
{                      {                          {
    bar;                  bar;                      bar;
}                      }                          }
cino-f
fN 将函数或其他块的第一个开括号放在第 N 列。这仅适用于不在其他括号中并且在行首的开括号。开括号后面的内容将相对于此开括号放置。(默认值为 0)。
cino= cino=f.5s cino=f1s
func()              func()                  func()
{                        {                      {
    int foo;                    int foo;                  int foo;
cino-{
{N 将开括号放在当前缩进的 N 个字符处。这仅适用于在其他括号中的开括号。(默认值为 0)。
cino= cino={.5s cino={1s
if (cond)              if (cond)                  if (cond)
{                        {                      {
    foo;                  foo;                      foo;
cino-}
}N 将闭括号放在与匹配的开括号相距 N 个字符处。(默认值为 0)。
cino= cino={2,}-0.5s cino=}2
if (cond)              if (cond)                  if (cond)
{                        {                  {
    foo;                  foo;                      foo;
}                      }                            }
cino-^
^N 如果开括号在第 0 列,则在括号集中添加 N 到当前缩进。这可以指定函数的整体不同的缩进(有些人可能喜欢将其设置为负数)。(默认值为 0)。
cino= cino=^-2 cino=^-s
func()              func()                  func()
{                      {                          {
    if (cond)                if (cond)          if (cond)
    {                        {                  {
        a = b;            a = b;              a = b;
    }                        }                  }
}                      }                          }
cino-L
LN 控制跳转标签的放置位置。如果 N 为负数,则标签将放在第 1 列。如果 N 为非负数,则标签的缩进将是当前缩进减去 N。(默认值为 -1)。
cino= cino=L2 cino=Ls
func()              func()              func()
{                   {                   {
    {                   {                   {
        stmt;               stmt;               stmt;
LABEL:                    LABEL:            LABEL:
    }                   }                   }
}                   }                   }
cino-
:N 将 case 标签放在 switch() 的缩进的 N 个字符处。(默认值为 'shiftwidth')。
cino= cino=:0
switch (x)              switch(x)
{                      {
    case 1:              case 1:
        a = b;          a = b;
    default:              default:
}                      }
cino-=
=N 将 case 标签后出现的语句放在标签缩进的 N 个字符处。(默认值为 'shiftwidth')。
cino= cino==10
case 11:                case 11:  a = a + 1;
    a = a + 1;                  b = b + 1;
cino-l
lN 如果 N != 0,Vim 将与 case 标签对齐,而不是与同一行中的语句对齐。
cino= cino=l1
switch (a) {              switch (a) {
    case 1: {                  case 1: {
                break;              break;
            }                  }
cino-b
bN 如果 N != 0,Vim 将将最后的 "break" 与 case 标签对齐,以便 case..break 看起来像一个块。(默认值为 0)。当使用 1 时,请考虑将 "0=break" 添加到 'cinkeys' 中。
cino= cino=b1
switch (x)              switch(x)
{                      {
    case 1:                  case 1:
        a = b;              a = b;
        break;          break;
    default:                  default:
        a = 0;              a = 0;
        break;          break;
}                      }
cino-g
gN 将 C++ 范围声明放在它们所属的块的缩进的 N 个字符处。(默认值为 'shiftwidth')。默认情况下,范围声明是 "public:"、"protected:" 或 "private:"。这可以通过 'cinscopedecls' 选项进行调整。
cino= cino=g0
{                      {
    public:              public:
        a = b;          a = b;
    private:              private:
}                      }
cino-h
hN 将 C++ 范围声明后出现的语句放在标签缩进的 N 个字符处。(默认值为 'shiftwidth')。
cino= cino=h10
public:                public:   a = a + 1;
    a = a + 1;                  b = b + 1;
cino-N
NN 在 C++ 命名空间内缩进额外的 N 个字符,与普通块相比。(默认值为 0)。
cino= cino=N-s
namespace {                namespace {
    void function();       void function();
}                          }
namespace my               namespace my
{                          {
    void function();       void function();
}                          }
cino-E
EN 在 C++ 链接规范(extern "C" 或 extern "C++")内缩进额外的 N 个字符,与普通块相比。(默认值为 0)。
cino= cino=E-s
extern "C" {               extern "C" {
    void function();       void function();
}                          }
extern "C"                 extern "C"
{                          {
    void function();       void function();
}                          }
cino-p
对于 K&R 风格的函数声明,pN 参数声明将从边距缩进 N 个字符。(默认值为 'shiftwidth')。
cino= cino=p0 cino=p2s
func(a, b)              func(a, b)          func(a, b)
    int a;              int a;                          int a;
    char b;              char b;                          char b;
cino-t
tN 将函数返回值类型声明从边距缩进 N 个字符。(默认值为 'shiftwidth')。
cino= cino=t0 cino=t7
    int              int                         int
func()              func()                  func()
cino-i
iN 缩进 C++ 基类声明和构造函数初始化,如果它们在新行开始(否则它们与 ':' 的右侧对齐)。(默认值为 'shiftwidth')。
cino= cino=i0
class MyClass :            class MyClass :
    public BaseClass      public BaseClass
{}                            {}
MyClass::MyClass() :            MyClass::MyClass() :
    BaseClass(3)            BaseClass(3)
{}                            {}
cino-+
+N 缩进函数内部的续行(换行到下一行的行)N 个额外字符。(默认值为 'shiftwidth')。在函数外部,当上一行以反斜杠结束时,将使用 2 * N。
cino= cino=+10
a = b + 9 *                    a = b + 9 *
    c;                              c;
cino-c
cN 当没有其他文本可以对齐时,缩进注释打开符后的注释行,从注释打开符缩进 N 个字符。(默认值为 3)。另请参见 format-comments
cino= cino=c5
/*                            /*
   text.                         text.
 */                             */
cino-C
CN 当 N 非零时,即使注释打开符后有其他文本,也要按上面 c 标志指定的量缩进注释行。(默认值为 0)。
cino=c0 cino=c0,C1
/********                    /********
  text.                    text.
********/                    ********/
(示例使用 ":set comments& comments-=s1:/* comments^=s0:/*")
cino-/
/N 额外缩进注释行 N 个字符。(默认值为 0)。cino= cino=/4
a = b;                    a = b;
/* comment */                        /* comment */
c = d;                    c = d;
cino-(
(N 当处于未闭合的括号内时,从包含未闭合括号的行缩进 N 个字符。每个额外的未闭合括号添加一个 'shiftwidth'。当 N 为 0 或未闭合括号是其行中的第一个非空白字符时,与未闭合括号后的下一个非空白字符对齐。(默认值为 'shiftwidth' * 2)。
cino= cino=(0
if (c1 && (c2 ||            if (c1 && (c2 ||
            c3))                       c3))
    foo;                        foo;
if (c1 &&                    if (c1 &&
        (c2 || c3))                (c2 || c3))
   {                               {
cino-u
uN 与 (N 相同,但针对更深一层的嵌套级别。(默认值为 'shiftwidth')。
cino= cino=u2
if (c123456789            if (c123456789
        && (c22345                    && (c22345
            || c3))                      || c3))
cino-U
UN 当 N 非零时,如果未闭合括号是其行中的第一个非空白字符,则不要忽略 ( 或 u 指定的缩进。(默认值为 0)。
cino= 或 cino=(s cino=(s,U1
c = c1 &&                    c = c1 &&
    (                                (
     c2 ||                            c2 ||
     c3                            c3
    ) && c4;                        ) && c4;
cino-w
wN 当处于未闭合的括号内,且 N 非零,并且使用 "(0" 或 "u0"(分别),或者使用 "U0" 且未闭合括号是其行中的第一个非空白字符时,与未闭合括号后的字符对齐,而不是第一个非空白字符。(默认值为 0)。
cino=(0 cino=(0,w1
if (   c1                    if (   c1
       && (   c2                && (   c2
              || c3))                    || c3))
    foo;                        foo;
cino-W
WN 当处于未闭合的括号内,且 N 非零,并且使用 "(0" 或 "u0"(分别),且未闭合括号是其行的最后一个非空白字符,并且不是闭合括号时,将下一行相对于外部上下文缩进 N 个字符(即行的开头或下一个未闭合括号)。(默认值为:0)。
cino=(0 cino=(0,W4
a_long_line(                    a_long_line(
            argument,                argument,
            argument);        argument);
a_short_line(argument,    a_short_line(argument,
             argument);                 argument);
cino-k
kN 当处于紧跟 "if"、"for" 或 "while" 后的未闭合括号内,且 N 非零时,将覆盖 "(N" 定义的行为:导致缩进相对于外部上下文(即包含 "if"、"for" 或 "while" 的行)缩进 N 个字符。对更深层的嵌套级别没有影响。仅对 "if"、"for" 和 "while" 条件影响像 "wN" 这样的标志。如果为 0,则默认为 "(N" 标志定义的行为。(默认值为:0)。
cino=(0 cino=(0,ks
if (condition1            if (condition1
    && condition2)                    && condition2)
    action();                        action();
function(argument1            function(argument1
         && argument2);             && argument2);
cino-m
mN 当 N 非零时,将以闭合括号开头的行与匹配的打开括号行的第一个字符对齐。(默认值为 0)。
cino=(s cino=(s,m1
c = c1 && (                    c = c1 && (
    c2 ||                        c2 ||
    c3                        c3
    ) && c4;                    ) && c4;
if (                            if (
    c1 && c2                        c1 && c2
   )                            )
    foo;                        foo;
cino-M
MN 当 N 非零时,将以闭合括号开头的行与上一行的第一个字符对齐。(默认值为 0)。
cino= cino=M1
if (cond1 &&                    if (cond1 &&
       cond2                           cond2
   )                                   )
java-cinoptions java-indenting cino-j jN 正确缩进 Java 匿名类。也适用于 Javascript。当前值 'N' 未使用,但必须是非零值(例如 'j1')。'j1' 将例如正确缩进以下代码段
object.add(new ChangeListener() {
    public void stateChanged(ChangeEvent e) {
        do_something();
    }
});
javascript-cinoptions javascript-indenting cino-J JN 通过不将其与标签混淆来正确缩进 JavaScript 对象声明。当前值 'N' 未使用,但必须是非零值(例如 'J1')。如果您启用此选项,您可能还想设置 cino-j
var bar = {
    foo: {
        that: this,
        some: ok,
    },
    "bar":{
        a : 2,
        b: "123abc",
        x: 4,
        "y": 5
    }
}
cino-)
)N Vim 最多在 N 行内搜索未闭合的括号。这限制了搜索括号所需的时间。(默认值为 20 行)。
cino-star
*N Vim 最多在 N 行内搜索未闭合的注释。这限制了搜索注释开始所需的时间。如果您的 /* */ 注释在 N 行后停止缩进,那么这就是您需要更改的值。(默认值为 70 行)。
cino-#
#N 当 N 非零时,识别以 '#' 开头的 shell/Perl 注释,不识别预处理行;允许以 "#" 开头的行右移。当 N 为零(默认值)时:不识别 '#' 注释,识别预处理行;以 "#" 开头的行右移不起作用。
cino-P
PN 当 N 非零时,识别 C 预处理指令,并将它们像任何其他代码一样缩进;不涉及其他预处理指令。当 N 为零(默认值)时:不识别 C 预处理指令,将它们视为其他任何预处理指令。
默认值,完整写出,如下所示
cinoptions=>s,e0,n0,f0,{0,}0,^0,L-1,:s,=s,l0,b0,gs,hs,N0,E0,ps,ts,is,+s,
                c3,C0,/0,(2s,us,U0,w0,W0,k0,m0,j0,J0,)20,*70,#0,P0
Vim 将一行放在第 1 列,如果
它以 '#'(预处理指令)开头,如果 'cinkeys' 包含 '#0'。
它以标签(关键字后跟 ':', 除了 "case" 和 "default")开头,并且 'cinoptions' 不包含带有正值的 'L' 项。
任何缩进组合都会导致该行的缩进小于 0。

2. 通过表达式缩进 indent-expression

使用灵活缩进的基础知识在用户手册的第 30.3 节中解释。
如果您想编写自己的缩进文件,它必须设置 'indentexpr' 选项。设置 'indentkeys' 选项通常很有用。有关提示,请参见 $VIMRUNTIME/indent/README.txt 文件。有关示例,请参见 $VIMRUNTIME/indent 目录。
关于特定缩进文件的备注
Clojure 缩进与传统 Lisp 有所不同,部分原因是使用了方括号和花括号,以及社区惯例。这些惯例并非普遍遵循,因此 Clojure 缩进脚本提供了一些配置选项。
设置 searchpairpos() 的最大扫描距离。较大的值在处理非常长的形式时以性能换取正确性。值为 0 将无限扫描。默认值为 300。
'lispwords' 选项是一个逗号分隔的单词列表,这些单词标记特殊形式,其子形式应缩进两个空格。
例如
(defn bad []
      "Incorrect indentation")
(defn good []
  "Correct indentation")
如果您想使用 模式 而不是文字指定 'lispwords',可以使用模糊缩进功能
" Default
let g:clojure_fuzzy_indent = 1
let g:clojure_fuzzy_indent_patterns = ['^with', '^def', '^let']
let g:clojure_fuzzy_indent_blacklist =
        \ ['-fn$', '\v^with-%(meta|out-str|loading-context)$']
g:clojure_fuzzy_indent_patternsg:clojure_fuzzy_indent_blacklist 是将与列表开头的不限定符号匹配的模式列表。这意味着像 "^foo" 这样的模式将与所有这些候选者匹配:foobarmy.ns/foobar#'foobar
每个候选词按以下顺序进行特殊处理测试
1. 如果词语在 'lispwords' 中,则返回真 2. 如果词语与 g:clojure_fuzzy_indent_blacklist 中的模式匹配,则返回假 3. 如果词语与 g:clojure_fuzzy_indent_patterns 中的模式匹配,则返回真 4. 否则返回假并正常缩进
Clojure 中的某些形式缩进使得每个子形式都缩进两个空格,无论 'lispwords' 如何。如果您有自定义结构应该以这种特殊的方式缩进,您可以将您的符号添加到下面的默认列表中。
" Default
let g:clojure_special_indent_words =
   \ 'deftype,defrecord,reify,proxy,extend-type,extend-protocol,letfn'
将多行字符串中的后续行与开头的引号后的列对齐,而不是相同的列。
例如
(def default
  "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do
  eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
  enim ad minim veniam, quis nostrud exercitation ullamco laboris
  nisi ut aliquip ex ea commodo consequat.")
(def aligned
  "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do
   eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
   enim ad minim veniam, quis nostrud exercitation ullamco laboris
   nisi ut aliquip ex ea commodo consequat.")
默认情况下,类似于函数调用且头部子形式在其自身的行上的括号括起来的复合形式,其后续子形式相对于开头的括号缩进两个空格
(foo
  bar
  baz)
将此选项设置为 1 会更改此行为,以便所有子形式都与同一列对齐,模拟 clojure-mode.el 的默认行为
(foo
 bar
 baz)
缩进块 if、select case、select type、select rank、where、forall、type、interface、associate、block、enum、critical 和 change team 结构。子例程、函数、模块和程序块的缩进是可选的。如果 Fortran 采用自由源代码形式,则缩进注释、标记语句和续行,而如果 Fortran 采用固定源代码形式,则不缩进注释、标记语句和续行,因为存在左边界要求。因此,当使用固定源代码形式时,需要手动缩进校正标记语句和续行。有关用于检测源代码格式的方法的进一步讨论,请参见 ft-fortran-syntax
Do 循环
默认情况下,所有 do 循环都保持不缩进。do 循环在 Fortran 中可能是非结构化的,其(可能有多个)循环以几乎任意类型的标记可执行语句结束。正确缩进需要编译器级别的解析。可以使用像 Tidy 这样的复杂程序来缩进以任意类型的标记语句结束的 do 循环的旧代码。结构化的 do/continue 循环也保持不缩进,因为 continue 语句用于除结束 do 循环之外的其他目的。像 Tidy 这样的程序可以将结构化的 do/continue 循环转换为 do/enddo 形式。可以缩进 do/enddo 类型的 do 循环。如果您只使用 do/enddo 形式的结构化循环,则应通过在您的 vimrc 中设置 fortran_do_enddo 变量来声明这一点,如下所示
let fortran_do_enddo=1
在这种情况下,do 循环将被缩进。如果您的所有循环都只是在 .f90 文件中采用 do/enddo 形式,那么您应该使用 autocommand 设置缓冲区标志,例如
au! BufRead,BufNewFile *.f90 let b:fortran_do_enddo=1
以便在 .f90 文件中缩进 do 循环,并在扩展名为 .for 的其他 Fortran 文件中将其保留。
程序单元
可以通过设置变量 `fortran_indent_more` 来增加程序单元(子程序、函数、模块和程序块)的缩进,也可以通过设置变量 `fortran_indent_less` 来减少缩进。这些变量可以在您的 `vimrc` 中为所有 fortran 文件设置,如下所示:
let fortran_indent_less=1
可以通过设置相应的缓冲区局部变量来实现更精细的控制,如下所示:
let b:fortran_indent_less=1

HTML ft-html-indent html-indent html-indenting

这是关于您可以在 `vimrc` 中设置的变量,用于自定义 HTML 缩进。
您可以设置 `<script>` 和 `<style>` “块标签”后的第一行的缩进(默认值为“zero”)。
:let g:html_indent_script1 = "inc"
:let g:html_indent_style1 = "inc"
VALUE MEANING
"zero" 零缩进 "auto" 自动缩进(与块标签相同的缩进) "inc" 自动缩进 + 一级缩进
您可以设置打开的 `<tag` 行后的属性的缩进。
:let g:html_indent_attribute = 1
VALUE MEANING
1 自动缩进,比 `<tag` 多一级缩进 2 自动缩进,两级缩进(默认) > 2 自动缩进,更多缩进
默认情况下,许多标签会为后面的内容增加缩进(请参见脚本中的“增加缩进标签”)。您可以使用以下命令添加其他标签:
:let g:html_indent_inctags = "html,body,head,tbody"
您也可以使用以下命令删除此类标签:
:let g:html_indent_autotags = "th,td,tr,tfoot,thead"
这两个变量的默认值都是空的。 注意: 初始的 "inctags" 只在每个 Vim 会话中定义一次。
用户变量仅在源代码脚本时读取。要在会话期间启用您的更改,而无需重新加载 HTML 文件,您可以手动执行以下操作:
:call HtmlIndent_CheckUserSettings()
详细信息:“块标签”内具有“外来”内容的缩进计算
BLOCKTAG INDENT EXPR WHEN APPLICABLE
<script> : {customizable} 如果是块的第一行 : cindent(v:lnum) 如果属性为空或包含“java” : -1 否则(vbscript、tcl 等) <style> : {customizable} 如果是块的第一行 : GetCSSIndent() 否则 <!-- --> : -1
MATLAB 编辑器/调试器语言首选项中的设置“函数缩进格式”对应于:
:let g:MATLAB_function_indent = {0, 1 or 2 (default)}
其中 0 代表经典,1 代表缩进嵌套函数,2 代表缩进所有函数。
注意: 只有在 PHP 语法 处于活动状态时,PHP 文件才会被正确缩进。
如果您正在使用 Unix 'fileformat' 编辑文件,并且在换行符之前存在 '\r' 字符,缩进将无法正确进行;您必须首先使用以下命令删除这些无用的字符:
:%s /\r$//g
或者,您可以简单地 :let 变量 `PHP_removeCRwhenUnix` 为 1,脚本将在 Vim 加载 PHP 文件时(在每次 BufRead 时)静默地删除它们。
选项
可以通过修改一些全局变量的值,以多种方式更改 PHP 缩进。
php-comment PHP_autoformatcomment 要默认情况下不启用注释的自动格式化(如果您想使用自己的 'formatoptions')。
:let g:PHP_autoformatcomment = 0
否则,将从 'formatoptions' 字符串中删除 't',并将添加 "qrowcb",有关更多信息,请参见 fo-table
PHP_outdentSLComments
要向单行注释添加额外的缩进。
:let g:PHP_outdentSLComments = N
其中 N 是要添加的 'shiftwidth' 的数量。
只有单行注释会受到影响,例如:
# Comment
// Comment
/* Comment */
PHP_default_indenting
要向每行 PHP 代码添加额外的缩进,其中 N 是要添加的 'shiftwidth' 的数量。
:let g:PHP_default_indenting = N
例如,当 N = 1 时,将得到以下结果:
<?php
    if (!isset($History_lst_sel))
        if (!isset($History_lst_sel))
            if (!isset($History_lst_sel)) {
                $History_lst_sel=0;
            } else
                $foo="bar";
    $command_hist = TRUE;
?>
(请注意 PHP 容器标记和代码之间的额外缩进)。
PHP_outdentphpescape
要将 PHP 转义标签缩进为周围的非 PHP 代码(仅影响 PHP 转义标签)。
:let g:PHP_outdentphpescape = 0
PHP_removeCRwhenUnix
'fileformat' 设置为 Unix 时,自动删除 '\r' 字符。
:let g:PHP_removeCRwhenUnix = 1
PHP_BracesAtCodeLevel
要将花括号缩进到与其包含的代码相同的级别。
:let g:PHP_BracesAtCodeLevel = 1
将得到以下结果:
if ($foo)
    {
    foo();
    }
而不是:
if ($foo)
{
    foo();
}
注意: 如果使用此选项,缩进速度会略微变慢,因为一些优化将不可用。
PHP_vintage_case_default_indent
要缩进 `switch()` 块中的 'case:' 和 'default:' 语句。
:let g:PHP_vintage_case_default_indent = 1
在 PHP 中,'case/default' 块内不需要花括号,因此 'case:' 和 'default:' 的缩进与 'switch()' 相同,以避免无意义的缩进。您可以使用上述选项恢复到传统方式。
PHP_noArrowMatching
默认情况下,缩进脚本将通过匹配 “->” 的位置来缩进多行链式调用。
$user_name_very_long->name()
                    ->age()
                    ->info();
您可以通过将此选项设置为 1 来恢复到经典的缩进方式。
:let g:PHP_noArrowMatching = 1
您将获得以下结果:
$user_name_very_long->name()
    ->age()
    ->info();
PHP_IndentFunctionCallParameters
要添加到多行函数调用中的参数的额外缩进级别。
let g:PHP_IndentFunctionCallParameters = 1
函数调用参数将缩进 1 个额外级别。对于两个空格的缩进:
function call_the_thing(
  $with_this,
  $and_that
) {
  $this->do_the_thing(
      $with_this,
      $and_that
  );
}
PHP_IndentFunctionDeclarationParameters
要添加到多行函数定义中的参数的额外缩进级别。
let g:PHP_IndentFunctionDeclarationParameters = 1
声明中的函数参数将缩进 1 个额外级别。对于两个空格的缩进:
function call_the_thing(
    $with_this,
    $and_that
) {
  $this->do_the_thing(
    $with_this,
    $and_that
  );
}
缩进量可以通过 `g:python_indent` 字典 设置,需要在添加项目之前创建该字典。
let g:python_indent = {}
给出的示例是默认值。请注意,字典值被设置为表达式,这样您就可以稍后更改 'shiftwidth' 的值,而无需更新这些值。
在左括号后缩进
let g:python_indent.open_paren = 'shiftwidth() * 2'
在嵌套括号后缩进
let g:python_indent.nested_paren = 'shiftwidth()'
连续行的缩进
let g:python_indent.continue = 'shiftwidth() * 2'
默认情况下,多行构造中的右括号会对齐到前一行的第一个非空格字符的下方。如果您希望将其对齐到开始多行构造的行第一个字符的下方,请重置此键:
let g:python_indent.closed_paren_align_last_line = v:false
该方法使用 searchpair() 向后查找未关闭的括号。这有时会很慢,因此在 150 毫秒后会超时。如果您发现缩进不正确,可以在毫秒内设置更大的超时时间:
let g:python_indent.searchpair_timeout = 500
如果向后查找未关闭的括号仍然太慢,特别是在复制粘贴操作期间,或者如果您不需要在多行括号内缩进,您可以完全禁用此功能:
let g:python_indent.disable_parentheses_indenting = 1
为了向后兼容,还支持这些变量:
g:pyindent_open_paren
g:pyindent_nested_paren
g:pyindent_continue
g:pyindent_searchpair_timeout
g:pyindent_disable_parentheses_indenting
R ft-r-indent
如果函数参数跨越多行,则会对其进行对齐。如果您希望函数参数不进行对齐,请在您的 vimrc 中添加:
let r_indent_align_args = 0
所有以注释字符 # 开头的行都将获得与正常 R 代码相同的缩进级别。Emacs/ESS 用户可能习惯于将以单个 # 开头的行缩进到第 40 列,将 ## 缩进为 R 代码,并且将 ### 不缩进。如果您希望以注释字符开头的行与 Emacs/ESS 对齐,请在您的 vimrc 中添加:
let r_indent_ess_comments = 1
如果您希望以单个 # 开头的行在不同于第 40 列的列中对齐,则应为变量 `r_indent_comment_column` 设置一个新值,如以下示例所示:
let r_indent_comment_column = 30
以 “<-” 结尾的行后面的任何代码都会缩进。如果代码是顶层函数,Emacs/ESS 不会缩进该代码。如果您希望在这方面具有与 Emacs/ESS 相似的行为,请在您的 vimrc 中添加:
let r_indent_ess_compatible = 1
以下是启用和禁用此选项后的缩进示例:
### r_indent_ess_compatible = 1           ### r_indent_ess_compatible = 0
foo <-                                    foo <-
    function(x)                               function(x)
{                                             {
    paste(x)                                      paste(x)
}                                             }
代码将在与模式 '\(&\||\|+\|-\|\*\|/\|=\|\~\|%\|->\)\s*$' 匹配的行之后缩进。如果您希望在与其他模式匹配的行之后进行缩进,则应在您的 vimrc 中设置 `r_indent_op_pattern` 的适当值。
可以通过在 字典 `b:sh_indent_defaults` 中设置以下键,将 shell 文件中各种情况下应用的缩进量配置为特定数量或指向将返回所需数量的函数的 Funcref
b:sh_indent_options["default"] 默认缩进量。
b:sh_indent_options["continuation-line"] 要添加到连续行的缩进量。
b:sh_indent_options["case-labels"] 要添加到 case 标签的缩进量。(尚未实现)。
b:sh_indent_options["case-statements"] 要添加到 case 语句的缩进量。
b:sh_indent_options["case-breaks"] 要添加到(或更可能是删除)case 中断的缩进量。
通用块语句(如 if、for、case、always、initial、function、specify 和 begin 等)都会缩进。默认情况下,模块块语句(第一级块)不会缩进。您可以通过在 `vimrc` 中设置变量来启用缩进,如下所示:
let b:verilog_indent_modules = 1
然后将缩进模块块。要停止此操作,请删除该变量。
:unlet b:verilog_indent_modules
要仅为 Verilog 文件设置变量,可以使用以下语句:
au BufReadPost * if exists("b:current_syntax")
au BufReadPost *   if b:current_syntax == "verilog"
au BufReadPost *     let b:verilog_indent_modules = 1
au BufReadPost *   endif
au BufReadPost * endif
此外,设置变量 `b:verilog_indent_width` 可以更改缩进宽度(默认值为 'shiftwidth')。
let b:verilog_indent_width = 4
let b:verilog_indent_width = shiftwidth() * 2
此外,您可以打开调试问题的详细模式:
let b:verilog_indent_verbose = 1
请确保首先执行 ":set cmdheight=2",以允许显示消息。
默认情况下,将对泛型/端口映射语句进行对齐。这会导致以下对齐示例:
ENTITY sync IS
PORT (
       clk        : IN  STD_LOGIC;
       reset_n    : IN  STD_LOGIC;
       data_input : IN  STD_LOGIC;
       data_out   : OUT STD_LOGIC
     );
END ENTITY sync;
要关闭此功能,请在 `vimrc` 文件中添加:
let g:vhdl_indent_genportmap = 0
这将导致先前的对齐示例发生变化:
ENTITY sync IS
PORT (
  clk        : IN  STD_LOGIC;
  reset_n    : IN  STD_LOGIC;
  data_input : IN  STD_LOGIC;
  data_out   : OUT STD_LOGIC
);
END ENTITY sync;
默认情况下,将对等号右侧赋值 “<=” 语句进行对齐。这会导致以下对齐示例:
sig_out <= (bus_a(1) AND
           (sig_b OR sig_c)) OR
           (bus_a(0) AND sig_d);
要关闭此功能,请在 `vimrc` 文件中添加:
let g:vhdl_indent_rhsassign = 0
这将导致先前的对齐示例发生变化:
sig_out <= (bus_a(1) AND
  (sig_b OR sig_c)) OR
  (bus_a(0) AND sig_d);
全行注释(以 "--" 开头的行)将缩进到与上一行注释对齐,前提是 "--" 后面有一个空格。
例如
sig_a <= sig_b; -- start of a comment
                -- continuation of the comment
                -- more of the same comment
在插入模式下,在键入 "-- "(注意空格 " ")之后,按 `CTRL-F` 将使当前的 "-- " 与上一行的 "--" 对齐。
如果上一行不包含 "--",则全行注释将与下一行非空行(不是全行注释)的开头对齐。
缩进以下代码:
sig_c <= sig_d; -- comment 0
       -- comment 1
             -- comment 2
  --debug_code:
  --PROCESS(debug_in)
       --BEGIN
          --  FOR i IN 15 DOWNTO 0 LOOP
           --    debug_out(8*i+7 DOWNTO 8*i) <= debug_in(15-i);
          --  END LOOP;
   --END PROCESS debug_code;
    -- comment 3
sig_e <= sig_f; -- comment 4
         -- comment 5
得到以下结果:
sig_c <= sig_d; -- comment 0
                -- comment 1
                -- comment 2
--debug_code:
--PROCESS(debug_in)
--BEGIN
--  FOR i IN 15 DOWNTO 0 LOOP
--    debug_out(8*i+7 DOWNTO 8*i) <= debug_in(15-i);
--  END LOOP;
--END PROCESS debug_code;
-- comment 3
sig_e <= sig_f; -- comment 4
                -- comment 5
请注意,"--debug_code:" 没有与 "-- comment 2" 对齐,因为 "--debug_code:" 中的 "--" 后面没有空格。
鉴于注释缩进的动态特性,缩进应进行两次。在第一次传递中,将缩进代码。在第二次传递中,将根据正确缩进的代码缩进全行注释。

VIM ft-vim-indent

g:vim_indent_cont
对于缩进 Vim 脚本,有一个变量指定续行(以反斜杠开头的行)的缩进量。
:let g:vim_indent_cont = shiftwidth() * 3
默认值为 shiftwidth 的三倍。
默认情况下,yaml 缩进脚本不会尝试检测多行标量。如果你想启用它,设置以下变量:
let g:yaml_indent_multiline_scalar = 1
命令索引
快速参考