我正在尝试创建一个小菜单,从“YouCompleteMe”切换到“Supertab”,反之亦然。
function! TabFunction()
if !exists("g:WhatTab")
let g:WhatTab = "Tab function?"
endif
if !exists("g:MenuTab_choices")
let g:MenuTab_choices = "&SuperTab\n&YouCompleteMe"
endif
let n = confirm(g:WhatTab, g:MenuTab_choices, "Question")
if n == 1
let g:SuperTabMappingForward = '<Tab>'
let g:SuperTabMappingBackward = '<S-Tab>'
let g:ycm_key_list_select_completion = ['<C-Tab>', '<Down>']
let g:ycm_key_list_previous_completion = ['<C-S-Tab>', '<Up>']
elseif n == 2
let g:SuperTabMappingForward = '<C-Tab>'
let g:SuperTabMappingBackward = '<C-S-Tab>'
let g:ycm_key_list_select_completion = ['<Tab>', '<Down>']
let g:ycm_key_list_previous_completion = ['<S-Tab>', '<Up>']
endif
endfun
这不起作用。
当我尝试从命令行检查这些变量的值时
:echo 'global variable'
值是正确的但它们不能按预期工作。
是否无法声明这样的全局变量?
答案 0 :(得分:2)
使用g:
变量前缀可确保在函数内设置全局变量;这是对的。您的问题是插件配置变量(如g:SuperTabMappingForward
)仅在插件加载期间评估(当Vim启动时),但不会在运行时期间评估。这种机制不适用于动态重新配置。
您必须自己进行重新映射,而不是切换(忽略的)配置变量。至少SuperTab定义了相应的<Plug>...
目标;我猜YCM也这样做了:
if n == 1
imap <Tab> <Plug>SuperTabForward
...
elseif n == 2
imap <C-Tab> <Plug>SuperTabForward
或者,蛮力变体将重新加载插件(:runtime plugin/supertab.vim
)以获取要考虑的已更改的全局变量值,但效率非常低,可能会导致错误,并使您另外,还可以解决插件加载保护问题。