如何使用Ctrl-R_ = with:execute

时间:2014-03-25 11:39:45

标签: vim

我正在尝试在:execute命令上展开的变量上获得表达式。我猜这可以通过使用Ctrl-R_=来实现,但是不清楚应该如何插入特殊字符。以下都不起作用:

exec 'echo ^R=1+1^M'
exec "echo <ctrl-r>=1+1<cr>"

目的是设置一个全局变量,用作插件中的选项,以选择如何显示结果。它用于:execute命令,适用于'vsplit'或'split'。但垂直或水平分割之间的选择有时取决于窗口布局。为了做到这一点而不增加插件的额外复杂性,我想到了以下内容:

let var = '<ctrl-r>=(winwidth(0) > 160 ? "vsplit" : "split")<cr>'

修改

目前该插件具有以下内容:

exec 'pluginCommands' . g:splitCmd . ' morePluginCommands'

g:splitCmd是一个插件选项,适用于设置为“split”,“vsplit”,“tabe”等的情况。我的目的是更改此固定行为,设置g:splitCmd in这种方式表示上面execute上的表达式,而不是固定字符串。

4 个答案:

答案 0 :(得分:1)

使用:execute,您已经有了评估表达式的方法;只需将它们移出静态字符串即可对其进行评估:

exec 'echo ' . 1+1

<C-R>仅适用于命令行模式(和插入模式),因此仅在:cnoremap ...命令内(或:normal)。 (即使在那里,您也可以使用:map <expr>,这通常会为您提供更简单的代码。)

答案 1 :(得分:1)

我认为你想要的只是

:let var = (winwidth(0) > 160) ? "vsplit" : "split"

答案 2 :(得分:1)

现在我已经更好地理解了这个问题,我认为如果在:execute g:pluginconf . 'split'语句中插入变量值,则无法在config var中进行动态重新评估。为此,您需要另一个嵌套:execute,或通过:normal! :...切换到命令行模式;这两种方法都会在附加的. 'split'上失败,因为您无法在其周围添加引用。

我解决这个问题的方法是在插件的映射中添加:help :map-expr;变化

:nmap <Leader>x <Plug>Plugin

:nnoremap <expr> <SID>(PluginInterceptor) PluginInterceptor()
:nmap <Leader>x <SID>(PluginInterceptor)<Plug>Plugin

现在,在执行映射之前,您将被调用,并且可以影响插件配置:

fun! PluginInterceptor()
    let g:plugconf = winwidth(0) > 160 ? "vsplit" : "split"
    return ''
endfun

如果由于某种原因修改插件映射很困难,您还可以通过PluginInterceptor()触发:autocmd功能;对于这种特殊情况例如在WinEnter事件上。

答案 3 :(得分:1)

在我看来似乎

exec 'pluginCommands' . eval(g:splitCmd) . ' morePluginCommands'

应该可以正常工作,并且是解决此问题的简单方法。