6 June 2015

Vim по полной: Введение

Website developmentVIM
Привет, хабраюзер!

Вот уже второй год я активный пользователь и поклонник редактора Vim. За это время я прошел путь от двух команд в .vimrc, до файла в несколько килобайт и обратно. Я испробовал очень много плагинов, а так же активно писал собственные, и теперь это мой основной текстовый редактор для работы и отдыха.

В этой серии статей я решил поделиться собственными наработками и, возможно, показать, на что может быть способен этот редактор в руках программиста. Серия будет состоять из следующих частей:
  1. Введение (vim_lib)
  2. Менеджер плагинов без фатальных недостатков (vim_lib, vim_plugmanager)
  3. Уровень проекта и файловая система (vim_prj, nerdtree)
  4. Snippets и шаблоны файлов (UltiSnips, vim_template)
  5. Компиляция и выполнение чего угодно (vim-quickrun)
  6. Работа с Git (vim_git)
  7. Деплой (vim_deploy)
  8. Тестирование с помощью xUnit (vim_unittest)
  9. Библиотека, на которой все держится (vim_lib)
  10. Другие полезные плагины

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


Что не так с плагинами для Vim


Основная проблема редактора (если не считать VimLanguage), это огромное количество разнообразных плагинов на все случаи жизни. Казалось бы, что в этом плохого? Дело в том, что плагины пишутся огромным сообществом, от чего они крайне плохо стыкуются между собой. Часто можно столкнуться с тем, что один из твоих плагинов частично умеет то же, что и два других, просто потому, что автор этого плагина решил добавить в него побольше «плюшек». Если заглянуть в код большинства плагинов, можно встретить множество дублирующихся от плагина к плагину решений и алгоритмов, которые по хорошему должны быть вынесены либо в VimLanguage, либо в некоторую единую библиотеку. К сожалению некоторые авторы плагинов пытаются реализовывать эти библиотеки, но после нескольких простеньких плагинов, созданных на базе этих библиотек, они прекращают поддержку и помимо десятка не слишком различающихся плагинов, вы должны установить парочку библиотек.

Когда я занялся разработкой под Vim, моей основной целью было написание единой библиотеки (да, еще один стандарт) для всех моих, а главное, чужих плагинов. Отличительной особенностью моей идеи от других было то, что я собирался реализовать все основные плагины на базе этой библиотеки, а если есть готовые решения, то привести их к стандартам библиотеки. Другими словами я хочу реализовать весь «джентльменский набор» плагинов, которые будут стыковаться друг с другом «из коробки» и использовать единую библиотеку.

Два года работы


Свое движение к «чистому и прекрасному» я начал с написания библиотеки. Переписывал ее я целых три раза, ибо мне нужно было хорошенько разобраться во всех тонкостях VimLanguage, его возможностях и ограничениях, а их, я вам скажу, там множество! В результате получилась библиотека vim_lib, которая меня полностью удовлетворяет.

Особенностью библиотеки является то, что она определяет структуру редактора в целом (как фреймворк), добавляя новый уровень действия скриптов — проектный. На деле, это позволяет вам настроить ваш редактор для конкретного проекта и даже установить плагины, которые будут работать только в этом проекте. Это особенно полезно, когда вы работаете с несколькими ЯП.

Вот вам небольшой пример. Предположим, мы работаем с web-проектом используя PHP и JavaScript, а в свободное время пишем книгу с помощью LaTeX. Что вам могу предложить я и Vim:

  • Все общие настройки выносятся в каталог ~/.vim/, после чего они будут доступны во всех проектах
  • Настройки для web-проекта мы положим в каталог webProject/.vim/, а для работы с книгой в bookProject/.vim/
  • Каждый раз, открывая окно редактора Vim, мы будем видеть
    список недавних проектов
    а перейдя в проект, он откроется в месте его последнего редактирования с восстановлением всех окон
  • Чтобы каждый раз не создавать файлы в чистого листа (например Unit-тесты, классы Mapper для бизнес-логики или главы книги), мы создадим
    готовые шаблоны файлов
    в каждом проекте (например для Unit-тестов webProject/.vim/templates/test/___Test.php)
  • Кто захочет постоянно набирать
    foreach(...)
    Пусть это сделает за нас Vim. Создадим несколько snippets на все случаи жизни
  • Для работы с LaTeX установим прямо в проект bookProject специфичные для LaTeX плагины
  • Но мы не одиноки, потому поделимся с нашими соратниками своими наработками с помощью Git, а для этого у нас есть
    удобный интерфейс прямо в Vim
  • Закончили очередную главу и хотите посмотреть на нее в pdf читалке? Не вопрос! Нажимайте F9 и книга будет скомпилирована и показана вам незамедлительно. Есть ли смысл упоминать о других скриптах, которые можно выполнить столь же просто?
  • Решили запустить тестирование конкретного класса? Не вопрос, и для этого найдется плагин
  • Пришло время слить изменения в продакшн? Нажимаем одну кнопку и они уже там


