Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Variables 如何从脚本/命令行设置全局变量?_Variables_Vim_Tabs_Global Variables - Fatal编程技术网

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

Variables 如何从脚本/命令行设置全局变量?,variables,vim,tabs,global-variables,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 = c

我试图创建一个小菜单,从“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
函数!TabFunction()
如果!存在(“g:WhatTab”)
让g:WhatTab=“Tab函数?”
恩迪夫
如果!存在(“g:菜单选项”)
让g:MenuTab_choices=“&SuperTab\n&YouCompleteMe”
恩迪夫
让n=确认(g:WhatTab,g:MenuTab_选项,“问题”)
如果n==1
设g:SuperTabMappingForward=''
设g:SuperTabMappingBackward=''
让g:ycm_key_list_select_completion=['',]
让g:ycm_键_列表_上一个_完成=['',]
elseif n==2
设g:SuperTabMappingForward=''
设g:SuperTabMappingBackward=''
让g:ycm_key_list_select_completion=['',]
让g:ycm_键_列表_上一个_完成=['',]
恩迪夫
结束
这不起作用。
当我试图从命令行检查这些变量的值时
:回显“全局变量”

这些值是正确的,但它们不能按预期工作


不能这样声明全局变量吗?

使用
g:
变量前缀可确保全局变量在函数内设置;这是正确的。您的问题是插件配置变量
g:SuperTabMappingForward
在插件加载期间(当Vim启动时)只计算一次,而不是在运行时。这种机制不适用于动态重新配置

解决 您必须自己重新映射,而不是切换(忽略的)配置变量。至少SuperTab定义了相应的
目标;我想YCM也会这样做:

if n == 1
  imap <Tab> <Plug>SuperTabForward
  ...
elseif n == 2
  imap <C-Tab> <Plug>SuperTabForward
如果n==1
imap超级表转发
...
elseif n==2
imap超级表转发

或者,蛮力变体是重新加载插件(
:runtime plugin/supertab.vim
),以获得要考虑的更改的全局变量值,但这非常低效,可能会导致错误,并使您另外处理插件加载保护。

(关于从函数中设置全局变量)。谢谢您Ingo。Youcompleteme执行如下映射:
exe'inoremap pumvisible()?“\”:“\”“
当我在
n==2
中使用它时,它部分起作用:有时当我使用youcompleteme键时,会出现一些建议,但有时也会出现SuperTab建议。它似乎仍在使用SuperTab。该映射中的插件触发器在哪里?图片中仍然缺少一些东西…这两个映射中没有插件触发器。”bundle映射中的ucompleteme.vim文件(autoload中的一个youcompleteme.vim,插件映射中的一个youcompleteme.vim)那么YCM是否仅仅依赖于
'completefunc'
'omnifunc'
?那么您根本不需要切换SuperTab映射,而是配置完成源代码!我不太了解您。这是YCM completefunc映射吗?
命令!-nargs=*-complete=custom,youcomplete#子命令complete\YcmCompleter calls:CompleterCommand()