我正在尝试在: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
上的表达式,而不是固定字符串。
答案 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'
应该可以正常工作,并且是解决此问题的简单方法。