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

UnixForum





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

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

Vim : Редактор для программистов

Введение

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

Позвольте мне повторить, что навыки набора текста крайне важны для программиста. Если наши предыдущие обсуждения не убедили вас, надеюсь, статья Jeff Atwood с названием 'We Are Typists First, Programmers Second' убедит вас.

Если вы не имеете опыта программирования, вы можете пропустить этот раздел.

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

Простые вещи

Самая простая возможность в Vim, которую вы можете использовать при написании кода - это использовать подсветку синтаксиса. Это позволяет вам визуализировать, т.е. "видеть" ваш код, подсветка помогает вам в быстром чтении и написании вашего кода, а также помогает избежать очевидных ошибок.

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

Предположим вы редактируете файл синтаксиса Vim, запустите :set filetype=vim и посмотрите как Vim добавит цвета. Аналогично, если вы редактируете файл на Python, запустите :set filetype=python.



Для просмотра списка доступных типов языков, загляните в каталог $VIMRUNTIME/syntax/.

На заметку: Если вы хотите включить подсветку синтаксиса для любого вывода Unix оболочки, просто перенаправьте вывод через канал в Vim, например, так: svn diff | vim -R -. Обратите внимание на тире в конце, которое говорит Vim, что он должен читать текст со стандартного ввода.

Умные отступы

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

Если вы отступаете до определенной линии и хотите, чтобы следующие строки были с таким же отступом, то вы можете использовать установку :set autoindent.

Если вы начинаете новый блок операторов и хотите, чтобы последующие строки автоматически шли с отступом еще на один уровень, то вы можете использовать :set smartindent. Обратите внимание, что поведение этого параметра зависит от использования конкретного языка программирования.

Скачки

Если язык программирования, который вы выбрали, использует фигурные скобки для разграничения блоков операторов, поместите курсор на одну из фигурных скобок и нажмите клавишу % для перехода на парную фигурную скобку. Этот ключ позволяет вам быстро переключаться между началом и концом блока.

Команды оболочки

Вы можете запустить команды оболочки из Vim, используя команду ':!'.

Например, если команда date доступна в вашей операционной системе, запустите :!date и вы увидите строку с текущей датой и временем.

Это удобно в ситуации, когда вы хотите проверить что-то в вашей файловой системе, например, быстро узнать, какие файлы находятся в текущем каталоге :!ls или :!dir, и так далее.

Если вы хотите получить доступ ко всем возможностям оболочки, запустите :sh.

Мы можем использовать эти объекты для запуска внешних фильтров для редактируемого текста. Например, если вы имеете набор строк, которые вы хотите отсортировать, вы можете запустить :%!sort, эта команда передаст текущий текст команде sort в оболочке и затем вывод команды заменит текущее содержание файла.

Переходы

Есть много способов перемещаться по коду.

Разместите ваш курсор на имени файла в коде и затем нажмите gf для открытия файла.

Разместите ваш курсор на имени переменной и нажмите gd для перехода к локальному определению имени переменной. gD производит то же для глобального объявления, производя поиск с начала файла.

Используйте ]] для перехода к следующему вхождению { в первом столбце. Есть много подобных перемещений - смотри :help object-motions для подробной информации.

Смотри :help 29.3, :help 29.4, и :help 29.5 по использованию команд. Например, [ I покажет все строки, содержащие ключевое слово под курсором!


Просмотр части кода

Файловая система

Используйте :Vex или :Sex для просмотра файловой системы в Vim и последующего открытия нужных файлов.

ctags

Мы видели, как производить простые действия в пределах одного файла, но что, если мы хотим перемещаться между различными файлами и иметь перекрестные ссылки между файлами? Тогда мы можем использовать вкладки для достижения этой цели.

Например, для просмотра файла мы можем использовать плагин taglist.vim.

1. Установим программу Exuberant ctags.

2. Установим плагин taglist.vim. Подробное описание установки — на странице скрипта.

3. Запустите :TlistToggle для открытия окна taglist. Класно, теперь вы можете просматривать части вашей программы, такие как макросы, определения типов, переменных и функций.

4. Вы можете использовать :tag foo для перехода к определению foo.


Taglist в действии.

5. Разместите ваш курсор на любом символе и нажмите ctrl-] для перехода к определению символа.

• Нажмите ctrl-t для возврата к предыдущему коду, который вы читали.

6. Используйте ctrl-w ] для перехода к определению символа в разделенном окне.

7. Используйте :tnext, :tprev, :tfirst, :tlast для движения между соответствующими тегами.

Обратите внимание, что Ctags богат поддержкой 33 языков программирования (на момент написания статьи) и может быть легко расширен на другие языки.

