vim - 如何将 Ctrl-R_= 与 :execute 一起使用

标签 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 以这种方式表示上面 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/

相关文章:

vim - 我如何接受 vimdiff hunk 的两个更改?

Vim - 从当前光标位置拉到行首

shell - 如何在 vim 中将当前缓冲区或行作为 stdin 发送到 system()?

c++ - 将满足特定条件的文件加载到 vim 中的隐藏缓冲区中

使用 Tmux 时 Vim NerdTree 损坏

vim - Vim 中嵌套注释折叠的语法高亮

vim - 在哪里可以找到 go 语言的 Vim 语法文件?

vim - 为什么奇怪的字符($p)会出现在 vim 中每个文件的开头?

Vimrc 忽略我的 <cr>

php - 从 vim 中运行 PHP 文件