Лучший опыт

VIM — это не только скорость.

Да, тратить несколько недель на то, чтобы выиграть несколько секунд, глупо, если бы дело было только в скорости. Одно из распространенных заблуждений, с которым мне приходилось сталкиваться, заключается в том, что единственная причина использовать Vim/NeoVim  —  возможность быстрее писать код. Как по мне, то довольно глупо тратить массу усилий на освоение Vim только ради этой одной выгоды. Но скорость  —  не единственная причина, по кото
VIM — это не только скорость...

Да, тратить несколько недель на то, чтобы выиграть несколько секунд, глупо, если бы дело было только в скорости.

Одно из распространенных заблуждений, с которым мне приходилось сталкиваться, заключается в том, что единственная причина использовать Vim/NeoVim  —  возможность быстрее писать код. Как по мне, то довольно глупо тратить массу усилий на освоение Vim только ради этой одной выгоды. Но скорость  —  не единственная причина, по которой мы изучаем Vim.

Мы делаем это, чтобы иметь возможность сказать: “Кстати, я использую Vim”.

Вот и все, ребята! Кстати, я использую Vim!

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

Дисклеймер

Прежде чем начать это исследование, должен объяснить, что мой первый опыт работы с Vim был таким же впечатляющим, как почти у всех остальных.

Сначала я случайно открыл его, набирая “git commit”, и совершил ошибку, забыв набрать “-m” и сообщение перед тем, как нажать Enter. Это привело к тому, что я закрыл терминал, как и следовало ожидать.

Спустя некоторое время из любопытства я решил проверить, что это такое, и изучить Vim хотя бы поверхностно. В результате перепробовал все возможные комбинации клавиш и произвел все мыслимые действия, которые только может выполнить редактор (за исключением таких базовых вещей, как написание “Hello World”).

Я: пытаюсь изучить Vim. Тоже я: понимаю, что символы не появляются после нажатия клавиш

Только спустя годы я наконец решил эффективно научиться использовать Vim-motions (сначала делал это с помощью расширения Vim от VS Code). В итоге присоединился к клубу тех, кто обожает инструмент, которым никто не пользуется. Рассказываю об этом в надежде донести до вас следующую мысль: вы не единственный, кто считает Vim бессмысленным, устаревшим и просто странным. Все так думают, пока не ознакомятся с Vim.

Что делает Vim потрясающим

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

Приведу свою любимую аналогию: вам нужно попасть из пункта А в пункт Б, выбрав один из двух путей. Первый похож на лабиринт, в котором повсюду толпятся люди, постоянно натыкаясь на вас, и в котором приходится делать выбор, понимая тупиковость многих решений. Другими словами, чтобы добраться до точки Б и не сбиться с пути, нужно сильно напрячься. Именно так я чувствую себя, используя современные IDE. Да, я могу добраться до точки Б и даже быстро доберусь туда, учитывая мой сегодняшний опыт, но это не будет приятным путешествием. Более того, оно окажется довольно утомительным, если придется идти этим путем постоянно и всегда в спешке.

Процесс моей навигации по IDE с помощью мыши, представленный Dall-E 3 (без помощи нейросети, создающей изображения по текстовому описанию, на написание этой статьи ушло бы достаточно много времени и сил)

Второй способ похож на прогулку по парку  —  вы можете отвлечься, если посмотрите по сторонам, но отвлекающие факторы часто приятны, и вы даже не заметите их присутствия, если будете сосредоточены. Именно так я чувствую себя в Vim-motions. Я отлично вижу пункт назначения и четкий путь к нему, и чем быстрее мне приходится идти, тем более приятным становится путешествие.

Приятное перемещение по коду на моей установке tmux + NeoVim, представленное Dall-E 3

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

Обратите внимание: я упомянул Vim-motions, а не Vim. Дело в том, что некоторые разработчики после использования Vim/NeoVim в течение какого-то времени возвращаются к редакторам вроде VS Code или IDE вроде JetBrains, но большинство все равно использует Vim-motions на них, просто потому что это лучше. Vim (и его интеллектуальный наследник NeoVim)  —  это редакторы командной строки, которые запускаются непосредственно в терминале. Способ навигации и редактирования текста в нем (называемый Vim-motions) настолько эффективен, что многие расширения и плагины эмулируют это поведение в других редакторах и даже IDE. Думаю, стоит сосредоточиться на Vim-motions, потому что именно в этом способе навигации и редактирования кроется основная ценность Vim.

