如果在vimscript中有两个语句是错误的吗?

时间:2016-02-09 14:22:10

标签: vim

我最近决定改造我的.vimrc

根据说明here,我在名为ultisnips_tab_hack.vim的文件中添加了一个小片段,该文件来自我的.vimrc

该片段的最后一行是:

inoremap <expr> <CR> pumvisible() ? "\<C-R>=ExpandSnippetOrCarriageReturn()\<CR>" : "\<CR>"

根据我的判断,将 Enter 映射到一个表达式,该表达式将测试弹出菜单是否可见。如果是,则插入的文本将由片段中定义的ExpandSnippetOrCarriageReturn()函数决定。否则将插入简单的回车。

此代码段应该使YouCompleteMe和Ultisnips表现出来,并且,根据this other comment,最后一行应该修改为以下内容,以使其表现为vim-endwise

let g:endwise_no_mappings = 1
inoremap <expr> <CR> pumvisible() ? "\<C-R>=ExpandSnippetOrCarriageReturn()\<CR>" : "\<CR>\<C-R>=EndwiseDiscretionary()\<CR>"

除了如果弹出菜单不可见外,它还会调用vim-endwise函数来决定是否应插入其他内容。而且,endwise映射被禁用,因此它不会与我们的自定义映射冲突。

所以,我试图制作一个无论是否加载vim-endwise都能解决的解决方案(因为我只想在ruby文件上加载它)。我尝试的是:

if exists("*EndwiseDiscretionary")
  let g:endwise_no_mappings = 1
  inoremap <expr> <CR> pumvisible() ? "\<C-R>=ExpandSnippetOrCarriageReturn()\<CR>" : "\<CR>\<C-R>=EndwiseDiscretionary()\<CR>"
else
  inoremap <expr> <CR> pumvisible() ? "\<C-R>=ExpandSnippetOrCarriageReturn()\<CR>" : "\<CR>"
endif

令我惊讶的是,当我按下 Enter (加载了vim-endwise时),这给了我以下奇怪的错误。

E15: Invalid Expression: ExpandSnippetOrCarriageReturn()\

此外,插入了以下文字:pumvisible() ? "而不是回车。

令我更加惊讶的是,无论是否加载了vim-endwise,以下都没有造成任何错误。

let g:endwise_no_mappings = 1
if exists("*EndwiseDiscretionary")
  inoremap <expr> <CR> pumvisible() ? "\<C-R>=ExpandSnippetOrCarriageReturn()\<CR>" : "\<CR>\<C-R>=EndwiseDiscretionary()\<CR>"
else
  inoremap <expr> <CR> pumvisible() ? "\<C-R>=ExpandSnippetOrCarriageReturn()\<CR>" : "\<CR>"
endif

之前我被一些奇怪的vimscript东西咬了,所以我现在想知道if中的两个语句是否会导致这类问题而且我应该总是将它们提取到函数中。

或许我需要一个我不知道的特殊分隔符,或类似的东西。也许这是一个在映射之上进行变量赋值的问题?

任何vim大师都能解释一下吗?

TL; DR

在插入模式下按 Enter 时出现奇怪的E15: Invalid Expression: ExpandSnippetOrCarriageReturn()\错误:

if exists("*EndwiseDiscretionary")
  let g:endwise_no_mappings = 1
  inoremap <expr> <CR> pumvisible() ? "\<C-R>=ExpandSnippetOrCarriageReturn()\<CR>" : "\<CR>\<C-R>=EndwiseDiscretionary()\<CR>"
else
  inoremap <expr> <CR> pumvisible() ? "\<C-R>=ExpandSnippetOrCarriageReturn()\<CR>" : "\<CR>"
endif

按预期工作:

let g:endwise_no_mappings = 1
if exists("*EndwiseDiscretionary")
  inoremap <expr> <CR> pumvisible() ? "\<C-R>=ExpandSnippetOrCarriageReturn()\<CR>" : "\<CR>\<C-R>=EndwiseDiscretionary()\<CR>"
else
  inoremap <expr> <CR> pumvisible() ? "\<C-R>=ExpandSnippetOrCarriageReturn()\<CR>" : "\<CR>"
endif

0 个答案:

没有答案