我想编写一个执行一系列命令的脚本(基本上只有两行):
:v/\S/d :w
但我找不到关于如何完成的教程。有人知道吗?
答案1
有很多种方法可以进行。
A-您可以编写一个包含要执行的行的简单脚本,然后手动调用它。例如:
" $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()
....
并且使用...函数名称从插件调用(公共)函数:
" ~/.vim/plugin/foo.vim
command! -nargs=0 Foo call yourinitials#foo#bar()
nnoremap <Plug>Foo :call yourinitials#foo#bar()<cr>
最后说明:
我们通常会在插件(和文件格式插件)上提供反包含保护,但不会在纯脚本或自动加载插件上提供。这是因为人们可能希望从他们的 .vimrc 中阻止加载某些插件。备注:插件模板我正在维护不同类型的 vim 脚本的骨架。
然而,我们有时可能想要重新加载我们正在维护的一个特定插件,以便使用/测试/调整我们正在开发的(新)函数。在这种情况下,重要的是函数和命令定义要用 括起来,!
以允许它们被覆盖。
答案2
command! Foo vglobal/\S/delete _|update