August 24, 2021

Феномен Vim и Emacs

Время от времени мне задают вопрос "зачем использовать Vim сегодня?". И каждый раз ответить на него довольно сложно, так как нужно рассказать как минимум какие особенности есть в том же Vim, а уже после этого объяснить почему эти особенности важны для меня. И так как у меня уже был опыт ответа на вопрос "как пользоваться Vim", то я решил пойти похожим путём и рассказать про феномен популярности таких редакторов как Vim и Emacs вообще, что позволит дать развернутый ответ на вопрос "зачем".

Немного истории

Текстовым редакторам Vi и Emacs в этом году стукнуло 45 лет, идейному продолжателю Vi и его наследнику, Vim, уже 30 лет, но до сих пор слышны отзвуки священной войны "Vim против Emacs" (о которой даже есть статья на Википедии), а GitHub продолжает пополняться с любовью оформленными конфигами обоих редакторов.

Казалось бы, архаичные артефакты прошлого уже давно должны были покрыться пылью и уйти в забвение, но вместо этого появляются их обновленные версии (Neovim) и различные фреймворки (Spacemacs, SpaceVim). При этом другие редакторы и IDE за последние 30 лет рождались и умирали, а Vim и Emacs до сих пор с нами. Так в чём же секрет их долголетия? Попробую порассуждать на эту тему.

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

Vim

Изначально Vi был просто визуальным (visual) режимом редактора ex, разработанного Биллом Джоем для компьютера ADM-3A, и только позже он стал самостоятельным редактором.

(C) "ADM-3A" by Chris Jacobs
Интересный факт. Билл Джой ещё до ex разработал редактор em, который был задуманный как редактор для "смертных" (Editor for Mortals) на замену запутанному и сложному ed. То есть Vi изначально задумывался как простой и понятный обычному смертному редактор. Так что в следующий раз, когда вы будете искать выход из vim, порадуйтесь, что не запустили ed!

Кстати, убедиться в сложности и запутанности ed вы можете до сих пор в любой unix-based системе, просто набрав в терминале ed. Не благодарите.

Если вы обратите внимание на клавиатуру ADM-3A, то наверняка заметите отсутствие выделенных стрелок. Вместо них использовались клавиши "H", "J", "K" и "L", ныне хорошо знакомые любому вимеру, так как именно они используются для перемещения по тексту. Это ограничение и желание эффективно работать с текстами подтолкнуло Билла Джоя к созданию нескольких режимов работы с текстом: Command mode, Input mode и Last-line mode. Данные режимы и стали главной особенностью Vi и неотъемлемой частью философии всех его продолжателей.

Но не только клавиатурное ограничение повлияло на Vi. Билл в своем интервью журналу The Wired вспоминал, что пытался добиться комфортной работы в терминале, использующем модем со скоростью 300 бод (для простоты можно считать, что это 0.3 кбит/с). В результате у него таки получился довольно быстрый и отзывчивый.

It was really hard to do because you've got to remember that I was trying to make it usable over a 300 baud modem. That's also the reason you have all these funny commands. It just barely worked to use a screen editor over a modem.

И всё в том же интервью Билл как бы невзначай подкидывал дровишек в незатихающий пожар священной войны "Vim против Emacs":

The people doing Emacs were sitting in labs at MIT with what were essentially fibre-channel links to the host, in contemporary terms. They were working on a PDP-10, which was a huge machine by comparison, with infinitely fast screens.

Если с ограничениями по скорости и их влиянием на отзывчивость Vi всё более или менее понятно, то в чём суть режимов? В Vi/Vim нельзя просто взять и начать набирать текст, нужно переключиться в режим ввода текста, в котором в свою очередь нельзя просто так взять и "стрелочками" перемещаться по тексту, для этого нужно переключиться в командный режим. Звучит сложно, но такой подход позволил Биллу Джою добиться крайне эффективного редактирования текстов, используя одну лишь клавиатуру, да ещё и с ограниченным набором клавиш.

Работа с текстом в командном режиме позволяет не убирая рук с клавиатуры легко и быстро (именно так, не удивляйтесь) выполнять сложные операции над текстом. Хочется удалить текст в кавычках, не проблема, просто выполни набери последовательно di", нужно заменить слово под курсором, в чём вопрос, просто выполни ciw, и т. д. При этом все эти команды хорошо запоминаются и комбинируются. Например, di" значит delete in " , а ciwchange in word.

Хоть разделение на режимы и является, на мой взгляд, наиболее важной составляющей успеха Vi, но без расширяемости и плагинной системы, появившейся в Vim благодаря Брэму Мулинару, собственно и написавшему Vim, он бы далеко не уехал. Именно возможность "собрать" свой собственный редактор поверх крайне мощной концепции командного режима и закрепила успех этого семейства редакторов.

