什么是在 vim 中放置函数的常规文件

whats is the conventional file to put a function in vim

我正在搜索 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. 如果我想将此脚本用作插件,我应该将此脚本放在哪个路径?

更喜欢将函数放在自动加载插件中。它们充当延迟加载的库插件。

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

感谢自动加载插件,我还可以控制我的功能的日志记录级别,插件(库)每个(通过?)插件(库)。例如在最近的 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 windows 中显示我(当我使用这个库在后台生成标签时):

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' 开始,然后阅读包管理器的文档。