Но ведь эти так называемые Vim-motions контринтуитивны. И вы утверждаете, что это лучшая фича в Vim?

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

Возьмем, к примеру, такой текстовый процессор, как Microsoft Word. В нем есть иконки, подсказывающие определенные действия. Так, кнопка подчеркивания  —  это U с подчеркиванием, а кнопка курсива  —  это I, написанная курсивом. Это значительно облегчает работу с программой новичкам, поскольку многие функции можно обнаружить путем нехитрого исследования. Однако, если вы пишете статью, вряд ли будет целесообразно нажимать эти иконки каждый раз, когда нужно что-то стилизовать  —  гораздо проще выучить такие сочетания клавиш, как Ctrl+U и Ctrl+I. Что делает Word удобным, так это то, что он ведет вас за руку, помогая выполнять все необходимое, пока вы не выучите продвинутые команды и не станете довольно эффективным специалистом.

С Vim все обстоит иначе… Это Dark Souls в мире текстовых редакторов, воплощение принципа “без боли  —  нет доли”. В случае с Vim вас ждет не кривая обучения, а гора обучения  —  причем за великой стеной, которую надо еще преодолеть. Но с другой стороны, начав взбираться на эту гору, вы поймете, что она дает вам такой уровень производительности, который невозможно получить от более простых в использовании инструментов. Способ редактирования в Vim гораздо интуитивнее традиционного. Главное  —  понять его механику.

Итак, вы признаете. что Vim не дружелюбен к новичкам, но хотите убедить в том, что он интуитивно понятен?

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

Возьмем, к примеру, удаление слова. На первом этапе изучения Vim вы узнаете, что можно удалить слово, подведя курсор к началу слова и нажав “dw”. Затем выясните, что “d”  —  это действие удаления, а “w”  —  перемещение (которое указывает, в какой части текста применить команду). Позже обнаружите, что с одной и той же командой удаления можно использовать и другие перемещения, например “d$”  —  для удаления до конца строки, а “dj”  —  для удаления текущей строки и одной выше (“j” по умолчанию перемещает курсор на строку ниже).

Может показаться, что для выполнения определенных действий придется запоминать множество специфических команд. Но это не так. Допустим, вам необходимо не удалить, а скопировать текст. Для этого нужно выучить всего одну команду “y” (yank  —  копировать). Зная уже “dw”, “d$” и “dj”, вы можете скопировать в конец слова, в конец строки или текущую строку плюс строку ниже, просто заменив d на y: “yw”, “y$”, “yj”  —  все это работает с ожидаемым эффектом.

Позже вы узнаете о более продвинутых перемещениях, использующих текстовые объекты, такие как “iw”, “ip” и “i)” (текст внутри слова, текст внутри абзаца и текст внутри скобок). Изучив только эти три новых перемещения, вы сможете как удалять, так и копировать весь текст внутри слова, абзаца и скобок, в которых находится курсор, даже если курсор находится в середине слова или абзаца или в любом месте между открывающей и закрывающей скобками, просто добавив к команде префикс d или y.

Допустим, вам нужно привести текст к нижнему регистру (записать строчными буквами), и вы обнаруживаете в интернете команду `gu`, которая позволяет это сделать. Можете использовать эту новую команду, немного изменив ее, с любыми перемещениями, которые изучили ранее  —  “guw”, “gu$”, “guj”, “guiw”, “guip” и “gui)”. Все эти команды работают именно так, как вы ожидаете. А использование `gU` вместо `gu` приведет к верхнему регистру.

Теперь предположим, что вы достаточно хорошо овладели Vim и хотите похвастаться своими познаниями. Можете установить плагин surround.vim от tpope и просто взрывать коллегам мозг такими вещами, как “ysip}” (“ys”  —  “вставить окружение”, “ip”  —  перемещение внутри скобок, которое мы рассмотрели выше, `}`  —  символ, который надо вставить вокруг текста).

