vim - Vim 右括号(不使用插件)在我按 enter 或在第一个括号后不立即按 enter 时表现不同
问题描述
如何在不使用外部插件的情况下在 Vim 8 中实现以下自动右括号行为?
如果我使用
inoremap { {};<Left><Left>
那么如果我输入
int array[2] = {
它会通过放置 } 自动正确执行;以及将光标放在括号内。
但我想要的是,当我使用结构时,我希望在插入第一个括号后立即按 Enter 后发生以下情况,
struct test {
| <- cursor is here
};
为了在 Vim 8 中实现上述两种行为,我必须进行哪些更改?
解决方案
“不使用外部插件”的部分是棘手的。
要获得您想要的行为,您必须使用可能使用映射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
此处获得正确的缩进。)
但是,如前所述,这并不总是按预期工作。这很简单。
接下来你需要修复退格,或者修复它,}
如果你已经在输入,}
你会跳过它......你会想要插件,相信我!
推荐阅读
- python - pythonw - 无法导入大多数(如果不是全部)站点包,甚至一些内置模块
- python - 当我输入 3 时,我得到打印 4 次的结果。你能告诉我为什么会这样吗?我是 python 新手
- python - 在类范围内导入模块的类型提示
- c++ - 如何调试 WebKit2GTK+ 扩展
- php - Nginx cors 启用 html 文件不起作用
- adobe - InDesign - 用于查找尖括号之间的特定单词并将其复制到列表中的脚本
- php - 如何修复'PHP代码在laravel公用文件夹中不起作用'
- python - 如何根据Python中的起始行和结束行获取类的范围?
- python - TensorFlow 数据集的意外维度
- c - log2 在 C 中导致 STM32F4 MCU 出现故障