首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Vimscript autocmd函数失败

Vimscript autocmd函数失败
EN

Stack Overflow用户
提问于 2014-05-20 04:09:34
回答 2查看 1.2K关注 0票数 1
代码语言:javascript
复制
" ----------------------------------------------------------------------------
" 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,然后从目录中打开一个文件。我认为这与自动don有关,但老实说,我甚至不知道从哪里开始。我尝试将autocmd事件更改为BufRead,但不幸的是,这并没有什么不同。任何帮助都是感激的,谢谢!

编辑:如果你认为有一个更好的地方我可以张贴这个问题或你需要更多的细节,请告诉我!我很乐意帮忙。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-24 17:27:48

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

要解决这个问题,只需使BufEnter映射成为缓冲区本地映射。这意味着映射不会被SnipMate映射所编写。并且,当vim看起来运行不同的映射时,缓冲区本地映射具有优先级。

代码语言:javascript
复制
autocmd BufEnter * exec "inoremap <buffer> <silent> " . g:UltiSnipsExpandTrigger . " <cr>=g:UltiSnips_Complete()<cr>"
票数 2
EN

Stack Overflow用户

发布于 2014-05-25 16:01:37

我可以提出以下几点更正:

  1. 不需要将映射放在autocmd BufEnter *中,如果希望该映射在任何地方都可用,只需添加 exec "inoremap“g:UltiSnipsExpandTrigger”=g:UltiSnips_Complete()“
  2. 从外观上看,您真正需要的是一个<expr>映射,这样的映射应该更好: exec "inoremap“g:UltiSnipsExpandTrigger g:UltiSnips_Complete()

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

编辑:

  1. 更新表达式映射,以便<expr>必须是第一个参数。
  2. 由于g:UltiSnipsExpandTrigger是由UltiSnips插件定义的,所以它还没有在您的vimrc中提供/定义,它是在所有插件之前提供的。因此,您应该将这段代码片段放在after/plugin/ultisnips_complete.vim中。那你就不应该犯这个错误。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23750871

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档