Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

На главную -> MyLDP -> Электронные книги по ОС Linux
Назад Просто о Vim Вперед

Vim : Плагины

Введение

В предыдущей главе мы рассмотрели написание скриптов, расширяющих существующую функциональность Vim. Мы вызываем эти скрипты, которые расширяют и добавляют функции, как "плагины".

Существуют различные виды плагинов:

vimrc

глобальные плагины

плагины filetype

плагины подсветки синтаксиса

плагины компиляции

Вы можете не только написать свой плагин, но и скачать и использовать плагины, написанные другими.

Настройка с использованием vimrc

Когда я устанавливаю новый дистрибутив Linux или переустанавливаю Windows, первое, что я делаю после установки Vim, - восстанавливаю мой последний vimrc файл из архивной копии, и потом запускаю Vim. Почему это важно? Поскольку мой vimrc файл содержит переменные настройки/установки, я люблю подстраивать Vim под себя и собственного удобства.

Вы можете создать два файла для настроек Vim на свой вкус:

1. vimrc — для основных настроек

2. gvimrc — для специфических GUI настроек

Эти файлы хранятся в:

%HOME%/_vimrc и %HOME%/_gvimrc в Windows

$HOME/.vimrc и $HOME/.gvimrc на Linux/BSD/Mac OS X

Смотри :help vimrc о точном их местонахождении в вашей системе.

Файлы vimrc и gvimrc могут содержать любые команды Vim. В определениях следует использовать только простые установки в файлах vimrc, и расширенные опции из плагинов.

Например, вот содержание моего файла vimrc:

	" My Vimrc file
	" Maintainer: www.swaroopch.com/contact/
	" Reference: Initially based on http://dev.gentoo.org/~ciaranm/docs/vim-guide/
	" License: www.opensource.org/licenses/bsd-license.php
        
	" Enable syntax highlighting.
	syntax on
	
	" Automatically indent when adding a curly bracket, etc.
	set smartindent
        
	" Tabs should be converted to a group of 4 spaces.
	" This is the official Python convention
        " (http://www.python.org/dev/peps/pep-0008/)
	" I didn't find a good reason to not use it everywhere.
	set shiftwidth=4
        set tabstop=4
	set expandtab
        set smarttab
	
        " Minimal number of screen lines to keep above and below the cursor.
	set scrolloff=999
	
	" Use UTF-8.
	set encoding=utf-8
        
	" Set color scheme that I like.
	if has("gui_running")
	    colorscheme desert
	else
	    colorscheme darkblue
        endif
	
	" Status line
	set laststatus=2
	set statusline=
        set statusline+=%-3.3n\                      " buffer number
	set statusline+=%f\                          " filename
	set statusline+=%h%m%r%w                     " status flags
	set statusline+=\[%{strlen(&ft)?&ft:'none'}] " file type
	set statusline+=%=                           " right align remainder
	set statusline+=0x%-8B                       " character value
        set statusline+=%-14(%l,%c%V%)               " line, character
	set statusline+=%<%P                         " file position
        
	" Show line number, cursor position.
        set ruler
	
	" Display incomplete commands.
	set showcmd
	
        " To insert timestamp, press F3.
	nmap <F3> a<C-R>=strftime("%Y-%m-%d %a %I:%M %p")<CR><Esc>
	imap <F3> <C-R>=strftime("%Y-%m-%d %a %I:%M %p")<CR>
	
	" To save, press ctrl-s.
        nmap <c-s> :w<CR>
	imap <c-s> <Esc>:w<CR>a
	
	" Search as you type.
	set incsearch
        
	" Ignore case when searching.
	set ignorecase
	
        " Show autocomplete menus.
	set wildmenu
	
        " Show editing mode
        set showmode
	
        " Error bells are displayed visually.
	set visualbell

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

Если вы хотите детально изучить использование каждого параметра, изучайте :help.

Часть моего файла gvimrc:

" Size of GVim window 
set lines=35 columns=99 

