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



我正在尝试创建一个小菜单,从"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)以获得要考虑的更改的全局变量值,但这是非常低效的,可能会导致错误,并且使您另外绕过插件加载保护。

相关内容

  • 没有找到相关文章

最新更新