1
" ----------------------------------------------------------------------------
" 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,但不幸的是,这没有任何区别。任何帮助表示赞赏,谢谢!

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

4

2 回答 2

2

似乎 BufEnter 在 VimEnter 之前运行。这是一个问题,因为 SnipMate 在 VimEnter 中建立了它的映射。所以第一个缓冲区有 SnipMate 映射而不是您的自定义映射。当您切换到新缓冲区时,autocmd 会再次运行,为新缓冲区设置映射。

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

autocmd BufEnter * exec "inoremap <buffer> <silent> " . g:UltiSnipsExpandTrigger . " <cr>=g:UltiSnips_Complete()<cr>"
于 2014-05-24T17:27:48.503 回答
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()
    

注意: exec 接受多个由空格分隔的 args,如果您只想在字符串之间添加一个空格,只需添加空格,只有在您想避免 exec 自动添加到其空格分隔的 args 中的空间时才应使用连接。

编辑:

  1. 更新了表达式映射,因此它<expr>必须是第一个参数。
  2. 因为 g:UltiSnipsExpandTrigger 是由 UltiSnips 插件定义的,所以它在你的 vimrc 中还不可用/定义,它在所有插件之前被采购。因此,您应该将这段代码放入after/plugin/ultisnips_complete.vim. 那么你不应该得到错误。
于 2014-05-25T16:01:37.960 回答