Pull to refresh

Vim по полной: Уровень проекта и файловая система

Reading time 4 min
Views 23K

Оглавление


  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. Реализация проекта позволяет не только выделить его как отдельную сущность среди других папок и файлов в ФС, но и реализовать такие свистелки, как:

  • Автоматическое сохранение и восстановление последней сессии проекта так, что после повторного открытия, мы получим редактируемый в прошлый раз файл(ы), с теми же настройками и положением
  • Хранение информации о проекте, такой как автор проекта, лицензия, версия и так далее. Все эти данные можно будет добавлять в шаблоны и сниппеты
  • Корневой каталог проекта строго определен. Это упростит использования других инструментов, на пример xUnit, дебагеры, генераторы документации и т.д.
  • Отдельный, принадлежащий только проекту каталог .vim и файл .vimrc, аналогичный пользовательским версиям. Теперь настройки и плагины проекта будут хранится в нем


Проекты в Vim


Не знаю почему, но пользователи Vim либо не используют проектную модель, либо реализуют/используют довольно странные плагины, которые, по сути, дают лишь часть от необходимой функциональности проекта. В Vim есть готовые механизмы, позволяющие реализовать новый уровень проекта, это опция exrc, которая заставляет Vim при загрузке искать и запускать файл .vimrc в корневом каталоге, но очевидно этого недостаточно. Что не хватает этому решению? Во-первых мы получаем в проекте один толстый файл .vimrc, изменять который со временем становится все сложнее. Во-вторых переопределять конфигурации Vim для проекта, такие как: подсветка, сниппеты, шаблоны, плагины — становится сложнее. В идеале проекту нужен как файл .vimrc, так и свой собственный каталог .vim (аналог .idea). Этот каталог должен повторять функциональность своего собрата уровня пользователя, а это значит использование тех же подкаталогов и той же логики загрузки (по возможности, средствами самого Vim, дабы все было прозрачно и гибко).

Один небольшой плагин


Подключение и использование каталога .vim реализуется уже знакомой нам библиотекой vim_lib. Класс sys/Autoload подключает каталог проектный каталог .vim к runtimepath так, что он загружается в правильной последовательности (последним) и может переопределять любые настройки Vim. Остальную логику реализует плагин vim_prj. В его задачи входит:
  • Подключить с помощью опции exrc файл .vimrc
  • Сохранять и восстанавливать последнюю сессию проекта
  • Создавать инфраструктуру проекта по команде
  • Хранить опции проекта, такие как автор, лицензия и т.д.
  • Хранить информацию о расположении проекта в ФС и всех уровнях загрузки

Проектный .vimrc


Если кто не знает, опция exrc заставляет Vim искать в текущем каталоге (каталог, в котором запущен редактор) файлы с именами .vimrc или _vimrc и запускать их. Плагин vim_prj просто устанавливает эту опцию в значение «включено».

Сессии проекта


Здесь все не намного сложнее. Vim из коробки умеет сохранять и восстанавливать сессию с помощью хранящего информацию о сессии файла и команды mksession. Опция sessionoptions позволяет определить, какие именно данные будут сохраняться, а какие можно «забыть».

Плагин реагирует только на проекты (корневой каталог содержит .vim) и автоматически сохраняет и восстанавливает последнюю сессию при открытии и закрытии проекта. Сессия проекта хранится в файле .vim/session.vim.

Инфраструктура проекта


Для того, чтобы плагин работал с некоторым каталогом как с проектом, достаточно создать в нем каталог .vim. Все ленивые программисты в голос скажут — мне что, руками его создавать? — конечно нет! Для этого плагин реализует команду VimPrjCreate, которая помимо .vim создает файл .vimrc в проекте, инициализирует его согласно требованиям загрузчика sys/Autoload, создает .vim/plugins.vim и .vim/bundle. Такая структура позволяет быстро устанавливать плагины с помощью vim_plugmanager (они сразу подключаются в .vim/plugins.vim).
Пример создаваемого .vimrc
filetype off                                                                                                                                       
call vim_lib#sys#Autoload#init('.vim', 'bundle')
so .vim/plugins.vim " Все объявления установленных в проекте плагинов должны хранится в этом файле
filetype indent plugin on


Информация о проекте


Глобальный словарь vim_prj#opt, создаваемый плагином, не является чем то особенным, а просто определяет место, в котором должны хранится данные о проекте. Вы можете задать общую информацию для всех проектов в вашем пользовательском ~/.vimrc
Пример
" В файле ~/.vimrc
let g:vim_prj#opt = {'author': 'Vim_*', 'license': 'GNU GPL 3'}


и переопределить их для конкретного проекта в .vimrc файле проекта.
Пример
" В файле ./.vimrc
let g:vim_prj#opt = {'author': 'Vim_*', 'license': 'MIT'} " Словарь будет переопределен, а не слит


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

Дом проекта


Очень полезной особенностью плагина, которую даже не пришлось реализовывать, является определение расположения проекта в ФС. Если вы открываете редактор Vim в корневом каталоге проекта (в котором хранится .vim), то вы работаете в проекте, иначе, вы просто открыли редактор. Соответственно плагину будет известен адрес корневого каталога проекта, все другие уровни загрузки редактора ($VIMRUNTIME и ~/.vim), что может понадобится другим вашим плагинам. Естественно для того, чтобы работать с таким проектом, нужна возможность просматривать файловую структуру проекта и открывать файлы. Делается это с помощью плагина nerdtree. Другими словами вы просто открываете редактор в корне вашего проекта командой vim, и получаете все прелести, присущие проекту.

Пока все


Не вижу смысла расписывать плагин nerdtree в этой статье (думаю вы и так о нем знаете), скажу лишь, что в будущем он будет заменен или переписан, так как в нем отсутствуют некоторые обязательные для файлового менеджера функции и удобный API для использования другими плагинами.
Tags:
Hubs:
+24
Comments 53
Comments Comments 53

Articles