【问题标题】:VIM Single Compile command from insert mode插入模式下的 VIM 单一编译命令
【发布时间】:2012-07-27 19:59:43
【问题描述】:

我正在关注Mapping keys in Vim - Tutorial (Part 1) - 6.2 Insert mode maps,上面写着:

The <C-R>= command doesn't create a new undo point.
You can also call Vim functions using the <C-R>= command:

:inoremap <F2> <C-R>=MyVimFunc()<CR>

我正在尝试使用它来调用SingleCompile#Compile(),例如:

map! <F5> <C-R>=SingleCompile#Compile()<CR>

它可以工作,但问题是当我回到插入模式时,会插入一个 0 字符作为副作用。

为什么会这样,我该如何避免?

编辑:

我使用&lt;C-R&gt; 是因为它不会创建撤消点,并且其目的是调用函数而不是像&lt;C-O&gt; 那样输入命令。我不想创建撤消点。

编辑:

我已经根据 Ingo Karkat 提供的三元运算符技巧更新了 VIM wiki。

【问题讨论】:

    标签: vim macvim


    【解决方案1】:

    函数的隐式返回值为0。您需要修改SingleCompile#Compile() 或编写一个返回空字符串的包装器:

    function! SingleCompileWrapper()
        call SingleCompile#Compile()
        return ''
    endfunction
    
    map! <F5> <C-R>=SingleCompileWrapper()<CR>
    

    另一种巧妙的技巧是评估 ?: 三元运算符内的函数:

    map! <F5> <C-R>=SingleCompile#Compile()?'':''<CR>
    

    【讨论】:

    • 我认为您的解决方案几乎就在那里,我只是不想每次都创建一个包装器。你知道如何创建一个通用包装器来调用我提供的一些函数吗?
    • 你的把戏对我不起作用,我在输入 后听到错误提示音
    • 这些功能你有几个?您可以编写一个采用 funcref 的通用包装器,但映射不会变得更漂亮。也许附加 &lt;BS&gt; (如我的其他答案)真的是你要走的路吗?!
    • 现在,我需要 2 个,但将来,我不知道。
    • 谢谢,你的伎俩奏效了,我已经让 改变了那里并且忘记了它。改回 解决了。
    【解决方案2】:

    '0'是函数的返回值,在插入模式调用时自然会插入到缓冲区中

    使用 而不是 离开命令的插入模式

    【讨论】:

    • 我正在使用 因为它不会创建撤消点,并且其目的是调用函数而不是像 那样输入命令。我不想创建撤消点。
    • 感谢您提供的原因部分。我仍然希望有一个理想的响应,它会忽略插入缓冲区的函数的返回值。
    【解决方案3】:

    我不推荐这种方法,但是乡巴佬解决方案怎么样(只需删除0 after-the-fact):

    map! <F5> <C-R>=SingleCompile#Compile()<CR><BS>
    

    说真的,对于那些无法使用&lt;C-R&gt; 并且您必须离开插入模式的情况,:undojoin 可能会有所帮助。

    【讨论】:

    • 我会通过这个,因为我不想:q!因为那个闪烁的0。但我会看看:undojoin,谢谢
    猜你喜欢
    • 1970-01-01
    • 2011-04-29
    • 1970-01-01
    • 2019-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-15
    相关资源
    最近更新 更多