В 2009-м году я написал для Хабра статью “Использование Vim для редактирования простого текста”.

Спустя почти двенадцать лет, данная статья всплывает в поиске. Есть много статей, как превратить VIM в IDE, но то, как сделать его удобным для написания простых текстов, остаётся за кадром. Это печально, потому как VIM в этом контексте раскрывается как очень удобный инструмент. Но чтобы он стал таковым, необходимо выполнить ряд специфических настроек.

В этой статье я описываю, как настроить VIM для работы с форматом MarkDown с нуля.

Под простым текстом я понимаю текст, который не код. Имеющий конечной целью его чтение человеком

На что хотелось бы обратить внимание:

  • VIM дружит с MarkDown. В 2009-м году мне было не понятно, в каком текстовом формате писать в VIM (кажется, тогда многие писали прямо в HTML). Я изначально старался перенести в VIM опыт работы с привычными текстовыми процессорами - выравнивать текст по ширине, а заголовки по центру и т.п. Это заведомо проигрышный вариант, поскольку для форматирования используются пробелы, табуляция и переносы строк для форматирования. Если отформатированные таким образом тексты пытаться куда-то перенести - результат получается отвратительным. К счастью сейчас есть стандарт де-факто - это MarkDown (который хоть и появился, если верить Википедии в 2002-м, но “на слуху” стал гораздо позднее). Взаимоотношения VIM и Markdown складывались не просто. Да, была подсветка синтаксиса, писались разные плагины, но только в последние пару лет я нашёл плагин, которые удовлетворяет всем потребностям работы с Markdown в VIM - это Pandoc. О нём поговорим позже. Но главная прелесть Markdown - это органичное сочетание текста и элементов его представления. Это приводит к возможности конвертирования md-файлов в другие форматы. Думаешь, в каком формате писать - пиши в MarkDown.

  • VIM консервативный редактор. Его создатель, Брэм Молинар, крайне неохотно идёт на добавление в редактор новшеств. С целью сделать более современную версию редактора, его пришлось полностью переписать. Так появился NeoVim. Инициатор проекта, Thiago de Arruda в 2013 писал, что изначально хотел добавить поддержку многопоточности при выполнении плагинов, однако все его попытки оказались проигнорированы сообществом VIM-разработчиков (среди которых решающим голосом обладает Брэм). Кроме того Arruda отмечал крайне низкое уровня кода в VIM. В NeoVim реализована поддержка скриптового языка Lua, что было с радостью воспринято создателями плагинов. Я не знаю, есть ли сейчас необходимость пользоваться каноническим Vim. NeoVim работает быстро и стабильно. Поэтому говоря в настоящей статье “Vim”, я подразумеваю его современную инкарнацию, как результат эволюционного процесса: Vi -> Vim -> NeoVim. Создателям NeoVim удалось ничего не сломать, а только лишь привнести новое и полезное.

  • VIM - это не только текстовый редактор, но и, по-сути, концепция работы с текстом. Другие редакторы и IDE (VisualStudio Code, продукты от JetBrains, Emacs с расширением evil-mode) позволяют добавить в них приёмы работы из Vim. Более того, оказывается, можно совместить эти приёмы c браузером. Я использую расширение для FireFox - VimVixen. Оно хорошо работает, но бывают моменты, когда страница перехватывает нажатия клавиш и workflow рушится. Однако по-настоящему интегрировал в себя концепцию Vim QuteBrowser.

Киллер-фича QuteBrowser: При вводе текста в текстовое поле (допустим, оставляя комментарий на сайте), можно нажать “I” и открыть внешний текстовый редактор. Сохранённый в нём текст, будет вставлен в текстовое поле браузера.

  • Это удивительно, но в 2009-м VIM представлялся мне архаичным. Нечто из глубокого прошлого, чем, тем не менее, можно пользоваться и в наши дни. Однако стоит почитать соответствующие ветки на Reddit, как становится понятно, что Vim прям таки современная и культовая штука.

Основные концепции VIM при работе с простым текстом

Мышка сдохла, хвост облез

Сила VIM - в безотрывной от клавиатуры работе с текстом. Пальцы лежат на ASDF-JKL; Снял руки с клавиатуры - минус бал. Потянулся к курсору - минус бал.

Hello Friend

Конечно, не всё так строго, но как концепция - это базовый приём. Если пройти обучалку VimTutor, посмотреть какие-нибудь видеоуроки по Vim, то в них делается акцент на приёмах работы в “нормальном режиме”, т.е. режиме редактирования (объясняется как передвигаться по тексту, как удалять и вставлять блоки и т.п). А про эффективную работу в режиме вставки как-то умалчивается. А в нём есть сочетания, которые делают работу в этом режиме по настоящему удобной:

