如何从脚本/命令行设置全局变量?

时间:2014-07-09 17:50:03

标签: variables vim tabs global-variables

我正在尝试创建一个小菜单,从“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'
值是正确的但它们不能按预期工作。

是否无法声明这样的全局变量?

1 个答案:

答案 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)以获取要考虑的已更改的全局变量值,但效率非常低,可能会导致错误,并使您另外,还可以解决插件加载保护问题。