我正在尝试获取在 :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
以这种方式表示上面 execute
上的表达式,而不是固定字符串。
最佳答案
现在我更好地理解了这个问题,我认为如果将变量的值插入 :execute g:pluginconf . 'split'
中,则不可能在配置变量内进行动态重新评估。陈述。为了实现这一点,您需要另一个嵌套 :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
事件。
关于vim - 如何将 Ctrl-R_= 与 :execute 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22633469/