Luc*_*tte 13
有很多方法可以继续。
A- 您可以编写一个包含要执行的行的简单脚本,然后手动调用它。前任:
" $HOME/.vim/macros/foo.vim
:v/\S/d_
:update
" EOF
" and from vim
:runtime macros/foo.vim
" or
:so ~/.vim/macros/foo.vim
Run Code Online (Sandbox Code Playgroud)
B- 您可以拥有一个插件,其中包含将触发您想要执行的内容的内容。如果动作有点复杂,我们通常更愿意为维护目的定义一个函数。
B.1. 如果函数足够短并且每次使用 vim 时都使用,则可以将其定义到插件中。
B.1.1. 如果您更喜欢使用 直接调用该函数(通常从不如此):call Foo(),您必须通过给它一个以大写字母开头的名称来公开它:
" ~/.vim/plugin/foo.vim
function! Foo()
:v/\S/d_
:update
endfunction
Run Code Online (Sandbox Code Playgroud)
(该解决方案会污染全局命名空间,而且其他插件可能会否决它。)
B.1.2 通常,我们定义一个映射,或者一个调用函数的命令。这样,该函数可以成为当前脚本的本地函数——它的名称以s:.
" ~/.vim/plugin/foo.vim
function! s:Foo()
:v/\S/d_
:update
endfunction
Run Code Online (Sandbox Code Playgroud)
现在你可以定义一个命令:
" ~/.vim/plugin/foo.vim
command! -nargs=0 Foo call s:Foo()
Run Code Online (Sandbox Code Playgroud)
或映射:
" ~/.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
Run Code Online (Sandbox Code Playgroud)
B.2. 如果函数本身真的很长,或者因为它需要其他函数来完成它的工作,和/或如果函数很少使用,我们更愿意在自动加载插件中定义它:
" ~/.vim/autoload/yourinitials/foo.vim
" NB: I use my initials (lh) to avoid name clashes on common filenames
function! yourinitials#foo#bar()
....
Run Code Online (Sandbox Code Playgroud)
并且从插件调用(公共)函数是使用 ... 函数名称完成的:
" ~/.vim/plugin/foo.vim
command! -nargs=0 Foo call yourinitials#foo#bar()
nnoremap <Plug>Foo :call yourinitials#foo#bar()<cr>
Run Code Online (Sandbox Code Playgroud)
最后注意事项:
我们通常在插件(和 ftplugins)上提供反包含保护,但不在普通脚本和自动加载插件上提供。这是因为人们可能想要阻止从他们的 .vimrc 加载一些插件。备注:我正在维护的插件muTemplate具有用于不同类型 vim 脚本的框架。
然而,我们有时可能想要重新加载我们正在维护的一个特定插件,以便使用/测试/调整我们正在开发的(新)功能。在这种情况下,重要的是函数和命令定义用 a 敲打!以允许它们覆盖。