Загрузка...
Linux
Новости, статьи, обсуждения, - все что связано с GNU Linux, FreeBSD, OpenBSD, Sun Solaris, Mac OS X и другими системами. Если вы интересуетесь данной темой - добро пожаловать в сообщество.
     

Введение в Vimscript.

08.05.10, 22:24
Автор ggg

Вы много времени проводите с редактором Vim, знаете все его настройки, сочетания клавиш, используете подсветку синтаксиса и автодополнения, но вам этого мало? Вам кажется, что некоторый набор команд, можно объединить в макрос, но в макросе не хватает немного внутренней логики? Вам хочется оптимизировать рутинный набор действий? Тогда эта статья — то что вам нужно. В ней рассказывается про язык программирования, встроенный в редактор Vim, который позволит расширить его возможности и удовлетворить самого взыскательного пользователя.

 

Долгое время в интернете ходила шутка, что Emacs — отличная операционная система, в которой не хватает только текстового редактора, в то время как vi — отличный текстовый редактор, которому не хватает некоторых функций операционной системы. Действительно, на первых парах сильное преимущество Emacs-а было в возможности его расширяемости, в то время как vi был лишен этого.

Так было до тех пор пока в версии 5.0 в 1998 году не появился Vimscript. Данный скриптовый язык программирования основан на командах ex из редактора vi. Ранние версии Vim добавили в Vimscript конструкции управления выполнением программы (ветвления, циклы и т.п.) и определения функций, а начиная с 7-й версии Vim-а Vimscript предоставляет возможность работы с такими типами данных как списки и словари и базовые формы ООП. Такие функции как filter и map делают возможным использование основ функционального программирования, но не стоит забывать, что в первую очередь Vimscript — это язык для расширения текстового редактора, поэтому и заточен он под соответствующие задачи.

Программы на Vimscript-е хранятся в текстовом виде в файлах с расширением .vim Напишем нашу первую программу, традиционно выводящую на экран строку «Hello world».

Создадим файл hello.vim следующего содержимого:

 

echo "Hello world"

 

Для того чтобы запустить данный файл на исполнение необходимо открыть редактор Vim и выполнить команду:

 

source test.vim

 

После чего строка «Hello world» будет напечатана в статусной панели редактора.

 

Рассмотрим пример посложнее. Предположим, что нам хочется сделать такую функцию, которая бы при нажатии определенной кнопки включала или выключала подсветку синтаксиса в текущем файле. Вот тут то и нужна логика, которая позволит запомнить текущее состояние подсветки (включена/выключена) и в зависимости от состояния выполнить какое-нибудь действие. В файл ~/.vimrc добавим следующие строки:

 

function! ToggleSyntax()

if exists("g:syntax_on")

syntax off

else

syntax enable

endif

endfunction

 

nmap < silent> < F5> :call ToggleSyntax()< CR>

 

Итак, разберем данный пример поподробнее. Во-первых, при загрузке редактора Vim выполняются некоторые действия по его инициализации, одно из которых — последовательное выполнение команд файла ресурсов .vimrc, вот почему мы положили наш код именно туда. В нашем примере мы определяем функцию ToggleSyntax. Отметим, что знак ! в конце ключевого слова function! говорит о том, что в случае, если функция с именем ToggleFunction была определена где-то ранее — то она будет переопределена текущей. Если же убрать знак восклицания и написать следующий код:

 

function! ToggleSyntax()

 

и функция с таким же именем была определена ранее, то повторное определение приведет к ошибке.

Когда желая включить подсветку синтаксиса мы вызываем команду

 

syntax on

 

или

 

sytnax enable

 

то встроенная функция редактора устанавливает переменную флаг g:syntax_on в единицу. Отметим, что префикс g: означает то, что переменная является глобальной, а следовательно видна во всех функциях, а не только в той, в которой она была установлена. Зная это мы реализуем в нашей функции такую логику: если переменная g:syntax_on установлена, то значит в данный момент подсветка синтаксиса включена и нам нужно ее выключить, а в противном случае — включить.

Для проверки переменной мы используем оператор exists и условный оператор if. После того как наша функция определена — привязываем ее вызов к клавише F5, а для того, чтобы при нажатии клавиши у нас не выводилось никаких сообщений в область уведомлений — добавляем модификатор < silent>.

В процессе написания своей программы может возникнуть вопрос, а какие встроенные функции имеются в редакторе Vim? На данный вопрос поможет найти ответ команда

 

:help command-list

 

которая позволяет просмотреть список функций, разбитый по категориями и снабженный кратким описанием. Также, будет полезно посетить сайт http://www.vim.org/scripts/index.php который содержит более 3000 готовых дополнений, которые могут не только существенно расширить возможности Vim-а, но и стать хорошим помощником в изучении Vimscript.

Подводя итог хотелось бы отметить, что создавая расширение для Vim разработчик не ограничен в выборе языка одним только Vimscript, так же можно использовать Perl, Python, Ruby, Tcl и другие известные языки программирования, возможности которых позволяют превратить обычный текстовый редактор в средство, которое нужно именно вам.

 

P.s. вот хороший цикл статей по программированию на Vimscript:

http://jenyay.net/Programming/VimScript1 - Часть 1. Запуск скриптов

http://jenyay.net/Programming/VimScript2 - Часть 2. Переменные

http://jenyay.net/Programming/VimScript3 - Часть 3. Работа со списками

http://jenyay.net/Programming/VimScript4 - Часть 4. Работа со строками

http://jenyay.net/Programming/VimScript5 - Часть 5. Операции ветвления и функции

http://jenyay.net/Programming/VimScript6 - Часть 6. Продвинутое использование функций

http://jenyay.net/Programming/VimScript7 - Часть 7. Словари и объектно-ориентированное программирование

http://jenyay.net/Programming/VimScript8 - Часть 8. Более подробно о плагинах

http://jenyay.net/Programming/VimScript9 - Часть 9. Другие типы плагинов

Комментарии

source test.vim
изменить на
source hello.vim

Войдите, чтобы оставить комментарий