5 октября 2012 г.

tagbar - удобная навигация по всем функциям и классам

Язык написания плагина: VimL
Зависимости: ctags

Думаю, ни для кого не будет секретом, что когда кода становится много, искать что-либо в нём бывает затруднительно. Продвинутые редакторы кода и интегрированные среды разработки научились решать эту проблему с помощью так называемых outline`ов. Данный функционал представляет собой окно, со списком всех сущностей в коде (макросов, классов, функции и тд). Что позволяет сразу перейти к определению кликнув на нужный элемент.

В vim с давних пор для этого использовался плагин taglist, формировавший outline окно с помощью внешней утилиты ctags. Большим недостатком этого плагина было то что он структурировал сущности в виде списка, в то время как более привычным и наглядным является древовидное представление.
Какое то время назад мне на глаза попался плагин исправляющий недостатки taglist, имя ему tagbar:



Плагин отлично выполняет свою основную задачу, наглядно показывая сущности в коде. Так-же как и taglist, плагин использует утилиту ctags для получения информации из кода.

В завершение я хочу показать несколько полезных настроек плагина:

" Показывать окно слева
let g:tagbar_left = 1

" Ширина окна
let g:tagbar_width = 30

" Показывать стрелки вместо +/-
let g:tagbar_iconchars = ['▶', '◢']

" Не сортировать
let g:tagbar_sort = 0

 

См. Также:

Справочный файл: :help tagbar
Страница плагина на vim.org: http://www.vim.org/scripts/script.php?script_id=3465
Git-репозитарий: https://github.com/majutsushi/tagbar.git

21 сентября 2012 г.

pyflakes-vim - подсветка ошибок в коде python на лету


Язык написания плагина: VimL, python
Зависимости: +python

Часто ли вы делаете опечатки? Вот я частенько, бывает, даже когда я пишу в код. Это не так страшно, если вы пишете на языках со статической типизацией, например на C++ или Java, компилятор просто тыкает вас в место ошибки, при несоответствии типов или забытом параметре функции. А как быть при работе с интерпретируемыми ЯП?
Я много кода пишу на python и уже не представляю себе жизни без подсветки ошибок в редакторе на лету. В vim эту функцию выполняет плагин pyflakes-vim, основанный на утилите для проверки ошибок pyflakes. Вся прелесть этой утилиты в том, что она не просто выявляет синтаксические ошибки, которые и так можно посмотреть, запустив скрипт. Но и показывает:

  • неиспользуемые импорты и переменные 
  • использование переменной до её определения
  • переопределение функции/метода в локальной области видимости



Совет: Все найденные ошибки так-же отображаются в стандартном окне quickfix.
Открыть которое можно командой ``:cwin``.



pyflakes vs Syntastic

 

Хотя сам автор плагина пишет что он deprecated и рекомендует переходить всем на Syntastic, так-как в этот плагин подсвечивает, в том числе и ошибки python'а. Я досих пор пользуюсь именно pyflakes-vim для python, просто потому что он для меня более удобен:
  • Подсвечивает ошибки сразу, а не при сохранении как Syntastic.
  • Сама подсветка реализована более правильно, вместо sings используется подсветка а-ля spellcheck.
  • Портабельность, всё необходимое для работы плагина лежит в его директории (кроме интерпретатора python разумеется)
Однако для других языков я использую Syntastic, в виду того что он поддерживает большое количество ЯП.

Для тех кому интересен Syntastic: http://habrahabr.ru/post/108564/

Замечание: плагин не поддерживает python 3+

См. Также:

 

Страница на vim.org: http://www.vim.org/scripts/script.php?script_id=2441
Git-репозитарий: https://github.com/kevinw/pyflakes-vim.git

13 сентября 2012 г.

CtrlP - нечёткий поиск по файлам, буферам, тегам, ...

Язык написания плагина: VimL
Зависимости: нет

Для vim существует огромное количество плагинов, как полезных так и не особо нужных. Но среди них есть и те, после использования которых, вы восклицаете - как я раньше жил без этого! Сегодня я познакомлю вас с одним из них, встречайте - CtrlP. Цель этого плагина сделать максимально удобным и быстрым поиск файлам, буферам, тегам, и т.д.

Основные возможности плагина:

  • Поиск по мере набора
  • Используется "нечёткий поиск" что позволяет найти цель вводом всего пары символов
  • Написан на чистом VimScript, одинаково хорошо работает для MacVim, gVim и Vim 7.0+
  • Полная поддержка регулярных выражений vim
  • Поддержка поиска по недавно открытым файлам (MRU) и по открытым буферам
  • Расширения, благодаря которым искать можно не только по файлам, но например, по тегам генерируемым ctags
Для начала немного о "нечётком поиске", предположим у нас есть директория вида:
kraken
|   buidldoc.cmd
|   kraken.py
|   readme.htm
|   readme.rst
|   tags
|   test.py
|
\---kraken_handlers
    |   base.py
    |   pdb_postmortem_loader.py
    |   pyqt4_error_reporter.py
    |   save_crash_info.py
    |   __init__.py
Для того чтобы открыть файл __init__.py в vim, вам придётся прописывать его полный путь: :o kraken/kraken_handlers/__init__.py это долго и утомительно. С помощью нечёткого поиска это делается вводом всего лишь части названия файла, например __ однозначно найдёт совпадение с файлом. Удобно так-же то, что по мере набора вы сразу видите результат.


Такой-же трюк можно проделывать и с директориями:

Для вызова окна плагина используется <c-p> или  команда ``:CtrlP``.

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

Совет: для того чтобы после открытия файла, сразу перейти к нужному номеру строки введите :<номер строки> после имени, пример: >>__i:10.

Плагин CtrlP не ограничивается поиском только по файловой системе, с помощью команд :CtrlPBuffer и :CtrlPMRU он позволяет искать по открытым буферам и недавно закрытым файлам соответственно. Но это ещё не всё, с помощью расширений плагина, он даёт возможность поиска по тегам, директориям, истории изменений и много чему еще, но об этом мы поговорим позже.

 

Сравнение с аналогами

 

Помимо рассматриваемого, для vim существует еще, по крайней мере два плагина с похожим функционалом это command-t и FuzzyFinder.
И последним из них, я достаточно долго пользовался, пока не узнал о CtrlP. Причиной перехода стало то, что FuzzyFinder давно не обновлялся и скорее всего, заброшен автором.
Command-t вдохновлялся TextMate, его авторы хвалятся скоростью работы плагина. Благодаря использованию Ruby и C-extensions к нему. Сам я этот плагин не ставил, из-за вышеописанных зависимостей (для меня важна портабельность). Возможно, Ruby-программистам Command-t подойдёт больше.

 

Расширения

 

С помощью команд-расширений плагин позволяет искать:
CtrlPTag - по тегам, сгенерированным ctags
CtrlPBufTag - тегам внутри буфера
CtrlPQuickfix - буферу quickfix
CtrlPDir - директориям
CtrlPRTS - файлам в runtime vim (vim-скрипты, файлы справки, снипеты)
CtrlPUndo - истории отмен (Undo history)
CtrlPLine - номерам строк файла
CtrlPChange - списку последних изменений файла
CtrlPMixed - сразу по файлам, буферам и списку последних открытых файлов
Более подробно обо всех командах вы можете узнать из справочного файла плагина.

Включить расширения можно, перечислив их в переменной g:ctrlp_extensions:
let g:ctrlp_extensions = ['tag','buffertag','quickfix','dir','rtscript',
                        \ 'undo','line','changes','mixed']

 

См. Также:


Справочный файл: :h CtrlP
Страница на vim.org: https://github.com/kien/ctrlp.vim.git
Домашняя страница плагина: http://kien.github.com/ctrlp.vim/
Git-репозитарий: https://github.com/kien/ctrlp.vim.git