🔥

Тред (Мышов Саша)


Сегодня будет тред про vim и консоль. Сразу хочу сказать, что у меня нет цели похоливорить и vim — это не идеальный редактор (но я его люблю). В первую очередь хочу поделиться своим опытом.

Очень интересно узнать предпочтения сообщества по поводу редакторов/IDE, но твиттер не позволяет делать голосование более чем из 4-ёх пунктов. Поэтому запустил голосование у себя в телеграм-канале — t.me/defront/406

У каждого своя история того, как он перешёл на Vim. Моё первое знакомство с ним было в 2005 году, когда установил Alt Linux с диска, который шёл с журналом Chip. В этом журнале был рейтинг редакторов и vim'у поставили 10 из 10 баллов.

Я его открыл, не читая манов, ничего не понял, не понял даже как выйти. Прибил его с помощью команды kill. Потом немного подучил команд и более менее понял как с ним работать. Но как-то не проникся его идеей и забросил на 8 лет.

Потом наткнулся на статью на хабре, где автор писал про то, как он настроил среду для разработки под ассемблер для 1806ВМ2 и почему выбрал vim habr.com/ru/post/195620/

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

У меня на работе в то время, намечалась задача по доработке большой кодовой базы на PL/SQL (это язык похожий на Pascal для разработки хранимых процедур Oracle). Удобных инструментов, для рефакторинга кода в разных пакетов не было.

Поэтому вдохновился статьёй и решил изучить vim. Нашёл очень клёвую книгу "Practical Vim Edit Text at the Speed of Thought", которая помогла понять философию редактора pragprog.com/book/dnvim/pra…

Нашёл очень мощный плагин для Oracle-разработки vorax. В нём было сделано очень много специфических вещей вплоть до автодополнения имён таблиц в sql-запросах. Но сейчас он больше не развивается github.com/talek/vorax4

Вот так выглядела моя среда разработки
notion image

Кроме разработки под Oracle я ещё занимался фронтендом — делал интерфейсы на ExtJS. И вот так решил юзать vim и для js.

Потом делал маленькие проекты на C, Haskell, ReasonML и тоже использовал для написания кода vim, так как я его уже знал и надо было просто найти подходящий плагин (но C очень хорошо поддерживается из коробки).

Потом в 2ГИСе юзал vim для разработки e2e-тестов на python. На тот момент работать с python было удобно, поддерживалось очень много фич + фичи из больших IDE — go to defenition. Но были и минусы — ощущались тормоза, так как vim до 8-ой версии работал в одном потоке.

Потом вышел многопточный NeoVim, вскоре после этого вышел многопоточный Vim 8 и один из самых недостатков редактора исчез.

Сейчас Vim поддерживает Language Server Protocol, поэтому можно без плясок с бубном, настроить фичи традиционных IDE: переименование методов, переход к определениям, умное автодополнение кода и т.п.

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

Но надеюсь и он скоро исчезнет — разработчики NeoVim работают над тем, чтобы добавить подсветку синтаксиса на базе AST. Это избавит от тормозов, при работе с очень большими файлами. github.com/neovim/neovim/…

Для парсинга исходного кода они используют систему инкрементального парсинга tree-sitter, которая используется Github'ом для подсветки синтаксиса файлов github.com/tree-sitter/tr…

В общем, не смотря на то что Vim'у уже очень много лет, идёт постоянная активная разработка. В первую очередь благодаря тому, что Vim сейчас очень сильно конкурирует c NeoVim и Oni, вокруг которых много хайпа в кругах вимеров.

@jsunderhood Как раз на больших файлах (нео)вим сияют по сравнению с вскод/вебшторм/атом/юнеймит. В своё время перебрался на вим именно из за нужды работы с крупными файлами которые в обычных редакторах открывались по 20 секунд - минуты, а в виме молниеносно.
Дополнение от пользователя NeoVim twitter.com/AntonK52/statu…

Вот известные программисты, которые используют Vim как основной инструмент для кодинга: Linus Torwalds (создатель Linux) Ryan Dahl (создатель Node.js) Larry Wall (создатель Perl) Paul Graham (основатель YCombinator) Jordan Walke (создатель React)