Смотри :help taglist-intro для подробной информации.

cscope

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

1. Установите cscope. Обзор установки в :help cscope-info и :help cscope-win32.

2. Скопируйте cscope_maps.vim в ваш каталог ~/.vim/plugin/.

3. Перейдите в ваш каталог исходных кодов и запустите cscope -R -b для построения ('b'uild) рекурсивной ('r'ecursively) базы данных для всех подкаталогов.

4. Перезапустите Vim и откройте файл с исходным кодом.

5. Запустите :cscope show для подтверждения того, что cscope соединение создано.

6. Запустите :cscope find symbol foo для поиска символа foo. Вы можете сократить эту команду до :cs f s foo.

Вы также можете:

Найти это определение - :cs f g

Найти функции, вызываемые этой функцией - :cs f d

Найти функции, вызовающие эту функцию - :cs f c

Найти эту строку текста - :cs f t

Найти этот шаблон egrep - :cs f e


Рис. cscope в действии

Предложения по использованию cscope в Vim вы найдете, запустив :help cscope-suggestions.

Также стоит установить плагин Source Code Obedience, он обеспечивает использование удобных сочетаний клавиш в плагинах cscope/ctags.

Если говорить о языке программирования Си, может быть довольно удобен плагин c.vim.

Компилирование

Мы уже видели в предыдущей главе описание :make для программ, которые мы пишем, поэтому мы не будем повторяться.

Легкое написание

Omnicompletion

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

Vim решает эту задачу с помощью ftplugins, в частности по имени ftplugin/<language>complete.vim, например, pythoncomplete.vim.

Давайте запустим пример с простой программой на Python:

def hello():
	print 'hello world'

def helpme():
	print 'help yourself'

После ввода этой программы создайте новую строку в этом файле, наберите 'he' и нажмите ctrl-x ctrl-o. Вам будут показаны варианты автозавершения.


Omni-completion в действии


Если вы получите ошибку E764: Option 'omnifunc' is not set, запустите :runtime! autoload/pythoncomplete.vim для загрузки плагина omnicompletion.

Чтобы не делать это каждый раз, вы можете добавить следующую строку в ваш ~/.vimrc:

autocmd FileType python runtime! autoload/pythoncomplete.vim

Vim автоматически использует первый вариант автодополнения, вы можете перейти к следующему или предыдущему с помощью ctrl-n и ctrl-p соответственно.

Если вы хотите оборвать использование omnicompletion, просто нажмите esc.

Изучите :help new-omni-completion для подробной информации о поддерживаемых языках (C, HTML, JavaScript, PHP, Python, Ruby, SQL, XML, ...) а также о том, как создавать свои собственные сценарии omnicompletion.

Примечание: Если вам больше нравится использовать кнопки со стрелками для выбора в списке omnicompletion, смотри Vim Tip 1228 как их подключить.

Я предпочитаю использовать просто ctrl-space вместо громоздкой комбинации ctrl-x ctrl-o. Для реализации этого, вставьте строку в ваш vimrc:

imap <c-space> <c-x><c-o>

И еще, плагин PySmell может помочь тем пользователям Vim, которые программируют на Python.

Использование фрагментов

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

1. Скачайте плагин snippetsEmu.

2. Создайте ваш каталог ~/.vim/after/, если он еще не существует.

3. Запустите Vim, вставив имя этого плагина в командную строку. Например, запустите Vim как gvim snippy_bundles.vba

4. Запустите :source %. Тем самым 'vimball' будет распакован и большое количество файлов будет сохранено в соответствующие каталоги.

5. Повторите то же для snippy_plugin.vba

Теперь, давайте научимся использовать этот плагин.

1. Откройте новый файл, скажем test.py.

2. Нажмите клавиши d, e, f и затем <tab>.

3. Ура! Смотрите, как snippetsEmu создает структуру вашей функции. Вы должны увидеть в вашем файле следующее:

	def <{fname}>(<{args}>):
		"""
		<{}>
		<{args}>"""
		<{pass}>
		<{}>

Примечание: В случае, если вы видите def<tab> и ничего больше, то, возможно, плагин фрагментов не загружен. Запустите :runtime! ftplugin/python_snippets.vim и посмотрите, поможет ли это.

4. Ваш курсор теперь находиться на имени функции, т.е. fname.

5. Наберите имя функции, скажем, test.

6. Нажмите <tab> и курсор автоматически перейдет к аргументам. Нажмите Tab снова для перехода к заполнению следующего пункта.

7. Теперь введите комментарий: Скажем Hi (привет)

8. Нажмите Tab снова и введите 'Hello World'

9. Нажмите tab

10. Ваша программа готова!

