7

Я хотел бы сделать скрипт, который выполняет серию команд (в основном только две строки):

:v/\S/d
:w

Но я не могу найти учебник о том, как это делается. Кто-нибудь?

2 ответа2

12

Есть много способов продолжить.

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

БИ 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>

Последние заметки:

Мы обычно предоставляем средства защиты от включений для плагинов (и ftplugins), но не для простых скриптов и не для плагинов автозагрузки. Это потому, что кто-то может захотеть запретить загрузку некоторых плагинов из их .vimrc. Замечание: у плагина muTemplate, который я поддерживаю, есть скелеты для различных видов скриптов vim.

Однако иногда мы можем захотеть перезагрузить один конкретный плагин, который мы поддерживаем, чтобы использовать / тестировать / настраивать (новые) функции, которые мы разрабатываем. В этом случае важно, чтобы определения функций и команд были помечены знаком ! разрешить их переопределение.

-1
command! Foo vglobal/\S/delete _|update

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .