ZSaberLv0 / ZFVimIM

vim输入法 / Vim Input Method by pure vim script, support: user word, dynamic word priority, cloud db files
203 stars 14 forks source link

第一次加载插件,提示 unknown function: ZFVimIM_dbInit #22

Closed jdhao closed 3 years ago

jdhao commented 3 years ago

如题,使用下面的配置文件:

set runtimepath+=/data/haojiedong/.local/share/nvim/plugged/ZFVimIM
set runtimepath+=/data/haojiedong/.local/share/nvim/plugged/ZFVimJob

let db = ZFVimIM_dbInit({
            \   'name' : 'jd_db',
            \ })
call ZFVimIM_cloudRegister({
            \   'mode' : 'local',
            \   'dbId' : db['dbId'],
            \   'repoPath' : expand('~/scratch_dir/'),
            \   'dbFile' : 'pinyin.txt',
            \ })

runtimepath 设置的是两个插件安装的位置,然后使用 nvim -u init.vim 启动,提示: unknown function: ZFVimIM_dbInit。

但是在 nvim 里面,重新 source 这个配置 :so init.vim,就不会报错了。后续可以正常使用 ZFVimIM

ZSaberLv0 commented 3 years ago

set runtimepath 并不会立即执行插件的代码

建议在 autocmd User ZFVimIM_event_OnDbInitautocmd VimEnter * 中注册词库

function! s:init()
    let db = ZFVimIM_dbInit({
                \   'name' : 'jd_db',
                \ })
    call ZFVimIM_cloudRegister({
                \   'mode' : 'local',
                \   'dbId' : db['dbId'],
                \   'repoPath' : expand('~/scratch_dir/'),
                \   'dbFile' : 'pinyin.txt',
                \ })
endfunction
autocmd User ZFVimIM_event_OnDbInit call s:init()

我更新下文档, 感谢反馈

jdhao commented 3 years ago

不科学啊,我看你这个 ZFVimIM_dbInit 函数是在 plugin 目录下定义的,然后 plugin 目录是会被默认加载的,所以这个函数应该是存在的啊,为什么会提示 unknown 呢。

另外我进入 nvim,虽然提示这个错误,我使用 call 也是可以调用这个函数的。

ZSaberLv0 commented 3 years ago

这是正常的行为, 添加到 runtimepath 并不会在 source vimrc 时立即执行, 有兴趣你可以试试:

some_path/
    test/
        plugin/
            test.vim
    vimrc.vim
" vimrc.vim
autocmd VimEnter * echom 'vim enter'
echom 'main entry'
set rtp+=some_path/test
echom 'main exit'

" test.vim
echom 'plugin'

执行顺序是:

main entry
main exit
plugin
vim enter

另外, autoload 可以处理这种问题, 但个人不太喜欢这种方式 (主要还是懒)

jdhao commented 3 years ago

确实是这样的,之前没碰到这种问题,我以为添加到 runtimepath 以后,plugin 目录下的函数都可以立马使用了。