На энном году работы с использованием Clojure/Clojurescript в качестве основных языков разработки, я наконец-то дошел до стадии, когда «больше терперть уже нельзя», и написал таки свой плагин для этой цели. Это явилось результатом многолетних поисков, лишений и страданий. Как говаривал Мичурин: мы не можем ждать милостей от природы, взять их у нее – наша задача. Интересующихся прошу под кат.
Кому это вообще нужно?
Если взять статистику, то программистов, пишущих на Clojure, будет исчезающе малая часть на общем фоне. Если теперь из них мы возьмем тех, кто использует не емаксы-спейсмаксы, а VSCode, то это будет малый процент от и так небольшого количества потенциальной целевой аудитории. А если из оставшихся мы выберем тех, кого не устраивают существующие инструменты — тогда останусь, наверное, только я ) Но тем не менее, это не повод «ходить как все, по камушкам». С другой стороны, на этом примере можно продемонстрировать общий подход, так поэтично выраженный Мичуриным выше — не сокрушаться что все плохо, не ждать от разработчиков милостей и удовлетворения своих ожиданий, не упрашивать их и вообще не пребывать в заведомо проигрышной зависимой позиции, а сделать самому то, в чем испытываешь потребность. Так, как надо. Без фатального недостатка. И Clojure тут не имеет значения.
Позвольте рассказать вам, через что мне пришлось пройти, пока я не обрел спокойствие ) Несколько лет назад, когда я начинал работать на Clojure, я использовал Idea с плагином Cursive. Данный выбор был вызван в основном тем, что у меня уже был опыт использования этой ИДЕ. Плагин Cursive был форкнут одним предприимчивым парнем от бесплатного, но не поддерживающегося, и сделан платным. В принципе, жить было можно, закрывая глаза на тормоза Идеи и прочие мелкие неудобства. По крайней мере, это была полноценная GUI-based ИДЕ с кучей разных плюшек, дополняющихся плагином. Но вот бесплатный триал-период истек, и надо было или прикидываться новым пользователем (с новым имейлом и т.п.), или платить за лицензию. Не сказать, чтобы сумма была слишком большой, но к тому моменту я уже успел познакомиться с минусами использования продуктов, отличающихся от используемых остальной командой. Почти все мои коллеги работали на консольном spacemacs, делились конфигами и считали такой выбор наиболее удачным. Плюс некоторые ненастраиваемые правила форматирования кода в наших редакторах отличались, и я был вынужден специально отслеживать изменения по всему файла, чтобы в историю гита не попадали бессмысленные изменения формата.
В общем, я решился, и установил spacemacs. С вим-модом, да ) Точнее сказать, он у меня не установился без бубна, т.е. наша с ним взаимная нелюбовь возникла с самого начала знакомства. Позже я что только ни делал, чтобы превратить его в подобие нормального редактора — прикручивал скролл (хоть дерганный, но какой есть), писал конфиги, зарегистрировался в нескольких чатиках и мучал их участников вопросами, как сделать жизнь не такой болью ). Я не хочу здесь устраивать холивар с позиции неосилятора, я видел людей, успешно использующих емакс и вим, но я честно целый год пытался свыкнуться, притерпеться, ломать себя и надеяться, что может через какое-то время я привыкну… Не получилось. И снова начались поиски…
Я перепробовал множество редакторов, которые хоть как-то заявлялись для поддержки Clojure: Litetable, NightTable, SublimeText и еще сто всего. Какие-то из них производили откровенное впечатление студенческой поделки, без самых необходимых функций. Какие-то не устраивали по другим причинам. И в конце концов, я попробовал VSCode с плагином Calva (он тогда назывался по-другому, но впоследствии был переименован из-за конфликта названий с другим продуктом). Мне очень понравился как сам редактор, так и плагин. Стало снова можно комфортно жить, что я и делал до определенного момента. Но жизнь не стоит на месте, этот плагин победил в конкурсе на грант развития, были выделены средства, и автор стал его активно развивать. А мы, как пользователи, соответственно, поневоле тестировать и информировать о багах и сломанной логике работы. В какой-то момент был прикучен дебаггер, lsp и много чего еще (как в том анекдоте про теннисный корт и бассейн на борту нашего самолета, а сейчас со всей этой ерундой мы попробуем взлететь). Баги плагина вешали намертво не только VSCode а вообще весь пользовательский интерфейс, лечилось только перезагрузкой. При попытке открыть давнишний большой проект, чтобы просто посмотреть как сделан один момент в коде, запускалась индексация проекта для lsp, которая так же вешала весь интерфейс и могла длиться 15 минут. После получения подтверждения от разработчика, что это и есть генеральная стратегия развития, и бассейн с кортом отключить нельзя, я приуныл. Потому что получалось так, что я попробовал всё существующее, и не нашел для себя приемлемого варианта.
Тем не менее, сам VSCode мне нравился. Быстрый (особенно по сравнению с Идеей), гуишный (по сравнению со спейсмаксом) и вообще приятный во всех отношениях. И тогда я решил, что мои умозрительные планы по написанию собственного плагина пришла пора воплощать в реальность. Причем, поскольку я кложурист, то на Clojurescript (а не на JS или TS, как это обычно принято). Разумеется, пришлось раскурить апи VSCode и перепробовать достаточно много самых разных подходов (вплоть до поднятия собстенного сервера, обслуживающего плагин) и прочих вариантов, пока не выбрал наиболее оптимальные. Также пришлось покурить концепции терминала Linux и написать на Си специальную консольную утилиту, которая является частью плагина и пропускает через себя весь консольный ввод-вывод. В детальные технические подробности реализации вдаваться не буду, ниже дам ссылку на мой стрим на ютубе, где я рассказываю про некоторые сложности, встретившиеся на пути, и методы их решения.
Теперь у меня наконец-то есть рабочий инструмент, который меня полностью устраивает. Потому что когда возникает какая-то потребность, я его правлю, и он снова меня устраивает. И никаких зависимостей от сторонних разработчиков и фаз луны. Мне нравится мичуринский подход, причем, не только применительно к данному конкретному случаю, а и вообще. Рекомендую попробовать (подход, хотя и плагин тоже можете, если вдруг вы кложурист — на гитхабе есть уже готовый релиз, можно скачать и установить через VSIX).
Гитхап github.com/Ivana-/bb-clj
Ютуп www.youtube.com/watch?v=L35im_2hD1E
Автор: Андрей