" Don't display the menu or toolbar. Just the screen. 
set guioptions-=m 
set guioptions-=T 

" Font. Very important. 
if has('win32') || has('win64') 
	" set guifont=Monaco:h16
	" http://jeffmilner.com/index.php/2005/07/30/windows-vista-fonts-now-available/
	set guifont=Consolas:h12:cANSI
elseif has('unix') 
	let &guifont="Monospace 10" 
endif

Существуют различные примеры файлов vimrc, вам обязательно нужно посмотреть их и узнать различные виды настроек, которые можно сделать, а затем выбрать из них те, что вам понравятся, и записать их в собственных vimrc.

Несколько хороших, которые я нашел в прошлом:

vi-improved.org's vimrc

Amir Salihefendic's vimrc

Известный факт, что персональный файл vimrc, как правило, отражает то, как долго человек использует Vim.

Глобальные плагины

Глобальные плагины используются для реализации глобальных/основных функций.

Глобальные плагины могут быть сохранены с двух местах:

1. $VIMRUNTIME/plugin/ стандартные плагины идущие с Vim при установке

2. Для установки ваших плагинов или плагинов, которые вы где то скачали, вы можете использовать ваш каталог плагинов:

$HOME/.vim/plugin/ на Linux/BSD/Mac OS X

%HOME%/vimfiles/plugin/ на Windows

Смотрите :help runtimepath для детальной информации о вашем каталоге плагинов.

Давайте посмотрим, как использовать плагины.

Полезно иметь плагин highlight_current_line.vim от Ansuman Mohanty, из названия которого можно понять, что он делает. Скачайте highlight_current_line.vim последней версии и положите его в ваш каталог плагинов (как упоминалось выше).

Теперь перезапустите Vim и откройте любой файл. Обратите внимание, что текущая строка будет подсвечена по сравнению с другими строками в файле.

Но, что если вам это не понравилось? Просто удалите файл highlight_current_line.vim и перезапустите Vim.

Аналогично, вы можете установить ваши related.vim или capitalize.vim из главы Скрипты в ваш каталог плагинов, и это позволит нам избежать трудностей с использованием :source. В конечном счете, любой плагин Vim, который вы напишете, должен быть в вашем каталоге плагинов .vim/vimfiles.

Плагины Filetype

Плагины Filetype написаны для определенных типов файлов. Например, программы, написанные на языке C, могут иметь свой собственный стиль отступов, закладок, подсветки синтаксиса и показываемых событиях о ошибках. Эти плагины не общего назначения, они работают на определенных, специфических типах файлов.

Использование плагинов filetype

Давайте возьмем плагин filetype для XML. XML это декларативный язык, который использует теги для описание структуры самого документа. Например, если у вас есть текст, как этот:

Iron Gods
---------
Ashok Banker's next book immediately following the Ramayana is said to 
be a novel tentatively titled "Iron Gods" scheduled to be published in 
2007. A contemporary novel, it is an epic hard science
fiction story about a war between the gods of different faiths. Weary
of the constant infighting between religious sects and their deities,
God (aka Allah, Yahweh, brahman, or whatever one chooses to call the
Supreme Deity) wishes to destroy creation altogether.

A representation of prophets and holy warriors led by Ganesa, the
elephant-headed Hindu deity, randomly picks a sample of mortals, five
of whom are the main protagonists of the book--an American Catholic,
an Indian Hindu, a Pakistani Muslim, a Japanese Buddhist, and a
Japanese Shinto follower. The mortal sampling, called a 'Palimpsest'
is ferried aboard a vast Dyson's Sphere artifact termed The Jewel,
which is built around the sun itself, contains retransplanted cities
and landscapes brought from multiple parallel Earths and is the size
of 12,000 Earths. It is also a spaceship travelling to the end of
creation, where the Palimpsest is to present itself before God to
plead clemency for all creation.