Забегая вперёд, стоит отметить, что пусть Vim Script и не был столь же мощным и удобным инструментом для расширения функциональности, как Emacs Lisp, но тем не менее он позволял писать плагины (очень много плагинов), позволявшие решить большую часть проблем. К слову, современная инкарнация Vim, Neovim, буквально в этом году начала полноценно поддерживать разработку плагинов на Lua, что безусловно очень хороший и правильный шаг в сторону упрощения их разработки!

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

Часто можно услышать от вимеров, что после Vim переходить на что-то ещё мучительно больно, если в этом "чём-то ещё" нет Vim-mode. Когда-то в очередной попытке объяснить "в чём же фишка" я понял, что отнять Vim или Vim-mode у вимера — это как отнять возможность вслепую набирать десятипальцевым методом у владеющего им человека. Писать код или тексты он сможет, но для него это будет крайне некомфортно из-за понимания, что можно делать это быстрее, без лишних отвлечений и переключений фокуса.

Emacs

Параллельно с Vi в 1976 году увидел свет и Emacs (тогда ещё не GNU). Он представлял из себя набор макросов для редактора TECO (a set of Editor MACroS), разработанных Дэвидом Муном и Гаем Стилом. То есть с самого начала концепция макросов в Emacs была основополагающей (не тех макросов, используемых в метапрограммировании на Lisp, а функций, расширяющих функциональность редактора). Как и в случае с Vi, некоторые особенности Emacs выросли из особенностей активно используемой разработчиками клавиатуры от Symbolics.

(С) Space-cadet keyboard by Retro-Computing Society of Rhode Island

Если вы знакомы с Emacs и его key bindings, то это фото клавиатуры сможет ответить на извечный вопрос "Почему в Emacs такое странное назначение hot keys по умолчанию? Это же неудобно!" — раньше клавиши Meta и Ctrl были не там, где они сейчас, отсюда и неудобство. Но если вы хотите разобраться в этом вопросе детальнее, то советую почитать статью от автора ErgoEmacs об истории Meta в Emacs, он провел более глубокий анализ и собрал много интересных фактов.

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

Когда спорят о том, что же лучше Vim или Emacs, часто главным камнем преткновения как раз выступают либо мнемонические команды в Vim, либо клавиатурные комбинации в Emacs. Ты можешь любить и понимать что-то одно, в то время как другое будет вызывать недоумение и раздражение. Я в свое время понял, что комбинационные ката в Emacs — не моё. И с радостью принял новость о появлении таких проектов, как Spacemacs и Doom — преднастроенных конфигов Emacs с отличной поддержкой Vim-mode.

И в продолжении проведения параллелей с Vim стоит отметить, что одни лишь необычные key bindings не могли бы сделать Emacs на столько популярным. Так в чём же его секрет?

Про Emacs часто шутят, что он является отличной операционной системой, которой не хватает хорошего текстового редактора (Emacs is a great operating system, lacking only a decent editor). В этой шутке, являющейся правдой лишь отчасти, и зарыт ответ на вопрос выше.

Дело в том, что когда Ричард Столлман написал GNU Emacs в 1984 году, он заменил Mocklisp, очень упрощенную реализацию Lisp, используемую для написания расширений в Emacs, на Emacs Lisp, уже полноценный Lisp, позволивший написать 70% всей функциональности GNU Emacs. И вот этот момент, как мне кажется, и стал ключевым. Он подарил миру программируемый редактор кода и по совместительству "операционную систему".

Под GNU Emacs начали писать большое количество расширений, среди которых были не только расширения, упрощающие работу с кодом, но и файловые менеджеры, почтовые клиенты, мессенджеры, в общем всё, что было необходимо для работы на компьютере вообще.

Сравнительная простота и выразительная мощь Emacs Lisp позволяла превратить Emacs в мультифункциональный комбайн, за пределы которого можно и не выходить, забыв о том, что за ним вообще есть какая-то операционная система. Не хватает чего-то для работы? Просто напиши это сам.

Вот пример очень простой функции, позволяющей вставить тэг <p> , выполнив команду M-x insert-p-tag, либо назначив на неё сочетание клавиш:

(defun insert-p-tag ()
  "Insert <p></p> at cursor point."
  (interactive)
  (insert "<p></p>")
  (backward-char 4))

При этом в Emacs Lisp есть неплохая стандартная библиотека, упрощающая работу с различными структурами данных и его собственными абстракциями — теми же фреймами, окнами, фрагментами текста, строками и т. д.

