使用autocmd设置时未设置或未检测到Vimscript变量

时间:2015-02-14 02:38:17

标签: vim

我想仅在某些插件可用时才设置变量。为此,我使用:

augroup plugin_initialize
    autocmd!
    autocmd BufEnter * call LoadPluginSettings()
augroup END

function! LoadPluginSettings()
    if exists(':NERDTree')
        let NERDTreeIgnore = ['\.pyc$', '\.class$']
        nnoremap <silent> <Leader><Leader>d :NERDTreeCWD<CR>
    endif
    if has('python')
        if exists(':UltiSnipsEdit')
            let g:UltiSnipsExpandTrigger="<C-l>"
            let g:UltiSnipsJumpForwardTrigger="<C-l>"
            let g:UltiSnipsJumpBackwardTrigger="<C-h>"
        endif
    endif
endfunction

对于NERDTree我得到映射但不是变量(我相信因为范围 - 有替代方案吗?)。最奇怪的是,对于UltiSnips,我可以正确设置所有变量,但它们不能作为触发器(触发器是默认值)。

有什么想法吗?谢谢!

1 个答案:

答案 0 :(得分:3)

您没有向NERDTreeIgnore添加范围修饰符。它默认为函数内的局部变量。要使其成为全局变量,您需要在其前面添加g:。所以它会是g:NERDTreeIgnore

function! LoadPluginSettings()
    if exists(':NERDTree')
        let g:NERDTreeIgnore = ['\.pyc$', '\.class$']
        nnoremap <silent> <Leader><Leader>d :NERDTreeCWD<CR>
    endif
    if has('python')
        if exists(':UltiSnipsEdit')
            let g:UltiSnipsExpandTrigger="<C-l>"
            let g:UltiSnipsJumpForwardTrigger="<C-l>"
            let g:UltiSnipsJumpBackwardTrigger="<C-h>"
        endif
    endif
endfunction

至于设置不起作用的原因。 BufEnter在加载插件后发生。加载插件时,它会检查变量并适当设置值。在事实之后改变变量什么也没做。

我认为你应该把变量留在vimrc中。一些额外的变量不会减慢vim的速度。如果需要,您仍然可以有条件地加载映射。