VIM插件创建教程?

加布里埃尔·佐里拉(Gabriel A.Zorrilla)

我想制作一个执行一系列命令(基本上只有两行)的脚本:

:v / \ S / d 
:w

但我找不到有关如何完成的教程。任何人?

卢克·赫米特(Luc Hermitte)

有很多方法可以进行。

答:您可以编写一个简单的脚本,其中包含要执行的行,然后手动调用它。前任:

" $HOME/.vim/macros/foo.vim
:v/\S/d_
:update
" EOF

" and from vim
:runtime macros/foo.vim
" or
:so ~/.vim/macros/foo.vim

B-您可以拥有一个包含将触发您要执行的内容的插件。如果操作有点复杂,我们通常更喜欢为维护目的定义一个函数。

B.1。如果该函数足够简短并且每次使用vim都可以使用,则可以在插件中定义它。

B.1.1。如果您希望直接使用调用该函数(通常绝不会这样):call Foo(),则必须通过给它一个以大写字母开头的名称来使其公开:

" ~/.vim/plugin/foo.vim
function! Foo()
    :v/\S/d_
    :update
endfunction

(该解决方案污染了全局名称空间,而且其他插件可能会否决它。)

B.1.2通常,我们定义一个映射或一个将调用该函数的命令。这样,就可以使该函数在当前脚本中本地化-其名称以开头s:

" ~/.vim/plugin/foo.vim
function! s:Foo()
    :v/\S/d_
    :update
endfunction

现在您可以定义一个命令:

" ~/.vim/plugin/foo.vim
command! -nargs=0 Foo call s:Foo()

或映射:

" ~/.vim/plugin/foo.vim
" to call a script-local function from a mapping (defined in the same script!)
" we need to use <sid> instead of s:
nnoremap µ :call <sid>Foo()<cr>

" or the more "professional" way that permits other users to choose another 
" trigger for the mapping
nnoremap <Plug>Foo :call <sid>Foo()<cr>
if !hasmapto('<Plug>Foo', 'n')
    nmap µ <Plug>Foo
endif

" ~/.vimrc
" this way some users may bind the action to anything else in their .vimrc
" while the default mapping on µ is defined for the all the other users
:nmap <f11> <Plug>Foo

B.2。如果该函数本身真的很长,或者由于完成它的工作需要其他函数,和/或如果很少使用该函数,则我们希望在自动加载插件中对其进行定义:

" ~/.vim/autoload/yourinitials/foo.vim
" NB: I use my initials (lh) to avoid name clashes on common filenames
function! yourinitials#foo#bar()
   ....

并使用...函数名称完成从插件对(public)函数的调用:

" ~/.vim/plugin/foo.vim
command! -nargs=0 Foo call yourinitials#foo#bar()
nnoremap <Plug>Foo :call yourinitials#foo#bar()<cr>

最后说明:

我们通常在插件(和ftplugins)上提供反包含防护,但在普通脚本或自动加载插件上不提供。这是因为可能要阻止他们的.vimrc加载某些插件。备注:我正在维护的插件muTemplate具有用于各种vim脚本的框架。

但是,有时我们可能想重新加载我们正在维护的特定插件,以便使用/测试/调整我们正在开发的(新)功能。在这种情况下,重要的是将功能和命令定义打上!以允许其覆盖。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章