Meanwhile, it is upto the five protagonists, aided by Ganesa and a few concerned
individuals, including Lucifer Morningstar, Ali Abu Tarab, King David
and his son Solomon, and others, to bring about peace among the
myriad warring faiths. The question is whether or not they can do so
before the audience with God, and if they can do so peacefully--for
pressure is mounting to wage one final War of Wars to end all war
itself. 

(Excerpt taken from
http://en.wikipedia.org/w/index.php?title=Ashok_Banker&oldid=86219280
under the GNU Free Documentation License) 

Он может быть записан в XML так (формат 'DocBook XML'):

<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"

"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">

<article>

<articleinfo>

<author><firstname>Wikipedia Contributors</firstname></author>

<title>Iron Gods</title>

</articleinfo>

<para>

Ashok Banker's next book immediately following the Ramayana is said to be a novel tentatively titled "Iron Gods" scheduled to be published in 2007. A contemporary novel, it is an epic hard science fiction story about a war between the gods of different faiths. Weary of the constant infighting between religious sects and their deities, God (aka Allah, Yahweh, brahman, or whatever one chooses to call the Supreme Deity) wishes to destroy creation altogether.

</para>

<para>

A representation of prophets and holy warriors led by Ganesa, the elephant-headed Hindu deity, randomly picks a sample of mortals, five of whom are the main protagonists of the book--an American Catholic, an Indian Hindu, a Pakistani Muslim, a Japanese Buddhist, and a Japanese Shinto follower. The mortal sampling, called a 'Palimpsest' is ferried aboard a vast Dyson's Sphere artifact termed The Jewel, which is built around the sun itself, contains retransplanted cities and landscapes brought from multiple parallel Earths and is the size of 12,000 Earths. It is also a spaceship travelling to the end of creation, where the Palimpsest is to present itself before God to plead clemency for all creation.

</para>

<para>

Meanwhile, it is upto the five protagonists, aided by Ganesa and a few concerned individuals, including Lucifer Morningstar, Ali Abu Tarab, King David and his son Solomon, and others, to bring about peace among the myriad warring faiths. The question is whether or not they can do so before the audience with God, and if they can do so peacefully--for pressure is mounting to wage one final War of Wars to end all war itself.

</para>

<sidebar>

<para>