Как мне кажется, именно Emacs Lisp сыграл главную роль в популяризации Emacs, позволив ему дожить до сегодняшнего дня, и, как и в случае с Vim, Emacs сейчас практически ничем не уступает современным редакторам.

Но почему люди переходят на них сейчас?

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

Новое — это хорошо забытое старое

Дело в том, что сейчас нельзя считать, что тот же Vim или Emacs как-то сильно устарели. Все эти годы они развивались, выходили новые версии или даже взлетали новые форки, такие как Neovim. А с появлением LSP (Language Server Protocol) автодополнение и анализ кода стали практически везде одинаковыми, в то время как раньше они сильно уступали в Vim и Emacs своим аналогам в IDE. Теперь же в большинстве случаев используется не самописный тулинг, а непосредственно Language Server, поставляемый разработчиками языка программирования. То есть автодополнение для того же TypeScript и в VS Code, и в Vim будет практически одинаковым.

Соотвественно выбор "современный тулинг или продвинутая работа с текстом" в таком виде не стоит. Остаётся только определиться хочется ли проверять насколько глубока кроличья нора.

Забыть нельзя использовать

Современные редакторы и IDE как хорошее спортивное снаряжение от классного массового производителя, которое отлично подойдет для любых задач любому спортсмену. Зашел, купил, и ты уже можешь выступать на соревнованиях, ничем не уступая своим оппонентам. Но иногда спортсмены вместо покупки доступного и отличного снаряжения тратят кучу сил, времени и денег на создание или покупку снаряжения, сделанного на заказ. Зачем? Поможет ли им это? Кажется, что да, так как в случае индивидуального изготовления они могут расчитывать на то, что будут учтены все их особенности.

Так и с Vim и Emacs. Их конфиги постоянно дорабатываются при возникновении новых потребностей. Лишнее убирается, остаётся только самое необходимое. Все горячие клавиши затачиваются под нужды конкретного разработчика. В итоге получается редактор "индивидуального пошива".

Но и это не всё. Важно не забывать про особенности, о которых я писал выше. Если вы научились работать в рамках режимов Vim и вам близка эта философия, то именно в этом случае настроенный под вас редактор раскроется максимально полно! Вы будете получать удовольствие от работы, ловя себя на мысли, что редактора как бы и не существует вовсе, есть только вы и тот код или текст, над которым вы работаете. Как будто мысли сразу переносятся напрямую в файл, без посредника в виде редактора или IDE.

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

Есть ли что что-то подобное в других редакторах и IDE? Наверно, но я пока не встречал такого, а я регулярно специально пересаживаюсь с одного редактора/IDE на другой, чтобы просто не пропустить тот момент, когда выйдет что-то действительно стоящее, либо когда уже существующий продукт дойдет до этого состояния. Сейчас, например, очень хорошей альтернативой Vim для меня является VS Code. Но в нём, как и вдругих альтернативах, к сожалению, нет какой-то фишки, чего-то, что бы выделило его на фоне остального. Для меня сейчас это просто самый лучший "стандартный" редактор, хорошо выполняющий свою задачу, но, к сожалению, не имеющий "души".

Но значит ли это, что всем нужно бросать привычные редакторы и IDE и бежать на Vim или Emacs? Скорее нет, чем да. Дело в том, что и у Vim, и у Emacs довольно большой порог входа, и нужно быть готовым с нуля писать свой конфиг, шаг за шагом вникая в особенности этих инструментов. Так как брать готовые конфиги даже хуже, чем просто взять "массовый" продукт в лице VS Code — по сути вы будете пользоваться инструментом, созданным по чужим "меркам". Но если вы прониклись философией Vim или Emacs, и вы действительно хотите самостоятельно создать инструмент под ваши индивидуальные нужды, то я бы однозначно рекомендовал вам как минимум попробовать. Только учтите, что первый месяц нужно будет потерпеть.

Советовать вам чему отдать предпочтение, Vim или Emacs, я не буду. У каждого есть свои преимущества и недостатки, у каждого своя основная идея. Тут уже вам нужно будет почитать про оба редактора и понять, какой подход ближе лично вам. По моим ощущениям сейчас популярнее Vim (а если конкретнее то Neovim, который лично я бы и порекомендовал), но сиюминутная популярность для инструментов с полувековой историей особо ничего не значит, как мне кажется. Например, ниже я добавлю эпизод подкаста с Артёмом Малышевым, в котором я его спрашивал почему он выбрал Emacs. Можете послушать его мнение.

Итог

Надеюсь, мне удалось объяснить в чём суть Vim и Emacs и за что их любят. Понимаю, что на 100% раскрыть феномен их популярности у меня безусловно не получилось, так как у каждого будет своё видение, но здесь я, как минимум, постарался описать свою позицию.

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