Vim

Vim'ом я пользуюсь уже около 6 лет и считаю потраченное на изучение и настройку время одной из самых удачных инвестиций в своей карьере. Всё это время в сети я часто натыкаюсь на какой-нибудь крутой плагин или сниппет, добавляю их в vimrc, и поигравшись полчаса, сказав "вау", я обычно забываю об их существовании. Вспоминаю только когда от нечего делать начинаю разбираться что за фигня такая в моём vimrc, и вновь приходится гуглить как ей надо пользоваться. Тем временем, некоторые плагины предоставляют настоящие супергеройские возможности.

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

Всё описанное здесь привязано к моему vimrc и я даже не помню какое поведение стандартно для Vim'а, какое установлено только у меня.

Популярные плагины

Сперва реально популярные плагины, о которых знает или должен знать каждый пользователь Vim'а. Потом перейду к жемчужинам коллекции.

Vundle

Я ещё хорошо помню те времена, когда пользователь сам должен был устанавливать каждый плагин. Это было дико. Vundle - пакетный менеджер для Vim'а. Установка и обновление плагинов одной командой. С него бы я советовал начать обустраивать свой vimrc.

Gundo

Одна из киллер-фич Vim'а. Я конечно почти уверен что она есть в некоторых IDE, но впервые я это увидел здесь. Впечатлен даже спустя много лет. Gundo - дерево изменений для файла. Отображается по нажатию <F5>. Подробная история изменений со временем, diff'ами и возможностью отката к любой из версий (даже отмененных).

NERDTree

Первый шаг на пути Vim'а к IDE - файловый менеджер. Запускается по нажатию <F3>, закладки можно хранить в ~/.NERDTreeBookmarks. Чтобы избежать головняков с кучей буферов/окон (кто пользовался тот знает) очень рекомендую добавить плагин vim-nerdtree-tabs. Можно исключать файлы по маске. Чтобы сделать директорю корнем нужно нажать C когда она под курсором.

airline

Навороченая и красочная строка состояния. Может отображать текущий режим, ветку VCS, кодировку и кучу другой информации. Более легковесная альтернатива vim-powerline (который я не помню почему даже не попробовал). Настройка let g:airline#extensions#tabline#enabled = 1 решила мою многолетнюю проблему с табами. Все предыдущие специализированные плагины были ужасны.

Syntastic

Linter. Показывает предупреждения и ошибки почти в реальном времени. Поддерживает огромное количество различных линтеров для всех возможных языков разметки и программирования. Я пока использую только совместно с JSHint, но в ближайшее время переключусь на него в Python и Haskell.

CtrlP

Последний мегапопулярный плагин CtrlP помогает быстро найти нужный файл во вложенных директориях. Единственная комбинация для запоминания - <C-p> (сюрприз).

На этом сверхпопулярные универсальные плагины кажется закончились.

Метки и vim-signature

Метки являются одной из наиболее крутых фич, к использованию которых я никак не мог себя приучить. Помог мне в этом плагин vim-signature, который визуализирует метки, тем самым вечно напоминая о их существовании.

Локальные для буфера метки обозначаются строчными буквами. Глобальные обозначаются прописными буквами. Последняя (пред-, предпред- и т.д.) обозначается номером 0 (1,2 и т.д)

Горячие клавиши