Не переживайте, если приведенные примеры показались вам слишком сложными. Это действительно слишком большой объем для изучения за один раз. Идеальный способ овладеть Vim  —  выучить только основные команды, такие как “d”, “c” и “y”, и закрепить их сначала с помощью простых перемещений, таких как “w” и “e”. Затем, когда вы привыкнете к ним и доведете их использование до автоматизма, начнете привыкать к большему количеству перемещений. Самое приятное то, что каждая освоенная вами команда, пополняя ваш арсенал инструментов, будет применяться вместе с изученными ранее.

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

Но какое это все имеет отношение к потоку, о которым упоминалось выше?

Дело в том, что Vim-motions  —  это скорее язык, на котором вы говорите, чем набор сочетаний клавиш, которые вы используете. Чем больше вы говорите на этом языке, тем больше находите альтернативных способов сказать то же самое, чтобы выразиться более естественно.

Если вы изучаете португальский язык и захотите заказать бутылку воды в Бразилии, то, вероятно, сможете сказать что-то вроде “Por favor, você poderia me trazer uma garrafa de água?” (Не могли бы вы принести мне бутылку воды, пожалуйста?). Но, произнося эту фразу впервые, наверняка будете запинаться, вспоминая каждое слово.

Когда же вы лучше овладеете португальским языком, предложения типа “Eu gostaria de uma água sem gás” (Я бы хотел бутилированную воду) или “Me dá uma água sem gás, por favor” (Дайте мне бутилированную воду, пожалуйста) могут звучать более естественно и в принципе дадут тот же результат. А иногда вы услышите, как местные жители говорят что-то вроде “Uma água aqui, meu chapa” (Немного воды, приятель”), что может привести к тому же результату, но быстрее  —  в зависимости от интонации, контекста и языка тела. Точно так же использование чьей-то конфигурации Vim может показаться вам совершенно чуждым.

В этом и заключается прелесть Vim-motions: по мере использования некоторые команды и перемещения начинают выполняться автоматически, а затем вы начинаете находить новые способы более эффективно делать то, о чем думаете. И чем больше вы изучаете Vim, тем проще становится делать то, о чем думаете.

Кроме того, бытует следующее ошибочное мнение: то, что Vim позволяет писать быстрее, лучше бы делать с использованием таких вещей, как автозаполнение, инструменты рефакторинга, сниппеты и даже инструмент вроде Copilot, вместо того чтобы переходить на другой редактор. На самом деле вы можете (и, пожалуй, должны) использовать все это и в Vim (особенно в NeoVim). А большая часть прироста производительности при использовании Vim-motions связана не с написанием, а с редактированием.

Скопировать кусок кода, чтобы вставить его в другое место, изменить только параметр из списка параметров функции или даже полностью переписать содержимое функции  —  все это гораздо быстрее и удобнее делать в Vim, чем с помощью мыши. Кроме того, используя клавиатуру, можно держать руки на среднем ряду клавиатуры и сразу же переходить в “режим набора текста” (“typing mode”), в то время как при использовании мыши придется переставлять правую руку на клавиатуру для правильного набора текста.

Такие перемещения, как переход от режима набора текста (руки на среднем ряду клавиатуры) к навигации мышью (левая рука на клавиатуре, часто рядом с левым Ctrl, а правая  —  на мыши) и навигации клавиатурой (левая рука рядом с левым Ctrl, а правая  —  на клавишах со стрелками или навигационных клавишах типа Home и End), кажутся незначительными, когда вы сосредоточены на скорости. Но они складываются как когнитивные затраты на каждое ваше действие. Устранение этих мини-шагов может улучшить поток между ходом ваших мыслей и рабочим кодом в долгосрочной перспективе.

Итак, теперь вы хотите сказать, что VIM — единственный путь и все должны им следовать?

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

Для большинства разработчиков Vim-motions внутри любимого текстового редактора  —  идеальное решение, поскольку Vim-motions дает большую часть возможностей перехода на Vim, причем без особых проблем. А если захотите стать молниеносно быстрым, то уже будете знать большинство Vim-перемещений, так что переход на NeoVim будет намного проще.

Рекомендую всем разработчикам освоить Vim-motions в своем редакторе/IDE  —  хотя бы основы. Таким образом, вы сможете начать учиться использовать возможности Vim, не слишком тратясь на настройку того, что вам вряд ли понравится (хотя вам понравится, поверьте мне).