什么是将函数放入vim的传统文件

时间:2016-09-06 10:33:09

标签: vim vim-plugin vim-registers

我正在搜索vim脚本来清除vim中的寄存器, 我找到了this helpful script

现在我正在插入带有函数的代码并将其放入我的.vimrc文件

function ClearReg()
  let regs='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789/-"' 
  let i=0 
  while (i<strlen(regs)) 
    exec 'let @'.regs[i].'=""' 
    let i=i+1 
  endwhile 
  unlet regs 
endfunction

我的问题是 1.是创建函数并将其放在.vimrc文件中的正确方法吗?
2.如果我想使用这个脚本作为插件,我应该把这个脚本添加到哪个路径?

1 个答案:

答案 0 :(得分:5)

喜欢将功能放在自动加载插件中。它们充当了延迟加载的库插件。

  • 这会加快你的开始时间。
  • 这也会减少名称冲突。例如,我的所有自动加载插件都在&rtp/autoload/lh下,并且这些函数的名称类似于lh#foo#bar()。多亏了这一点,不存在与定义foo#bar()函数的另一个插件冲突的风险。
  • 这是一种自动记录。您知道名为foo#bar#titi()的函数已在&rtp/autoload/foo/bar.vim
  • 中的某处定义

感谢自动加载插件,我还可以控制我的函数,插件(库)per(by?)插件(库)的日志记录级别。例如,在最近的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)之后(当我使用此库在后台生成标记时),会在quickfix窗口中显示我:

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。

对于非常简单的脚本来说,这当然有点过分。但是代码越复杂,这种方法就越有用。

关于把它放在哪里。默认情况下,您可以将自动加载插件(或任何其他文件)存储在* nix下的$HOME/.vim/autoload/或Windows下的$HOME/vimfiles/autoload/下。但是,如果有一天您希望共享它,或者将其放入自己的存储库,那么存储插件的确切目录将取决于您使用的软件包管理器。首先从:help 'rtp'开始,然后阅读包管理器的文档。