【问题标题】:How to write a conditional mapping in VIM?如何在 VIM 中编写条件映射?
【发布时间】:2017-02-03 12:19:27
【问题描述】:

我想做nnoremap Q :q!<cr>nnnoremap Q :bd<CR>,我该如何混合这两个绑定?
我最理想的做法是让Q 绑定足够智能,以便知道我们何时在缓冲区中,以及何时这是窗口中的最后一个缓冲区。

【问题讨论】:

    标签: vim key-bindings


    【解决方案1】:

    map <expr> (:h map-<expr>) 是你的朋友。

    nnoremap <expr> Q yourConditionExpression ? ':q!<cr>':':bd<cr>'
    

    在上面

    yourConditionExpression
    

    可以是布尔表达式,例如3&gt;0 或函数返回布尔值。你可以把检查逻辑放在那里。

    【讨论】:

    • 好主意。但这似乎只调用一次yourConditionExpression - 当读取 .vimrc 文件时。例如,如果映射是nnoremap &lt;expr&gt; &lt;F12&gt; MyFunc == 0() ? ':Yep' : 'Nope',那么一旦读取键绑定,按 F12 总是返回相同的结果,即使执行 :echom MyFunc() 会返回不同的结果。
    • @BrentFaust 尝试nnoremap &lt;expr&gt; &lt;F12&gt; MyFunc() 并让您的MyFunc() 返回击键(字符)。虽然我没有测试。但这应该不是问题,因为在我的设置中我有getchar() 的功能,如果它只被评估一次,它将不起作用。
    • 你是对的 - 它总是调用该函数。只是我的函数中有错误需要更改焦点窗格:exe "normal! \&lt;c-w&gt;l" 给出错误 E523: Not allowed here(在 noremap 中)。
    猜你喜欢
    • 2014-10-21
    • 1970-01-01
    • 1970-01-01
    • 2012-07-04
    • 2014-12-07
    • 2015-11-14
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    相关资源
    最近更新 更多