首页 > 解决方案 > Vim 右括号(不使用插件)在我按 enter 或在第一个括号后不立即按 enter 时表现不同

问题描述

如何在不使用外部插件的情况下在 Vim 8 中实现以下自动右括号行为?

如果我使用

inoremap { {};<Left><Left>

那么如果我输入

int array[2] = {

它会通过放置 } 自动正确执行;以及将光标放在括号内。

但我想要的是,当我使用结构时,我希望在插入第一个括号后立即按 Enter 后发生以下情况,

struct test {
    | <- cursor is here
};

为了在 Vim 8 中实现上述两种行为,我必须进行哪些更改?

标签: vim

解决方案


“不使用外部插件”的部分是棘手的。

要获得您想要的行为,您必须使用可能使用映射inoremap的键,该键将查看光标下的字符,查看它是否为 a ,在这种情况下,将其向下移动两行,取消缩进该行(仅当第一个缩进),返回一个,重新缩进它......<CR><expr>}

如果它不是 a },那么就表现得像一个正常的<CR>(这部分很容易通过<expr>映射。)

问题是,当您走到这一步时,您已经完成了编写插件的一半,因此您最好只获得一个针对此处可能发生的所有极端情况进行了彻底调试的插件。

如果你想要一些非常简单的东西:

inoremap <expr> <CR>
    \ getline('.')[col('.')-1]=='}'
    \ ? "\<CR>\<C-d>\<C-o>O" : "\<CR>"

它使用 a<CR>后跟 aCTRL-D来取消缩进},然后CTRL-O使用O正常模式命令,该命令在该命令上方插入一个新行。(使用O此处获得正确的缩进。)

但是,如前所述,这并不总是按预期工作。这很简单。

接下来你需要修复退格,或者修复它,}如果你已经在输入,}你会跳过它......你会想要插件,相信我!


推荐阅读