Vimscript autocmd函数失败

时间:2014-05-20 04:09:35

标签: vim autocmd

" ----------------------------------------------------------------------------
" Functions
" ----------------------------------------------------------------------------

function! g:UltiSnips_Complete()
  call UltiSnips#ExpandSnippet()
  if g:ulti_expand_res == 0
    if pumvisible()
      return "\<c-n>"
    else
      call UltiSnips#JumpForwards()
      if g:ulti_jump_forwards_res == 0
        return "\<tab>"
      endif
    endif
  endif
  return ""
endfunction
"
" ----------------------------------------------------------------------------
" Autocmds
" ----------------------------------------------------------------------------

augroup relativenumber
  autocmd InsertEnter,focusLost * :set norelativenumber
  autocmd InsertLeave,focusGained * :set relativenumber
augroup END

autocmd BufEnter * exec "inoremap <silent> " . g:UltiSnipsExpandTrigger . " <c-r>=g:UltiSnips_Complete()<cr>"

上面的代码是我的.vimrc文件的结尾。这个函数用于工作,但经过一些更新(YouCompleteMe或UltiSnips,不确定)之后,这些工作的唯一时间是我第一次在目录中打开vim然后从那里打开文件。我认为它与autocmd有关,但说实话,我不知道从哪里开始。我尝试将autocmd事件更改为BufRead,但不幸的是,这没有任何区别。感谢任何帮助,谢谢!

编辑:如果您认为有更好的地方我可以发布此问题,或者您需要更多详细信息,请告诉我!我很乐意提供帮助。

2 个答案:

答案 0 :(得分:2)

似乎BufEnter在VimEnter之前运行。这是一个问题,因为SnipMate在VimEnter中显示其映射。因此,第一个缓冲区具有SnipMate映射而不是自定义映射。当你切换到一个新缓冲区时,autocmd会再次运行,为新缓冲区提供映射。

要解决此问题,只需将BufEnter映射设为缓冲区本地映射即可。这意味着映射不会被SnipMate映射覆盖。当vim看起来运行不同的映射时,缓冲区本地映射具有优先权。

autocmd BufEnter * exec "inoremap <buffer> <silent> " . g:UltiSnipsExpandTrigger . " <cr>=g:UltiSnips_Complete()<cr>"

答案 1 :(得分:1)

我可以建议一些更正:

  1. 您不需要将映射放在autocmd BufEnter *中,如果您希望此映射在任何地方都可用,只需添加

    exec "inoremap <silent>" g:UltiSnipsExpandTrigger "<c-r>=g:UltiSnips_Complete()<cr>"`
    
  2. 从它的外观来看,你真正需要的是<expr>映射,这样的事情会更好:

    exec "inoremap <expr> <silent>" g:UltiSnipsExpandTrigger g:UltiSnips_Complete()
    
  3. 注意:exec接受以空格分隔的多个args,如果你只想在字符串之间添加一个空格只需添加空格,只有当你想避免exec会自动添加空间时才应该使用连接&#39 ;空间分隔的args。

    编辑:

    1. 更新了表达式映射,以便<expr>必须是第一个参数。
    2. 由于g:UltiSnipsExpandTrigger是由UltiSnips插件定义的,它在vimrc中尚未提供/定义,它是在所有插件之前获取的。因此,您应该将此代码段放在after/plugin/ultisnips_complete.vim中。那你就不应该得到错误。