我正在尝试创建一个小菜单,从"YouCompleteMe"切换到"Supertab",反之亦然。
function! TabFunction()
if !exists("g:WhatTab")
let g:WhatTab = "Tab function?"
endif
if !exists("g:MenuTab_choices")
let g:MenuTab_choices = "&SuperTabn&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'
这些值是正确的,但它们不像预期的那样工作。
不能像这样声明一个全局变量吗?
使用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
)以获得要考虑的更改的全局变量值,但这是非常低效的,可能会导致错误,并且使您另外绕过插件加载保护。