更喜欢将函数放在自动加载插件中。它们充当延迟加载的库插件。
- 这将加快您的开始时间。
- 这也将减少名称冲突。例如,我所有的自动加载插件都
&rtp/autoload/lh
在lh#foo#bar()
. 多亏了这一点,没有与另一个定义foo#bar()
函数的插件发生冲突的风险。
- 这是一种自动记录。你知道一个名为的函数
foo#bar#titi()
是在&rtp/autoload/foo/bar.vim
.
由于自动加载插件,我还可以控制我的函数的日志记录级别,每个(由?)插件(库)的插件(库)。例如在最近autoload/lh/async.vim
,我开始脚本:
" credits....
let s:k_version = '3132'
" ## Misc Functions {{{1
" # Version {{{2
function! lh#async#version()
return s:k_version
endfunction
" # Debug {{{2
let s:verbose = get(s:, 'verbose', 0)
function! lh#async#verbose(...)
if a:0 > 0 | let s:verbose = a:1 | endif
return s:verbose
endfunction
function! s:Log(expr, ...)
call call('lh#log#this',[a:expr]+a:000)
endfunction
function! s:Verbose(expr, ...)
if s:verbose
call call('s:Log',[a:expr]+a:000)
endif
endfunction
function! lh#async#debug(expr) abort
return eval(a:expr)
endfunction
例如,这允许我获取任何脚本变量(或函数)的内部值lh#aynch#debug('s:job_queue')
,并跟踪所做的事情:
function! s:start_next() dict abort " {{{3
...
call s:Verbose('Starting next job: %1', job)
:call lh#async#verbose(1)
在(和:LHLogs qf
)之后(当我使用此库在后台生成标签时)将在快速修复窗口中显示我:
autoload/lh/async.vim|100| Push or start job: {'txt': 'ctags OTB', 'cmd': 'cd /path/to/src/OTB && ctags --tag-relative=yes --c++-kinds=+pf --fields=+imaSftx{c++.properties} --extra=+q --languages=C,C++ -f ossimplugins.tags -R', 'callback': function('<SNR>256_callback', {'output': [], 'callback': function('<SNR>256_callback')}), 'close_cb': function('<SNR>256_TagGenerated', ['/path/to/src/OTB/ossimplugins.tags', '', {'output': [], 'callback': function('<SNR>256_callback')}]), 'before_start_cb': function('delete', ['/path/to/src/OTB/ossimplugins.tags']), 'args': {'callback': function('<SNR>256_callback', {'output': [], 'callback': function('<SNR>256_callback')}), 'close_cb': function('<SNR>256_TagGenerated', ['/path/to/src/OTB/ossimplugins.tags', '', {'output': [], 'callback': function('<SNR>256_callback')}])}} at 1-th position
autoload/lh/async.vim|116| Starting next job: {'txt': 'ctags OTB', 'cmd': 'cd /path/to/src/OTB && ctags --tag-relative=yes --c++-kinds=+pf --fields=+imaSftx{c++.properties} --extra=+q --languages=C,C++ -f ossimplugins.tags -R', 'callback': function('<SNR>256_callback', {'output': [], 'callback': function('<SNR>256_callback')}), 'close_cb': function('<SNR>256_TagGenerated', ['/path/to/src/OTB/ossimplugins.tags', '', {'output': [], 'callback': function('<SNR>256_callback')}]), 'before_start_cb': function('delete', ['/path/to/src/OTB/ossimplugins.tags']), 'args': {'callback': function('<SNR>256_callback', {'output': [], 'callback': function('<SNR>256_callback')}), 'close_cb': function('<SNR>256_TagGenerated', ['/path/to/srcsrc/OTB/ossimplugins.tags', '', {'output': [], 'callback': function('<SNR>256_callback')}])}}
autoload/lh/async.vim|126| job_start(['/bin/bash', '-c', 'cd /path/to/src/OTB && ctags --tag-relative=yes --c++-kinds=+pf --fields=+imaSftx{c++.properties} --extra=+q --languages=C,C++ -f ossimplugins.tags -R']) status: {'status': 'run', 'stoponexit': 'term', 'exitval': 0, 'exit_cb': 0, 'channel': channel 0 open, 'process': 22266}
autoload/lh/async.vim|148| Job finished process 22266 dead -- {'status': 'dead', 'stoponexit': 'term', 'exitval': 0, 'exit_cb': 0, 'channel': channel 0 closed, 'process': 22266}
我也可以要求在 lh-tags 插件中生成日志,或者代替 async-library。
对于非常简单的脚本来说,这当然有点矫枉过正。但是代码越复杂,这种方法就越有用。
关于放在哪里。默认情况下,您可以将自动加载插件(或任何其他文件)存储到$HOME/.vim/autoload/
*nix 或$HOME/vimfiles/autoload/
Windows 下。但是,如果有一天您希望共享它,或者将其放入自己的存储库中,那么存储插件的确切目录将取决于您使用的包管理器。首先从 开始:help 'rtp'
,然后阅读包管理器的文档。