我希望在插入模式下绑定TAB以跳转到#39;)之后的位置,如果它在活动行中的光标之后存在,否则它应该只是作为普通TAB。我没有设法在Vimscript中找到搜索或查找功能,将搜索限制为一行,我仍然不知道如何检查是否找到了该字符。所以在伪代码中应该看起来像:
inoremap <TAB> :if (char_in_line(')')) | cursor_on_char() | a (append) | else '\t' | endif
答案 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>