- C-h - удаляет последний введённый символ (аналог BackSpace)
- C-w - удаляет последнее введённое слово
- C-j - перенос не следующую строку (аналог Enter)
- C-o - переход в нормальный режим для выполнения одной команды
- C-[ - переход в нормальный режим (аналог Esc)

Всего шесть комбинаций! Шесть комбинаций которые радикально меняют весь процесс ввода! Но чтобы эти клавиатурные сочетания стали удобными, обязательно нужно переназначить средствами операционной системы левый CTRL на место CapsLock. Тогда ими можно пользоваться не убирая руки с исходной позиции. В среде Gnome это можно легко сделать через Gnome Tweaks.

Hello Friend

Но что делать с переключением раскладки? Писать все тексты только на английском языке!🤣 На самом деле в каждой шутке, как известно, лишь доля шутки. Для нормальной работы с VIM разумнее всего пользоваться встроенным переключателем, который по умолчанию активируется через C-^. Это не удобно, поэтому для себя я переназначил C-^ на C-a в режиме вставки. Это оказалось настолько крутое решение, что я бы хотел переключать таким образом раскладку клавиатуры везде, где только можно. Да, мы имеем два переключателя раскладки - для VIM и для ОС в целом. Но с этим придётся смириться, поскольку все иные варианты решения проблемы неэффективны.

Сперва набираем, затем редактируем

Наличие режимов вставки и редактирования в VIM предлагает следующую парадигму. Что будет, если не стараться сразу сделать текст идеальным, а набрать его как бог на душу положит, а потом редактировать? Удивительно, но этот приём зарекомендовал себя с лучшей стороны. Первый ввод текста - это что-то типа мозгового штурма. Изливаешь всё, что думаешь по теме, а затем уже причёсываешь до надлежащего состояния. Можно пойти ещё дальше - сделать разделение окна по вертикали. В левой - черновик, в правой - чистовик, и собирать текст по кускам. Для некоторых текстов и документов это вполне себе работает. Да, движений больше, но и результат значительно лучше.

Pandoc решает все проблемы

Pandoc удивительный инструмент. Как написано на официальном сайте: “If you need to convert files from one markup format into another, pandoc is your swiss-army knife”. То есть это утилита, которая позволяет конвертировать из документы из MarkDown в другие текстовые форматы. Кроме того, Pandoc предоставляет плагин для VIM, который, фактически, решает все вопросы по работе с MarkDown. Но что по настоящему круто, это конвертация текстов в формат LibreOffice и Microsoft Word. Как это выглядит:

  • заранее подготавливаешь шаблон в формате docx или odt с нужными стилями (для заголовков, списков, текста);
  • пишешь текст в MarkDown в VIM;
  • прогоняешь его через Pandoc и получаешь документ odt или docx с нужным тебе форматированием!

То есть никакой копи-пасты. В итоге мы получаем VIM как ультимативный инструмент для набора текста с возможностью оформления результата в виде “офисного” текстового файла, который можно использовать для печати, отправки по электронной почте и т.п. Нереально круто!

Конфигурация VIM для работы с простым текстом

Теперь попытаемся настроить VIM, чтобы всё работало, как описано выше.

При написании статьи все настройки воспроизвёл на свежеустановленной Ubuntu 21.04

Hello Friend

  1. Устанавливаем NeoVim из репозитория дистрибутива. Запускаем:
    Hello Friend
  2. В файле ~/.config/nvim/init.vim выполняем базовую настройку редактора:
setlocal clipboard+=unnamedplus
setlocal keymap=russian-jcukenwin
inoremap <C-a> <C-^>
set scrolloff=4
filetype off
  1. В папке ~/.config/nvim/ftplugin создаём файл pandoc_markdown.vim куда прописываем специфические для markdown настройки
setlocal spelllang=ru,en
setlocal spell
sw=4
  1. Устанавливаем Vundle для работы с плагинами:
git clone https://github.com/VundleVim/Vundle.vim.git ~/.config/nvim/bundle/Vundle.vim
  1. Настраиваем Vundle, прописав в файле init.vim следующее. Заодно установим несколько плагинов, делающих редактор красивым:
set nocompatible
set rtp+=~/.config/nvim/bundle/Vundle.vim
call vundle#begin()
Plugin 'VundleVim/Vundle.vim'
Plugin 'vim-airline/vim-airline'
Plugin 'vim-airline/vim-airline-themes'
Plugin 'morhetz/gruvbox'
Plugin 'vim-pandoc/vim-pandoc'
Plugin 'vim-pandoc/vim-pandoc-syntax'
call vundle#end()
filetype plugin indent on
:colorscheme gruvbox
  1. Заходим в NeoVim и устанавливаем плагины командой:

:PluginInstall

Hello Friend

  1. Теперь открываем какой-нибудь файл с расширением .md в NeoVim. При первом запуске редактор предложит скачать и установить словари для русского языка. Соглашаемся.

  2. Проверяем получившийся результат:

    Hello Friend