После того, как перешёл на Mac OS X, для постоянной работы стал использовать консольную версию vim, потому что он очень хорошо дружит с cli-инструментами. Например, мне очень удобно быстро переключаться из консоли в vim и обратно с помощью команд (Ctrl+Z) и fg.

Благодаря vim'у стал больше времени проводить в консоли и для меня сейчас самая удобная комбинация: vim + bash.

Для удобной работы с большим количеством shell'ов стал использовать терминальный мультиплексор tmux. С его помощью можно организовать некое подобие тайлового оконного менеджера, но в консоли.

Обычно моя рабочая среда выглядит примерно так
notion image

На скриншоте слева находится Vim с плагином NERDTree (для навигации по файловой системе). Справа находится обычная bash-сессия, где работает dev-сервер, под ним могу открыть третье окно для мок-сервера или прогона юнит-тестов. Цветовая схема Solarized Dark, шрифт Pragmata Pro.

Для бесшовного перехода между панелями tmux и панелями vim настроил горячие клавиши: Ctrl+H, Ctrl+J, Ctrl+K, Ctrl+L. Так как tmux хорошо интегрируется с iTerm, изменять размеры панелей можно с помощью мыши, но мне удобнее увеличивать и минимизировать панели с помощью Ctrl+B, Z

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

Начинаешь ловить фан от редактирования кода. Мне нравится вот это высказывание со Stack Overflow: "Editing text is like a game to me now. I actively enjoy it – which is pretty ridiculous, when you think about it." stackoverflow.com/questions/5970…

Для быстрого поиска по файлам использую silversearcher (github.com/ggreer/the_sil…), ещё слышал очень хорошие отзывы про ripgrep и fzf, но пока не пробовал их использовать.

Если работаю на сервере, то для поиска по содержимому файлов использую обычный grep (grep "something" -ri .), для поиска файлов и на ноуте и на сервере использую find (find . -iname 'something').

Я не считаю себя спецом по консоли, но мне удобнее с ней работать по сравнению с GUI. Мой топ самых полезных команд: find, grep, fg, jobs, history, ls, cat, rm, mv, cd, mkdir, pwd, ls, du, xargs, less, touch, echo, ps, kill, killall, clear, sudo, tar, top, tail, man.

Если открываю новую сессию, то для старта tmux'а с настроенными окнами и панелями использую специальный скрипт gist.github.com/myshov/1564474…

Можно организовать среду с быстрым фидбеком (playground). В левой панели tmux открыть vim somefile.js, в правой nodemon somefile.js, nodemon будет перезапускать файл при каждом изменении
notion image

На небольшом экране ноута удобно использовать возможности macOS для разбиения экрана на панели. На скриншоте слева tmux с увеличенной панелью vim'а, справа результат выполнения кода в браузере. Этот трюк можно использовать и с другими редакторами.
notion image

Эта фича в macOS называется "Split View" (support.apple.com/en-us/HT204948). Скорее всего что-то подобное есть в Windows и оконных менеджерах Linux.

Для vim есть много плагинов, но я предпочитаю изучать нативные возможности редактора, они могут покрыть многие плагины. Плюс из-за большого количества включённых плагинов vim будет запускаться дольше и притормаживать, если используются неоптимизированные плагины.

Тем не менее совсем без плагинов пока не могу обойтись. Вот мой текущий список github.com/myshov/dotfile…

Кстати ссылка из предыдущего твита, это кусок моих dotfiles — скриптов для быстрого разворачивания окружения. Вот тут можно прочитать про них подробнее medium.com/@webprolific/g…

У вим богатая история. Про него я как-то готовил доклад для внутреннего митапа 2GIS myshov.github.io/story_of_vim/

Vim'у и его экосистеме посвящена международная конференция vimconf.org. Проводятся митапы в разных уголках мира.

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

Для изучения Vim'а могу порекомендовать начать с команды редактора :vimtutor (встроен в vim), книгу "Edit Text at the Speed of Thought" (pragprog.com/book/dnvim/pra…), игру, которая учит командам vim'а (vim-adventures.com).

И очень рекомендую посмотреть серию скринкастов Дерека Уайата (derekwyatt.org/vim/tutorials/). Особенно самое первое видео, где он объясняет пользу работы с клавиатуры :) vimeo.com/6999927

На этом хочу тред закончить. Happy Vimming!