在Vim中通过括号列索引缩进代码?

6

我正在使用Vim编辑Erlang代码。习惯于(大多数Erlang程序员都这样做)根据括号范围缩进Erlang代码。例如,C的缩进通常在花括号内缩进一个制表位:

int main(void) {
    printf("hello, world\n");
    return 0;
}

在Erlang中,常常根据括号开始的列进行缩进:
?assertError({bad_options, [{foo, bar},
                            bad_option]},
             lhttpc:request("http://localhost/", get, [], <<>>, 1000,
                            [bad_option, {foo, bar}])).

上面的例子缩进是为了说明重点,并非主观美感考虑。

如果代码块开始于新一行,制表符宽度将被使用:

?assertError(
    {bad_options, [{foo, bar}, bad_option]},
    lhttpc:request(
         "http://localhost/", get, [], <<>>, 1000,
         [bad_option, {foo, bar}]
    )
).

我 .vimrc 的相关部分:

set expandtab " Spaces for tabs "
set tabstop=4 " Tab width 4 "
set shiftwidth=4
set smarttab
set autoindent

" Enable filetype plugin "
filetype plugin on
filetype indent on

有没有一种在Vim中执行这种缩进的方法,如果有,怎么做?

你试过 https://github.com/jimenezrick/vimerl 吗? - Sergey Miryanov
我意识到我实际上正在使用 vimerl 并升级到了最新版本。但是,它仍然会缩进为1(或有时为2,非常奇怪的是)个制表符宽度。 - Adam Lindberg
2个回答

4

有一个 vimerl 的分支,它实现了 "上下文感知缩进" 而不是 "静态缩进":https://github.com/aszlig/vimerl.git

看起来很有效,所以我会暂时采用这个。


嗨,@Adam Lindberg。已经过去一周了,你对vimerl感觉如何?我有完全相同的要求。谢谢! - JasonSmith
那个分支似乎根据我的需要进行了缩进。 - Adam Lindberg

1
这似乎需要你深入研究和的复杂世界。我相信将以下内容放入你的vimrc中将部分满足你的需求:
set cindent
set cinoptions+=(0

但问题是这将如何影响其他行为。请参阅help cinoptions-values以获取更多信息。应该可以精确地实现您想要的,但可能需要一些尝试。
希望这有所帮助。

看起来有点有希望,但我不知道该使用哪些选项。尝试了很多东西,但没有得到任何可用的东西。怀疑可能是 Erlang 插件也搞乱了事情,因为它有自己的缩进。 - Adam Lindberg
你尝试过使用 set cinoptions? 命令查找 Erlang 更改设置的值(不包括你的更改)吗?这个插件声称可以改善缩进吗?如果是这样,从插件外部调整它可能会很困难。 - Prince Goulash
默认的 cinoptions 看起来是空的。该插件似乎会执行一些手动缩进的操作,这可能会使修复变得困难。 - Adam Lindberg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接