intherither类的vim autoindent构造函数:避免双重缩进

vim autoindent constructor of intherither class: avoid double indentantion

本文关键字:缩进 类的 vim autoindent 构造函数 intherither      更新时间:2023-10-16

我有以下代码:

MyClass::MyClass() :
  BaseClass() {
  doThis();
  doThat();
}

如果我使用gg=G用vim自动缩进代码,我会得到以下结果:

MyClass::MyClass() :
  BaseClass() {
    doThis();
    doThat();
  }

构造函数代码还有一个缩进,并且右括号不是与构造函数对齐,而是与基类定义对齐(可能与上面的行的原因相同)。

有没有一种方法可以通过自动缩进获得第一个代码片段?

目前,我的cino变量在.vimrc:中以以下方式设置

set cino=N-s,l1,b1,g0,i0

谢谢回复。

您可以使用indentexpr选项来完成此操作。简而言之,您必须编写自己的函数来计算缩进量。我写了一个简短的剧本,满足了你的要求,尽管为了时间的利益,我没有把它写得很健壮。

function! MyIndent()
  if getline(v:lnum - 2) =~ '^s*(w)*::(w)*()s*:s*$'
         && getline(v:lnum - 1) =~ '^s*(w)*s*()s*{s*$'
    return cindent(v:lnum) - &shiftwidth
  endif
  if getline(v:lnum) =~ '^s*}s*(//.*|/*.*)=$'
    call cursor(v:lnum, 1)
    silent normal %
    let lnum = line('.')
    if lnum < v:lnum
      if getline(lnum - 1) =~ '^s*(w)*::(w)*()s*:s*$'
             && getline(lnum) =~ '^s*(w)*s*()s*{s*$'
        return cindent(lnum - 1)
      endif
    endif
  endif
  return cindent(v:lnum)
endfunction

如果你转到$VIMRUNTIME/indent,你会看到一堆计算各种编程语言缩进量的文件。我发现这对写剧本很有帮助。