【问题标题】:Vim: How to create a custom compound command with no timeout?Vim:如何创建没有超时的自定义复合命令?
【发布时间】:2012-11-25 12:48:22
【问题描述】:

在 Vim 中有一些没有超时的内置复合命令,例如:g 永远等待下一次击键。我想创建我的自定义复合绑定以使其行为类似。但是,最好不要影响其他绑定(我暗示在这里使用set notimeout 设置的可能性)。如果对于特定绑定无法实现,那么我想我必须退回到set notimeout 设置。那么有什么建议吗?

【问题讨论】:

    标签: vim binding timeout mapping command


    【解决方案1】:

    如果您对不工作 showcmd 并且光标位于右下角同时等待下一个字符感到满意,请使用 getchar()

    nnoremap <Plug>PluginAction-a do-something-here-for-key-a
    function s:Getchar()
        let char=getchar()
        if type(char)==type(0)
            return nr2char(char)
        endif
        return char
    endfunction
    nmap <expr> \g "<Plug>PluginAction-".<SID>Getchar()
    

    .

    【讨论】:

    • 对不起,我不太擅长 Vim 的编程。你能解释一下nnoremap &lt;Plug&gt;PluginAction-a do-something-here-for-key-anmap &lt;expr&gt; \g "&lt;Plug&gt;PluginAction-".&lt;SID&gt;Getchar()。更具体地说,例如我希望l 什么都不做,而是永远等待下一次中风。所以lilo 会做点什么。您能否更新您的答案,以便我可以看到它应该如何适合我的情况。谢谢。
    • @Haroogan 在nmap 中将\g 替换为l。添加nnoremap &lt;Plug&gt;PluginAction-i …nnoremap &lt;Plug&gt;PluginAction-o …(分别对应lilo)。见:h :map-expression:h :map,这里没有魔法。
    【解决方案2】:

    只要不与内置命令重叠,您就可以只创建到复合映射的第一个键的映射,并通过 getchar() 使用复合映射的所有后续键(无限期等待key),然后根据输入的键的完整序列分派到相应的处理程序。

    这当然不如直接映射那么舒服,但应该可以解决问题。尽管我真的会认真思考'timeoutlen' 的良好价值是否还不能解决您的问题;至少我从来没有认为这是一个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-22
      • 2015-12-30
      • 2020-06-21
      • 2014-04-02
      • 1970-01-01
      • 2019-02-02
      相关资源
      最近更新 更多