(Excerpt taken from http://en.wikipedia.org/w/index.php?title=Ashok_Banker&amp;oldid=86219280 under the GNU Free Documentation License)

</para>

</sidebar>

</article>

Обратите внимание, что структура документа в версии XML более четкая. Поэтому он прост для инструментов конвертирования XML в другие типы форматов, включая PDF и печатные версии. Плохо то, что людям писать на XML более трудно. А давайте посмотрим, как ftplugins может помочь пользователям Vim, которые пишут на XML.

1. Сначала скачаем xmledit ftplugin и положим его в ваш каталог ~/.vim/ftplugin/.

2. Добавьте следующую строку в ваш ~/.vimrc:

autocmd BufNewFile,BufRead *.xml source ~/.vim/ftplugin/xml.vim

(Проверьте, что вы указали правильно каталог в вашей операционной системе)

Это включает плагин ftplugin xmledit на время открытия файла с расширением XML.

3. Откройте Vim и перейдите к редактированию файла с именем test.xml.

4. Наберите <article.

5. Теперь наберите завершающую >,и смотрите как плагин xmledit ftplugin автоматически добавит завершающий тег для вас. Итак, ваш документ теперь выглядит так:

<article></article>

6. Теперь наберем другой > и посмотрим как тег расширяется и мы можем ввести еще теги. Документ должен выглядеть так:

<article>

</article>

7. Заметьте, что курсор также переместился на один отступ, так что вы можете писать документ в четко структурированном виде, чтобы отразить структуру документа.

8. Повторяйте процесс пока вы не напишете весть документ.

Обратите внимание, как плагин ftplugin для XML делает простым создание XML документов. Это как раз то, для чего предназначены плагины ftplugins.

Написание плагина filetype

Давайте напишем свой собственный ftplugin.

В нашем предыдущем примере использовался плагин xmledit.vim ftplugin и запись в формате XML, и мы видели, что мы должны вставлять стандартный заголовок в верхней части каждого файла DocBook XML (специфичный для формата, который мы использовали). Почему бы не сделать это автоматически в Vim, через использование ftplugin?

В xml ftplugin нужно заложить информацию, которая будет добавляться в начало нового XML-файла:

<?xml version="1.0"?>

<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"

"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">

Итак, давайте создадим новый ftplugin, назовем его "xmlheader.vim" для работы только с событием 'BufNewFile'. Добавьте следующее в ваш файле ~/vimrc.:

autocmd BufNewFile *.xml source ~/.vim/ftplugin/xmlheader.vim

А теперь, все что нам нужно сделать в xmlheader.vim, это создать первую и вторую строку в файле:

Теперь перезапустите Vim, убедитесь что файл 'test.xml' еще не существует, и запустите :e test.xml.

Вы можете видеть, что заголовок уже записан!

Подсветка синтаксиса

В предыдущем разделе мы создали файл DocBook XML. Было бы полезно, если бы в нем цветом была выделена структура XML-файла для правильных тегов DocBook, чтобы понимать, что мы пишем корректно. Оказывается, что это возможно, если мы просто запустим :set filetype=docbkxml. И тогда Vim использует файл синтаксиса, расположенный в $VIMRUNTIME/syntax/docbkxml.vim.

Файл синтаксиса определяет, как части файла зависят друг от друга. Например, файл синтаксиса для XML определяет, каким тегам какие цвета соответствуют в зависимости от имени, и тому подобное.

Использование подсветки синтаксиса

Давайте посмотрим файл синтаксиса в действии. Скачаем скрипт mkd.vim, который является файлом синтаксиса для Markdown. Markdown - это основной формат, в котором простой текст может быть записан так, что бы потом его можно было конвертировать в HTML.

1. Откройте новый файл в Vim с именем 'test_markdown.txt'.

2. Запустите :set syntax=mkd

3. Наберите следующий текст в файле:

   # Bengaluru
   
   The name **Bangalore** is an anglicised version of the city's name in
   the Kannada language, Bengaluru.
   
   > A popular anecdote (although one contradicted by historical
   > evidence) recounts that the 11th-century Hoysala king Veera Ballala
   > II, while on a hunting expedition, lost his way in the forest. Tired
   > and hungry, he came across a poor old woman who served him boiled
   > beans. The grateful king named the place _"benda kaal-ooru"_
   > (literally, "town of boiled beans"), which was eventually
   > colloquialised to "Bengaluru".
   
   ***
   
   (This information has been retrieved from
   [Wikipedia](http://en.wikipedia.org/wiki/Bangalore) under the GNU Free
   Documentation License.)

4. Обратите внимание, как различные части файла, например, заголовок и служебные слова, автоматически выделяются. Это должно, мы надеемся, помочь в создании файлов с синтаксисом Markdown.

Написание темы подсветки синтаксиса

Давайте посмотрим как написать собственный файл синтаксиса для текстового формата AmiFormat.

Подсветка синтаксиса основана на двух действиях: первое - это определение типа текстового формата искомого файла, и второе - это описание того, как его показывать.

Например, предположим, что мы хотим найти все вхождения <b>any word</b> для показа жирным шрифтом. Сперва, нам нужно сделать такой шаблон в нашем тексте и затем соединить имя этого шаблона с нужным типом показа:

:syntax match ourBold /<b>.*<\/b>/
:highlight default ourBold term=bold cterm=bold gui=bold

Первая строка говорит, что мы создаем новый тип синтаксиса на основании шаблона, с именем 'ourBold' и определяем шаблон на основе регулярных выражений.

Вторая строка говорит, что мы подсвечиваем синтаксис 'ourBold'. Будет использована схема по умолчанию, она может быть изменена пользователем или можно использовать другие цветовые схемы. Мы можем определить представление 'ourBold' для трех различных типов дисплеев, в которых будет запускаться Vim: для черно-белых терминалов, цветных терминалов и GUI (графической версии).

Иногда мы хотим определить некоторые задачи в нашем тексте как пункт todo и мы обычно записываем это заглавными 'TODO', но что, если мы хотим делать это постоянно?

:syntax keyword ourTodo TODO FIXME XXX
:hi def link ourTodo Todo

Сперва мы определяем ключевое слово 'ourTodo', которое нужно подсвечивать, и соединим шаблон 'ourTodo' с уже существующей группой с названием 'Todo' в Vim. Таких, уже существующих групп, которые имеют предопределенные цветовые схемы, в Vim много. Лучше всего привязать наши синтаксические стили к существующим группам. Смотри :help group-name для списка доступных групп.

Далее, некоторые блоки кода в группе могут быть заключены в теги [code] .. [/code], как мы можем выделить их подсветкой?

:syn region amiCode excludenl start=/\[code\]/ end=/\[\/code\]/

:hi def link amiCode Identifier

Во-первых, мы указываем, что мы определяем область текста, начальным и конечным шаблоном (который очень прост в нашем случае), а затем связываем его с уже существующими классом "Identifier".

Аналогичным образом, мы можем обработать и определить другие части текста, определенного в описании формата AmiFormat, а окончательный сценарий может выглядеть следующим образом:

" Vim syntax file for AmiFormat
" Language: AmiFormat
" Version: 1
" Last Change: 2006-12-28 Thu
" Maintainer: www.swaroopch.com/contact/
" License: www.opensource.org/licenses/bsd-license.php
" Reference: http://orangoo.com/labs/AmiNation/AmiFormat/

"""""""""" Initial Checks """"""""""""""""""""""""""""""""""""""""""""
" To be compatible with Vim 5.8. See `:help 44.12`
if version < 600
    syntax clear
elseif exists("b:current_syntax")
    " Quit when a (custom) syntax file was already loaded
    finish
endif

"""""""""" Patterns """"""""""""""""""""""""""""""""""""""""""""""""""

" Emphasis
syn match amiItalic /&lt;i&gt;.\{-}<\/i>/
syn match amiBold /&lt;b&gt;.\{-}<\/b>/

" Todo
syn keyword amiTodo TODO FIXME XXX

" Headings
syn match amiHeading /^h[1-6]\.\s\+.\{-}$/

" Lists
syn match amiList /^\s*\*\s\+/
syn match amiList /^\s*\d\+\.\s\+/

" Classes
syn match amiClass /^\s*%(\w\+).*%/
syn match amiClass /^\s*%{.*}.*%/

" Code
syn region amiCode excludenl start=/\[code\]/ end=/\[\/code\]/

" HTML
syn region amiEscape excludenl start=/\[escape\]/ end=/\[\/escape\]/

" Link
syn match amiLink /".\{-}":(.\{-})/

" Image
syn match amiImage /!.\{-}(.\{-})!/

"""""""""" Highlighting """"""""""""""""""""""""""""""""""""""""""""""
 
hi def amiItalic term=italic cterm=italic gui=italic
hi def amiBold term=bold cterm=bold gui=bold
 
hi def link amiHeading Title
hi def link amiTodo Todo
hi def link amiList PreProc
hi def link amiClass Statement
hi def link amiCode Identifier
hi def link amiEscape Comment
hi def link amiLink String
hi def link amiImage String

"""""""""" Finish """"""""""""""""""""""""""""""""""""""""""""""""""""

" Set syntax name
let b:current_syntax = "amifmt"

Теперь, когда скрипт уже работает, я должен загрузить его в раздел скриптов Vim, как я уже писал об этом! Теперь кто угодно может использовать скрипт подсветки синтаксиса AmiFormat в Vim.

Для изучения деталей о скриптах подсветки синтаксиса в Vim, прочитайте:

:help syntax

:help usr_44.txt

:help group-name

:help pattern-overview

:help mysyntaxfile

:help new-filetype

Примечяние: Если вы хотите, перерисовать экран в случае, если файл подсветки синтаксиса неправильно работает, нажмите Ctrl-L.

Примечяние: Возможно, вы уже догадались, что, когда мы предварительно задали filetype, Vim, в свою очередь, автоматически устанавливает подсветку синтаксиса для этого расширения.

Плагины компиляции

Плагины компиляции используются для компиляции программ, написанных на разных языках. Они полезны везде, где требуется преобразование из исходных текстов в другой формат, даже если вы пишете обычный текстовый файл в Markdown и хотите конвертировать текст в HTML с помощью программы преобразования.

Давайте изучим использование плагина компиляции для Python.

1. Скачаем скрипт compiler/python.vim и положим его в наш каталог ~/.vim/compiler/.

2. Вставим следующую строку в наш ~/.vimrc:

autocmd BufNewFile,BufRead *.py compiler python

3. Перезапустим Vim, откроем файл Python, скажем test.py и введем следующую программу:

#!python

print 'Hello World'

4. Запустите :make и вы увидите успешную компиляцию.

5. Давайте намеренно введем ошибку в программу, изменив написание 'print' в 'pritn':

pritn 'Hello World'

Теперь запустим :make и обратим внимание, что Vim выдал ошибку и автоматически перевел курсор на строку с ошибкой!

6. Запустим :clist чтобы просмотреть полный список ошибок.

7. После исправления ошибки вы можете выполнить :cnext для перехода к следующей ошибке.

Если вы откроете скрипт compiler/python.vim, который мы скачали, вы можете увидеть, что он очень простой - тут только две определенные переменные, одна - это makeprg, которая определяет как сделать 'make' файл, т.е. как компилировать это, и вторая - это errorformat, которая определяет форму вывода ошибок компилятора.

Я написал плагин компилятор для Adobe Flex с использованием тех же двух переменных.

Смотри :help write-compiler-plugin и :help quickfix для подробной информации о том, как написать свой собственный плагин компиляции.

Домашнее задание: написать глобальный плагин

В целях закрепления полученных навыков создания плагинов выполните следующее упражнение:

Напишите плагин, который удаляет повторяющиеся и избыточные пустые строки в документе.

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

Если вам нужно "вдохновение", см. этот совет Vim.

Вот еще одно упражнение:

Напишите скрипт, который выдает значение и похожие по смыслу слова для текущего слова под курсором.

Опять же, если вам нужно "вдохновение", см. мой плагин lookup.vim.

Отключение плагинов

Предположим, что вы сочтете действия плагина Vim странными, и у вас появиится подозрение, что причиной этого является скрипт. В таком случае вы можете задать в Vim избирательную инициализацию скриптов путем задания аргумента -u в командной строке.

Например, vim -u NONE запустит Vim без инициализации скриптов.

То есть, работает только Vim. Используйте vim -u - your-minimal-initialization.vim для выполнения только конкретных инициализаций. Эта опция полезна при отладке, если нужно выяснить, вызваны проблемы самим Vim или запуском плагина, и т.д.

Смотри :help -u и :help starting для детальной информации.

Итоги

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

Внешние ссылки

http://www.vim.org/scripts/index.php

http://dotfiles.org/.vimrc

http://www.vi-improved.org/vimrc.php

http://amix.dk/vim/vimrc.html

http://www.vim.org/scripts/script.php?script_id=1652

http://www.vim.org/scripts/script.php?script_id=301

http://www.vim.org/scripts/script.php?script_id=1242

http://daringfireball.net/projects/markdown/

http://orangoo.com/labs/AmiNation/AmiFormat/

http://orangoo.com/labs/AmiNation/AmiFormat/online%20reference/

http://www.vim.org/scripts/script.php?script_id=1745

http://www.vim.org/scripts/script.php?script_id=1439

http://www.vim.org/scripts/script.php?script_id=1746

http://vim.wikia.com/wiki/Remove_unwanted_empty_lines

http://www.vim.org/scripts/script.php?script_id=2001



Предыдущий раздел: Следующий раздел:
Сценарии Оглавление Редактор для программистов