使用Vimscript跳转到一行中的特定字符

时间:2017-03-25 08:05:42

标签: vim

我希望在插入模式下绑定TAB以跳转到#39;)之后的位置,如果它在活动行中的光标之后存在,否则它应该只是作为普通TAB。我没有设法在Vimscript中找到搜索或查找功能,将搜索限制为一行,我仍然不知道如何检查是否找到了该字符。所以在伪代码中应该看起来像:

inoremap <TAB> :if (char_in_line(')')) | cursor_on_char() | a (append) | else '\t' | endif

1 个答案:

答案 0 :(得分:1)

要获取当前行文字,请使用getline('.')。那你就可以轻松了 检查)是否有match(),如果有,则返回-1 如果有,则为无或)位置。

在插入模式下^R,您可以插入结果 表达。然后,使用传统a?b:c的测试(请参阅帮助 对于expr1)并返回适当的字符(制表符或移动)。 要返回移动,您可以在允许的插入模式下使用^O 您可以在不离开插入的情况下运行正常模式命令。技术上 您只能运行一个命令,交互式完成。但在这 例如,它将由Vim立即插入,您可以执行两个命令 立即:f)移至下一个)l以调整光标 位置。

全部放在一起:

:inoremap <tab> <c-r>=match(getline('.'), ')') < 0 ? "\t" : "\<c-o>f)l"<cr>

唯一剩下的一点是这个测试不考虑光标 位置。但是,因为match()返回了匹配的位置,所以 可以将结果与getcurpos()[2]进行比较(请参阅此处的帮助 功能也是如此)当然也会相应地调整逻辑。

然而,对于比这更复杂的事情,我建议建设 这在你操作光标位置的功能中 希望(帮助是你的朋友,特别是:h function-list),然后打电话 这个功能在你的地图上。

inoremap <tab> <esc>:call InsertSmartTab()<cr>