Большинство комбинаций уже встроено в Vim, некоторые предоставлены vim-signature, некоторые мои.

  • Поставить/убрать метку x - mx
  • Перейти на метку x - `x
  • Перейти на строку метки x - 'x
  • Перепрыгнуть обратно - `` (и '')
  • Очистить все метки буфера - m<Space>
  • Следующая (предыдущая) метка в буфере - ]' (и [')
  • Показать все марки (моё) - m

Так же можно пользоваться этими комбинациями в других: c'a - очистить всё до метки a. Сам ни разу не пользовался.

g; и g, перемещают курсор по местам былых парвок. Эта фича уже не относится к меткам, но служит общему делу - быстрому перемещению по файлу.

Интеграция с Git

Изменения

В этом плане самым полезным для меня является gitgutter. Он отображает в реальном времени строки добавленные или измененные относительно предыдущей ревизии. К сожалению, я давненько выявил у него маленькую проблему с юникондными символами и поэтому сейчас он у меня по умолчанию отключен, а включается по нажатию \g.

Команды

Другой более функциональный плагин fugitive представляет из себя Навороченую обёртку для других команд git. Один из тех плагинов, которым всё время хочу начать пользоваться, но не могу выработать привычку. Пока что у меня навешаны pull и push на \u и \p соответственно. Почему-то мне проще закрыть Vim или перейти в другую вкладку терминала чтобы поработать с системой контроля версий, но в целом fugitive пытается делать жизнь разработчика проще.

Gstatus
Открывает в соседнем окне вывод git status, можно перемещаться по файлам с помощью gf.
Gwrite (то же что и Git add %)
Добавить файл из текущего буфера в индекс
Gblame
Отобразить git blame в соседнем окне. Пожно перемещаться по diff'ам, смотреть авторов.
Gdiff
Самый удобный просмотрщик diff'ов.
Gbrowse
Запускает и открывает gitweb в браузере. Очень круто. Но не знаю что с этим делать.

Python IDE

Самый навороченый плагин это конечно же python-mode. Всё включено. Я если честно и сам не знаю что тут включено. Но некоторые штуки (вроде rope) можно и выключить. Увы, достаточно часто глючит и какая-то из его подсистем (опять rope скорее всего) не поддерживает некоторые синтаксические возможности Py3k вроде статической типизации из-за чего теряется очень много функционала.

Самые частиспользуемые функции python-mode:

  • запустим код и напечатает вывод в новом буфере (альтернатива vim-slime) - r
  • вкючить точку останова (альтернатива сниппету) - b
  • откроет документацию к модулю под курсором. Очень круто в сочетании с HandleURL (см. ниже) - K

Самые частоотключаемые фукнции python-mode:

  • rope (let g:pymode_rope = 0)

Интеграция с мультиплексером

Я ещё активно использую tmux. И иногда очень хочется запустить в интерпретаторе какой-либо кусок текста из редактора. Для этого используется плагин vim-slime. Для tmux'а требуется небольшая настройка (всё есть в vimrc).

Открываем панель (<C-b>| или как там), запускаем в ней необходимый интерпретатор (ipython, sbt console, ghci или обычный shell), выделяем текст и жмём <C-c><C-c>. Запускать код можно и с помощью python-mode (см. выше), но этот вариант универсальнее и удобнее.

Чертовски удобно.

reStructuredText

Основной плагин для работы с reST - riv. Добавляет подсветку, быстрые клавиши, удобнейший редактор таблиц, конвертацию в другие форматы и кучу ещё всего.

Быстрые клавиши в Riv

  • Создание ссылки <CE>ck
  • Новый элемент списка <CE>ln
  • Новый вложенный элемент списка <CE>lb
  • Создание новой таблицы <CE>tc (Для добавления столбца, нужно вставить | внутри предшествующего столбца)
  • Переключение элемента списка в TODO <CE>ee
  • Жирный текст <CE>cs
  • Выделенный текст <CE>ci
  • Блок <CE>cb
  • Конвертировать в HTML <CE>2hh
  • Показать оглавление <CE>hs

Раньше я активно пользовался возможностью вести TODO-списки с помощью его и для этого у меня был собственный форк с поддержкой дат привычных в русской локали, но отсутсвие синхронизации со всеми девайсами заставили меня перейти на более мейнстримные решения. И форк надо бы удалить.

Ещё одним костылем был мой плагин vim-precocious, который автоматически предлагал закоммитить файл после сохранения. Это нужно мне для работы со своим журналом, потому что я всегда забываю закоммитить, а коммиты тут лишними не бывают. Теперь я использую dnevnichok для работы с reST и нужда в precocious отпала. Тем более последнее время он сошёл с ума и начал аварийно завершать Vim.

Haskell

Иногда я программирую на Haskell. Больше всего мне в этом помогает уже упомянутый универсальный vim-slime. К сожалению, GHCi работает с несколько другим синтаксисом нежели компилятор, поэтому slime автоматически включает экранирование для кусков кода, которые я пытаюсь вставлять из обычного .hs файла. Если же я пишу скрипт специально для GHCi, то мне нужно переключиться в FileType haskell.script нажатием \hs (обратно так же).

Из специфических для Haskell плагинов я использую neco-ghc для автодополнения. Для линтинга ghcmod-vim, который так же определяет тип подвыражений по нажатию сочетания \ht. Оба плагина требуют для своей работы ghcmod, это специальная утилита для взаимодействия редакторов с Haskell-кодом. Её нужно установить: cabal install ghc-mod и добавить в PATH. ghcmod-vim ещё требует дополнительно плагин vimproc, который позволяет асинхронно запускать программы в shell, и который в свою очередь необхоимо ещё собрать (описано в REAMDE). Т.к. Haskell далеко не главный мой инструмент, эти плагины подгружаются только если в системе установлен cabal (идёт вместе с Haskell Platform).

Во время изучения нового языка бывает чрезвычайно удобно посмотреть исходники стандартной библиотеки. Для этого используется штука под названием ctags. В случае с Haskell, установка всего представляет из себя достаточно длительный процесс. Вот один вариант здесь. Там предлагают установить hothasktags, но к сожалению на момент когда я это смотрел, я не смог установить этот пакет. Как не смог и lushtags, который ещё и интегрируется с установленным у меня TagBar. Всё сработало с hasktags:

  1. Установить hasktags: cabal install hasktags;
  2. Склонировать исходники стандартной бибиотеки git clone https://github.com/ghc/packages-base.git $HOME/workspace/package-base
  3. Сгенерировать теги cd $HOME/workspace/packages-base; hasktags --ignore-close-implementation --ctags .; sort tags
  4. Добавить путь к тегам в vimrc: set tags+=$HOME/workspace/packages-base/tags.

Это работает только для стандартной библиотеки (ну или каждый пакет надо клонировать, индексаировать и добавлять), но для учебных целей хватает. Можем перейти к исходникам по нажатию <C-]>.

Последний плагин - vim-hoogle. По названию понятно, что он ищет по базу документации Hoogle. Имеет две полезные команды :Hoogle и HoogleInfo. Последнюю я привязал к клавише K, как и с python-mode.

JavaScript

Не знаю почему меня удивило то, что JavaScript имеет такую хорошую поддержку в Vim. Раньше я всегда использовал IDE для работы с JS, но теперь чувствую что можно разгрузить своё ОЗУ.

Для автодополнения используется Tern. Это автономный движок для анализа JS-кода, который можно использовать с различными редакторами и IDE, в том числе конечно и плагин для vim'а. После установки плагина через Vundle необходимо не забыть установить сам Tern, выполнив для этого npm i внутри $HOME/.vim/bundle/tern_for_vim/. Чтобы работало автодополнение для определенных библиотек и DOM'а в корне проекта должен находиться файл .tern-project. Конфигурация достаточно тривиальна. Встроенный OMNI Completion для JS лучше убрать, он только мешает.

vim-javascript-syntax предназначен для подсветки кода, но меня и встроенная подсветка вполне устраивала. Зато у этого плагина есть поддержка сворачивания, чем я и пользуюсь.

Для проверки ошибок я использую упомянутый в начале Syntastic с JSHint.

Markdown

Несмотря на то, что являюсь ярым поклонником ReStructuredText, на работе мы всё же используем Markdown. Да и глупо отрицать, этот формат значительно популярнее rst.

Самый популярный плагин, что я нашёл - vim-markdown, им и пользуюсь, хотя ничего кроме подсветки мне не нужно. По непроверенным пока данным, этот плагин отжирает CPU на моём макбуке при каждом нажатии клавиши, и чем больше документ тем заметнее это становится. Пока дам ему шанс и проверю он ли виноват. Он кстати требует tabular для своей работы. Возможно дажее более полезный плагин (а может это он жрёт CPU?). Посмотреть для чего он нужен лучше всего в скинкасте.

То что хотелось бы помнить

Команды, функции, настройки

autocmd
Выполняет команду по событию. В Vim определено более 40 событий, по любому из них можно вызвать свою команду. Очень часто этим событием является определенный FileType. Так я например устанавливаю команды только для определенных типов файлов.
executable('cabal')
Вернет 1 если cabal находится в PATH

Комбинации

Для Python и Haskell у меня существует привязка документации к клавише K. Так открывается новое окно с документацией к функции (модулю) под курсором. Как правило, мне хватает быстрого взглядла не него и не приходится даже переходить туда, но закрыть надо. Для этого я использую комбинацию <C-w>o. Она закрывает все окна кроме того где находится курсор. То же самое делает команда :only.

Мои сниппеты

HandleURL

Один из самых любимых. Сочетание gx в системах с GUI отправляет ссылку из под курсора в браузер. В сочетании с клавишей K из python-mode можно в два касания посмотреть в браузере документацию к любому модулю.

Шрифты в gVim

В самом начале vimrc в случае если gVim запущен из под Win32 устанавливаются нормальные кириллические шрифты. Иначе беда.

Сохранить файл как root

Иногда открываю общий системный файл как обычный пользователь без sudo. Произведя кучу правок, я не могу сохранить его потому что не имею доступа на запись. В этом случае вместо :w нужно ввести :w!! и мне будет предложено ввести пароль и сохранить файл.

ctags

ctags - утилита для индексирования исходных кодов. Позволяет просмотреть исходных код необходимого модуля. К сожалению, для правильной работы, необходимо установить ctags, создать индекс, да ещё и добавить его в vimrc.

Для Python в vimrc у меня есть сниппет позволяющий избежать этого, он просто обходит весь sys.path и добавляет все пакеты в path, благодаря чему Vim может переходить к модулям как к обычным файлам нажатием комбинации fg. Но по тегам перемещаются с помощью комбинации <C-]>, поэтому специально для Python я сделал необходимый маппинг от <C-]> к gf. Потому что я могу.

История с тегами для Haskell описана выше.

Фолдинг

zr и zm открывают и закрывают складки по всему файлу.

История правок

  • 25.01.2015 Haskell
  • 04.04.2015 Syntastic и JavaScript
  • 16.10.2015 Markdown