在Vim中按下Tab键时,如何跳转到闭合引号/括号?

5

我一直在尝试使用自动闭合引号和括号的Vim插件。

但由于这些插件有时候表现出奇怪的行为,我不认为我会继续使用它们,但我认为这是一个不错的插件想法。

基本上是以下功能:当你处于一个块内(引号或括号等),按tab键会将你移到块的外面,即块的结尾。

以下是一个示例,其中|表示光标:

(let stuff (+ 1 2|)) ; yo!

; press tab:
(let stuff (+ 1 2)|) ; yo!

; press tab again:
(let stuff (+ 1 2))| ; yo!

希望这能让您了解这个想法。可能已经有插件或配置文件可以实现这一点,但我仍然有兴趣看看如何实现。
以下是我的评论摘录:
我需要的是在插入模式下仅在我处于这些块之一内部时才起作用,否则会像插入真正的制表符一样(因为您多久需要在字符串中放置一个制表符?)。

你尝试过什么?你愿意/能够自己实现吗?仅仅询问一个实现或现有插件并不适合这个网站。 - Ingo Karkat
@IngoKarkat 我其实没有尝试过很多。但是我还不足够能够自己完成这个(至少需要花费几个小时)。 - greduan
由于您正在使用Lisp,您可能还想查看vim-sexp-mappings-for-regular-people以及vim-surround - Peter Rincker
2个回答

6
这个方法可以满足你的一个要求,但如果你不在块内,它将不会插入tab
imap <tab> <esc>])a

使用 ]) 命令可以移动到括号的末尾,它会将您带到右括号处。

您可以将其映射到 tab 键上。

nnoremap <tab> ])

谢谢!我需要的是在插入模式下工作,并且仅当我在这些块之一内部时,否则做一些像插入真实制表符的操作(因为你有多少次需要在字符串中放置制表符?)。 - greduan
你的问题没有提到你需要在插入模式下工作。 - Amit
你的解决方案非常好。Ingo的更接近我所要求的,所以我将使用他的和你的结合。 :) - greduan
@Greduan - 他的解决方案总是很好,总有很多可以从中学习的东西 :) - Amit

4
这确实可以通过:inoremap <expr> <Tab> ...实现,它需要返回(例如<Right>)按键以将光标移动到关闭括号之后(表达式映射比暂时离开插入模式更好,因为这会创建一个新的撤消点等)。
要实现此功能,您可以使用search()n标志进行搜索,以便它不会移动,使用带有\%#的正则表达式来断言光标周围的括号。
:inoremap <expr> <Tab> search('\%#[]>)}]', 'n') ? '<Right>' : '<Tab>'

运行得相当不错。抱歉耽搁了,直到今天才有时间进行彻底测试。 :) - greduan
能否添加引号支持?我尝试在正则表达式中添加 " 但不起作用。谢谢! - rendon
3
@rendon 提到使用 search('\%#[]>)}''"]', 'n') 可以实现目标,但需要注意引号并不像其他字符一样是对称的,所以你不一定会从引号中跳出来。 - Ingo Karkat
@IngoKarkat,谢谢,我会测试它。 - rendon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接