vimscript:在 inoremap 中调用函数会抛出"unknown function"



我已经将Neovim与CoC一起使用了一段时间,没有遇到任何问题。昨天我把操作系统从Ubuntu 21.04升级到22.04。如果不对我的vim配置文件进行任何更改,就会弹出一个错误。我会用例子更好地解释:

这些是我的配置文件(拆分成许多文件,非常棒(:https://github.com/fr-mm/dot-files

错误来自此文件(CoC配置文件(:https://github.com/fr-mm/dot-files/blob/bode/files/vim/plugins/coc.vim

在这个文件中,我有一个非常常见的用于触发自动完成的片段:

inoremap <silent><expr> <TAB>
 pumvisible() ? "<C-n>" :
 <SID>check_back_space() ? "<TAB>" :
 coc#refresh()
inoremap <expr><S-TAB> pumvisible() ? "<C-p>" : "<C-h>"
function! s:check_back_space() abort
let col = col('.') - 1
return !col || getline('.')[col - 1]  =~# 's'
endfunction

用tab触发自动完成很好,但当我尝试在插入中使用tab时,它会抛出

E117: Unknown function: <SNR>119_check_back_space

这意味着什么:check_back_space函数未被识别,尽管它已在下面声明。

到目前为止我尝试了什么:

  • 声明函数高于use
  • 在init.vim中声明(vim读取的第一个文件(
  • 声明另一个更简单的函数并在inoremap中使用
  • 删除<SID>来自函数调用

我使用NVIM v0.6.1(LuaJIT 2.1.0-beta3(

他们的GitHub repo中有新的代码可以使用tab自动完成:https://github.com/neoclide/coc.nvim

替换vimrc 中的这些行

" Use tab for trigger completion with characters ahead and navigate.
" Use command ':verbose imap <tab>' to make sure tab is not mapped by other plugin.
inoremap <silent><expr> <TAB>
 pumvisible() ? "<C-n>" :
 <SID>check_back_space() ? "<TAB>" :
 coc#refresh()
inoremap <expr><S-TAB> pumvisible() ? "<C-p>" : "<C-h>"
function! s:check_back_space() abort
let col = col('.') - 1
return !col || getline('.')[col - 1]  =~# 's'
endfunction

使用这些行(来自CoC的新版本(:

" Use tab for trigger completion with characters ahead and navigate
" NOTE: There's always complete item selected by default, you may want to enable
" no select by `"suggest.noselect": true` in your configuration file
" NOTE: Use command ':verbose imap <tab>' to make sure tab is not mapped by
" other plugin before putting this into your config
inoremap <silent><expr> <TAB>
 coc#pum#visible() ? coc#pum#next(1) :
 CheckBackspace() ? "<Tab>" :
 coc#refresh()
inoremap <expr><S-TAB> coc#pum#visible() ? coc#pum#prev(1) : "<C-h>"
function! CheckBackspace() abort
let col = col('.') - 1
return !col || getline('.')[col - 1]  =~# 's'
endfunction

如果你想要和以前一样的行为(按tab键会首先自动完成顶部选项,而不是第二个选项(,那么也可以输入命令:CocConfig来调出你的coc配置文件,并将该条目添加到中

"suggest.noselect": true

我的机器上也有同样的问题(Ubuntu 22.04,nvim v0.8.0-1210,coc.nvm(。

我通过删除以下内容"解决"了这个问题:

inoremap <silent><expr> <TAB>
 pumvisible() ? "<C-n>" :
 <SID>check_back_space() ? "<TAB>" :
 coc#refresh()
inoremap <expr><S-TAB> pumvisible() ? "<C-p>" : "<C-h>"

在我看来,这是coc.nvim中的新错误。我的解决方案不是最终的:(

相关内容

最新更新