Опытные пользователи Vim скажут: «Пфф… Для всего этого есть куча готовых плагинов. Велосипед!» — но вы просто не знаете на что способны предлагаемые мной решения. Мало того, что они легко стыкуются друг с другом, так они еще и более функциональные по сравнению с аналогами среди плагинов Vim! В этом вы сможете убедится в следующих статьях цикла, просто наберитесь терпения.

Что если не терпится


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

  • vim_lib — базовая библиотека, без которой у вас ничего работать не будет. Она так же определяет порядок загрузки редактора
  • vim_plugmanager — моя реализация пакетного менеджера для Vim без «фатальных недостатков». Особенностью этого решения является возможность установки плагина как в пользовательский каталог, так и в каталог проекта без необходимости изменять конфигурацию плагина, а так же автоматическое разрешение зависимостей устанавливаемых плагинов
  • vim_prj — очень полезный плагин, позволяющий сохранять и восстанавливать состояние проекта при его открытии и закрытии
  • vim_start — плагин реализующий стартовое меню с возможностью быстрого перехода к недавним проектам
  • vim_git — очень мощный плагин для работы с Git прямо из Vim
  • vim_grep — поиск в проекте
  • vim_deploy — плагин для работы с любыми системами деплоя (за счет адаптеров к ним). На сегодня реализовано только два адаптера: shipit и gradle
  • vim_unittest — плагин для работы с любыми системами xUnit (за счет адаптеров к ним). На сегодня реализован только адаптер для phpunit
  • vim_template — очень полезный плагин, позволяющий гибко настраивать шаблоны для новых файлов
  • vim_write — автоматическое сохранение проекта
  • vim_winmanager — работа с окнами Vim


Для установки создайте каталог ~/.vim/bundle (можно использовать любое имя) и скопируйте туда vim_lib.
git clone https://github.com/Bashka/vim_lib.git ~/.vim/bundle/vim_lib

После добавьте в ваш .vimrc следующую запись:
filetype off 
set rtp=~/.vim/bundle/vim_lib
call vim_lib#sys#Autoload#init('~/.vim', 'bundle') " Адрес до вашего ~/.vim/bundle

Plugin 'vim_lib'
" Другие плагины

filetype indent plugin on


В общем, все как всегда.

Пока все


Поддерживаю этот проект я в свободные от работы дни, поправляя найденные в течении недели баги и добавляя тот функционал, который мне был нужен в процессе работы. Если у вас есть пожелания, чего бы вам лично не хватало в Vim, пройдите опрос, и рано или поздно это будет реализовано в виде очередного плагина для Vim.
Only registered users can participate in poll. Log in, please.
Чего не хватает Vim
21.36% Возможности реинженеринга проекта 66
64.4% Быстрого перехода к объявлениям классов, методов, свойств, переменных и т.д. 199
57.93% Автоматического завершения ввода с подсказками 179
32.69% Доступа к документации ЯП прямо из Vim 101
38.83% Анализатора ошибок 120
15.21% Качественной подсветки некоторого ЯП (какой, напишу в комментариях) 47
9.39% Готовых snippets для некоторого ЯП (какой, напишу в комментариях) 29
14.56% Интеграции с таск-трекером 45
45.63% Автоматическое форматирование кода под используемый код-style стандарт 141
4.85% Другое (напишу в комментариях) 15
309 users voted. 359 users abstained.
Tags:Vimlibraryplugins
Hubs: Website development VIM
+46
66.4k 524
Comments 86
Popular right now
Junior Clojure Developer
from 70,000 to 150,000 ₽Health SamuraiСанкт-ПетербургRemote job
Business Development Manager
from 60,000 to 270,000 ₽EVEN LabМосква
Full-stack web developer
from 150,000 to 300,000 ₽Rubrain.comRemote job
Teamlead React developer
from 180,000 to 210,000 ₽Самозанятые.рфМосква
Android разработчик
from 140,000 to 180,000 ₽Онлайн-кинотеатр iviМосква
Top of the last 24 hours