Теперь вы должны увидеть вот это:

	def test():
		"""
		Just say Hi
		"""
		print 'Hello World'

Самое приятное то, что SnippetsEmu создает стандартное форматирование, которому нужно следовать, и что ничего в команде не будет "забыто".

Создание фрагментов

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

Рассмотрим пример. Предположим, что мне нужно часто писать следующий код в ActionScript3:

	private var _foo:Object; 
	public function get foo():Object 
	{
		return _foo; 
	}
	public function set foo(value:Object)
	{
		_foo = value;
	}

Это простая комбинации получения/установки с использованием переменной. Проблема в том, что очень много такого шаблонного кода приходиться писать неоднократно. Давайте посмотрим, как автоматизировать это.

Плагин фрагментов языка SnippetsEmu ассоциирует st как начальный тег и et как закрывающий тег - это направляющие символы, между которыми мы вводим наш код.

Давайте начнем с простого примера.

exec "Snippet pubfun public function ".st.et.":".st.et."<CR>{<CR>".st.et."<CR>}<CR>"

Добавьте эту строку в ваш ~/.vim/after/ftplugin/actionscript_snippets.vim.

Теперь откройте новый файл, скажем, test.as, наберите pubfun, нажмите <tab> и смотрите как это расширяется:

	public function <{}>:<{}>
		{
	
		}

Курсор будет помещен на имени функции, нажмите tab чтобы войти в возвращаемый тип функции, введите tab снова для ввода тела функции.

Возвращаясь к нашей исходной задачи, вот что я придумал:

exec "Snippet getset private var _".st."name".et.";<CR><CR>public functi

Примечание: Все фрагменты для этого плагина должны быть введены в одной строке. Это техническое ограничение.

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

1. Добавьте эту строку в ваш ~/.vim/after/ftplugin/actionscript_snippets.vim.

2. Откройте новый файл test.as.

3. Наберите getset и нажмите <tab> и вы должны увидеть следующее:

	private var _<{name}>;
	public function get <{name}>():<{type}>
	{
		return _<{name}>;
	}
	public function set <{name}>(value:<{type}>)
	{
		_<{name}> = value;
	}

4. Наберите color и нажмите <tab>. Обратите внимание, что переменная с именем color везде заменяется.

5. Наберите Number и нажмите <tab>. Ваш код теперь должен выглядеть так:

	private var _color;
	public function get color():Number
	{
		return _color;
	}
	public function set color(value:Number)
	{
		_color = value;
	}

Посмотрите как в несколько нажатий клавиш мы получили результат! Мы заменили около 11 строк повторяющегося кода одной строкой сценария Vim.

Мы можем продолжать добавлять такие фрагменты для упрощения процесса кодирования, что поможет нам сконцентрироваться на реальной работе в программировании.

Смотри :help snippets_emu.txt для подробной информации (данный файл помощи будет доступен только после инсталляции плагина).

IDE

Vim может использоваться в качестве IDE с помощью нескольких плагинов.

Плагин Project

Плагин Project используется для создания Project-менеджера, используемого в Vim.

1. Скачайте плагин project.

2. Разархивируйте его в ваш каталог ~/.vim/.

3. Запустите :helptags ~/.vim/doc/.

4. Скачайте исходный код Vim из http://www.vim.org/subversion.php

5. Запустите :Project. Слева откроется боковая панель, которая будет работать как 'project window'.

6. Запустите \\c (обратный слэш и 'c')

7. Дайте ответы на следующие параметры

введите имя (Name), скажем 'vim7_src'

каталог (Directory), скажем C:\\repo\\vim7\\src\\

опции CD, аналогично как у каталога выше

Опции фильтрации (Filter), скажем *.h *.c

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

9. Используйте клавиши со стрелками или клавиши j/k для перемещения вверх и вниз по списку файлов, а нажатие клавиши Enter откроет файл в главном окне.

Это дает вам знакомый интерфейс в стиле IDE, и хорошо, что нет придуманных файлов конфигурации или задания путей установки, как в интегрированных средах разработки, которые обычно всегда имеют проблемы. Функциональность плагина Project проста и прямолинейна.

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

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

Смотрите :help project.txt для подробной информации.

Запуск кода из текста

Вы можете запустить код прямо из Vim с помощью плагинов, таких как EvalSelection.vim или простые плагины, такие как inc-python.vim.

Интеграция SCM

Если вы начнете редактировать файл, вы можете сделать автоматическую проверку из Perforce с помощью плагина perforce. Аналогично, есть плагины для интеграции с CVS/SVN/SVK/Git.

Еще

Для обзора остальных плагинов, созданных для реализации IDE в Vim, см.:

Vim Tip: Using vim as an IDE all in one

