如何根据前一个字符在Vim中捕获一个字符

时间:2014-04-18 09:38:32

标签: vim editor vi

我创建了以下映射来模拟某些IDE中的行为,其中当您在{之类的函数声明之后插入foo()时,关闭}并自动插入空行并且光标为设置为标签位置的空行。

:imap { {<CR><CR>} <up><Tab>     

当我在任何上下文中插入{时,这当然会出现这种情况。如何根据之前插入的字符进行操作?必须涉及vim脚本功能吗? 注意:我不想使用外部vim插件。

3 个答案:

答案 0 :(得分:1)

IDE通常在输入{&lt; CR&gt;后进行此扩展,这在vimscript中很容易做到:

:imap {<CR> {<CR><CR>} <up><Tab>

如果您继续在同一行输入其他内容,则不会扩展。

需要注意的是,在使用此映射键入{时,会有一点延迟。有关详细信息,请参阅'timeout'和'timeoutlen'选项。

答案 1 :(得分:1)

这些代码片段在插入模式下为光标之前和之后提供字符:

let previous_character = getline(".")[col(".")-2]
let next_character     = getline(".")[col(".")-1]

您可以在<expr>映射中使用它们:

:inoremap <expr> { getline(".")[col(".")-2] == " " ? "{^M}^OO" : "{"

上面的无意义映射会在决定是否插入{或展开的{}之前检查光标前的字符是否为空格。

如果你想要一个聪明的&#34;映射您赢得了无法编写一个或多个功能。例如,我使用的是69行。

答案 2 :(得分:0)

您将在Automatically append closing characters Vim Tips Wiki页面上找到多种方法和插件列表。请注意,尽管存在简单的解决方案,但它们通常有一些缺点,并且不幸的是,整个方法在Vim 7.4中被解除了。