C++/Python Vim+IDE plugins list

Есть много плагинов, созданных для конкретных языков программирования, которые могут помочь вам изящно работать. Например, для Python могут быть полезны следующие плагины:

SuperTab позволяет вам вызывать завершения, просто нажав tab, а затем использовать клавиши со стрелками для выбора опции.

python_calltips показывает окно в нижней части, в котором дается список возможных завершений. Удобная особенность по сравнению с обычным завершением состоит в том, что вы можете посмотреть в документации информацию по каждому из вариантов.

VimPdb поможет вам отладить программы на Python в Vim.

Создание своих плагинов

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

Написать плагин для Vim, который берет текущее слово и открывает браузер с документацией для этого конкретного слова (слово может быть именем функции или именем класса, и так далее).

Если вы не понимаете как это сделать, просмотрите "Online documentation for word under cursor" tip at the Vim Tips wiki.

Я расширил пособие и сделал его более общим:

" Add the following lines to your ~/.vimrc to enable online documentation
" Inspiration: http://vim.wikia.com/wiki/Online_documentation_for_word_under_cursor
 
function Browser()
    if has("win32") || has("win64")
        let s:browser = "C:\\Program Files\\Mozilla Firefox\\firefox.exe -new-tab"
    elseif has("win32unix") " Cygwin
        let s:browser = "'/cygdrive/c/Program\ Files/Mozilla\ Firefox/firefox.exe' -new-tab"
    elseif has("mac") || has("macunix") || has("unix")
        let s:browser = "firefox -new-tab"
    endif
  
    return s:browser
endfunction
 
function Run(command)
    if has("win32") || has("win64")
        let s:startCommand = "!start"
        let s:endCommand = ""
    elseif has("mac") || has("macunix") " TODO Untested on Mac
        let s:startCommand = "!open -a"
        let s:endCommand = ""
    elseif has("unix") || has("win32unix")
        let s:startCommand = "!"
        let s:endCommand = "&"
    else
        echo "Don't know how to handle this OS!"
        finish
    endif
 
    let s:cmd = "silent " . s:startCommand . " " . a:command . " " . s:endCommand
    " echo s:cmd
    execute s:cmd
endfunction
 
function OnlineDoc()
    if &filetype == "viki"
        " Dictionary
        let s:urlTemplate = "http://dictionary.reference.com/browse/<name>"
    elseif &filetype == "perl"
        let s:urlTemplate = "http://perldoc.perl.org/functions/<name>.html"
    elseif &filetype == "python"
        let s:urlTemplate = "http://www.google.com/search?q=<name>&domains=docs.python.org&sitesearch=docs.python.org"
    elseif &filetype == "ruby"
        let s:urlTemplate = "http://www.ruby-doc.org/core/classes/<name>.html"
    elseif &filetype == "vim"
        let s:urlTemplate = "http://vimdoc.sourceforge.net/search.php?search=<name>&docs=help"
    endif
 
    let s:wordUnderCursor = expand("<cword>")
    let s:url = substitute(s:urlTemplate, '<name>', s:wordUnderCursor, 'g')
 
    call Run(Browser() . " " . s:url)
endfunction
 
noremap <silent> <M-d> :call OnlineDoc()<CR>
inoremap <silent> <M-d> <Esc>:call OnlineDoc()<CR>a

Доступ к базам данных

Вы можете даже работать с 10 различными базами данных: Oracle, MySQL, PostgreSQL, Sybase, SQLite, и всё из Vim, с помощью плагина dbext.vim. Самое приятное то, что этот плагин поможет вам редактировать SQL, написанный в PHP, Perl, Java и т.д. И вы даже можете напрямую выполнять SQL запрос, даже если он встроен в другой язык программирования, и вас даже спросят о значении переменных.

Итоги

Мы изучили, как Vim можно использовать в программировании с помощью различных плагинов и установок. Если вам нужно больше, вы можете написать свои плагины для Vim (как мы уже видели в главе Scripting).

Хорошим источником дискуссий по теме будет Stack Overflow и блог Peteris Krumins's.

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

http://www.codinghorror.com/blog/archives/001188.html

http://ctags.sourceforge.net

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

http://cscope.sourceforge.net/cscope_maps.vim

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

http://vim.sourceforge.net/scripts/script.php?script_id=213

http://www.vim.org/tips/tip.php?tip_id=1228

http://code.google.com/p/pysmell/

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

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

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

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

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

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

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

http://phraktured.net/vimmity-vim-vim.html

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

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

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

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

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

http://stackoverflow.com/questions/tagged/vim

http://www.catonmat.net/tag/vim



Предыдущий раздел: Следующий раздел:
Плагины Оглавление Разное