Я со всей уверенностью могу заявить о том, что Vim позволил мне повысить эффективность в деле написания программ. Работать стало удобнее (ниже я расскажу об этом более подробно). Я никому не хочу навязывать Vim, но очень рекомендую освоить этот редактор всем, кто занимается программированием, работает в сфере Data Science, в общем — тем, кто так или иначе пишет и редактирует некий код.
Если вам очень хочется узнать о том, стоит ли вам использовать Vim, и о том, кто и для чего им реально пользуется — взгляните на этот материал (кстати, не позвольте его названию, «Не пользуйтесь Vim», ввести себя в заблуждение). Ещё можете посмотреть это видео, которое, кстати, подготовил сам Люк Смит.
А теперь, учитывая всё вышесказанное, предлагаю поговорить о том, что такое, на самом деле, Vim!
Что такое Vim?
Отвечая на этот вопрос, я хочу ещё раз повторить то, что было сказано в самом начале статьи: «Vim — это редактор, реализующий совершенно необычный подход к редактированию кода, не говоря уже о работе с простым текстом».
В Vim имеется несколько «режимов работы», переключение между ними приводит к изменению функционала клавиатурных клавиш (например, клавиша W в режиме вставки, что неудивительно, позволяет ввести букву w, а вот в нормальном режиме она позволяет перемещать курсор вперёд на одно слово). При таком подходе клавиатура используется и для ввода символов, и для перемещения по тексту. Другими словами — при работе в Vim не нужна мышь.
Это очень хорошо в тех случаях, когда нужно постоянно «переключаться» между редактированием и просмотром кода. Обычно программисты именно так и работают. Если вы раньше никогда не пользовались Vim для работы с программным кодом, то вы даже не замечаете того, как много времени тратится на то, чтобы снять руку с клавиатуры и потянуться к мыши (или к трекпаду), затем — на то, чтобы переместить курсор туда, куда нужно, и наконец на то, чтобы вернуть руку на клавиатуру и приступить к вводу текста (в общем — тратится очень много времени).
Конечно, на то, чтобы привыкнуть к Vim, нужно некоторое время. И это — не прямая замена какой-нибудь IDE или редактора вроде VS Code. Но можно сказать, что Vim позволяет тому, кто умеет им пользоваться, значительно ускорить работу с кодом. Кроме того, интересно то, что его более простым аналогом является Vi — стандартный текстовый редактор большинства Unix-подобных систем, работающий в терминале.
Как научиться работать в Vim?
?1. Используйте vimtutor
Меня не удивляет то, что в каждом руководстве по Vim рекомендуется начинать изучать этот текстовый редактор с
vimtutor
. Поэтому я, без зазрения совести, поступлю так же. Нет нужды играть ни в какие «Vim-игры» (хотя они и довольно интересны), или прибегать к программам, помогающим запоминать бесчисленные клавиатурные сокращения. Надо просто установить vimtutor
и, когда найдётся 10-15 минут свободного времени, прорабатывать этот официальный учебник по Vim. И не пытайтесь сразу же запомнить все клавиатурные сокращения Vim; вы запомните их постепенно, снова и снова проходя уроки vimtutor
.Хочу отметить, что Windows-пользователям я рекомендую использовать WSL (Windows Subsystem for Linux, подсистему Windows для Linux) и для прохождения
vimtutor
, и, в целом, для работы с Vim. Лично я в Windows с Vim не работал, поэтому не могу обещать того, что при работе с ним в этой ОС всё будет точно так же, как в Linux.?2. Постоянно пользуйтесь Vim
Практика — это путь к совершенству. Это — главный принцип, которого стоит придерживаться при изучении чего-то нового. Изучение Vim — не исключение. Поэтому, пока вы изучаете Vim с помощью
vimtutor
, пользуйтесь этим редактором для решения реальных задач.Используйте Vim как можно чаще. Нужно просмотреть текстовый файл? Запустите Vim. Хотите что-то по-быстрому изменить в Python-скрипте? Примените Vim. Делаете какие-то заметки? Делайте их с помощью Vim. В общем, полагаю, вы меня поняли. И каждый раз, когда работаете в Vim, всегда задавайтесь вопросом о том, какова наиболее эффективная последовательность нажатий на клавиши (то есть — наиболее короткая последовательность), позволяющая решить текущую задачу.
И попутно постарайтесь сократить использование мыши.
?3. Интегрируйте с Vim всё что сможете
Используйте клавиатурные привязки Vim везде, где это возможно. Начните делать всё, что сможете, «в стиле Vim». Например, если вы пользуетесь браузером, основанным на Chromium (Chrome, Brave, Edge), или браузером Firefox, подумайте об установке расширения Vimium, которое позволяет пользоваться в браузере клавиатурными сокращениями Vim, отвечающими за перемещение по документу (H, J, K, L и так далее).
Если вы пользуетесь для работы с кодом некоей IDE — найдите плагин или расширение для добавления Vim-привязок в соответствующую среду. Например, пользователи PyCharm (или любой IDE от JetBrains) могут воспользоваться ideavim. А пользователи VS Code (в 2021 году этот инструмент уже ближе к IDE, чем к обычным текстовым редакторам) могут прибегнуть к расширению VSCodeVim.
В Jupyterlab можно включить привязки Vim для встроенного текстового редактора путём установки jupyterlab-vim, что позволит полностью эмулировать Vim в ячейках блокнотов.
Постарайтесь органично интегрировать Vim в свою рабочую среду и несколько недель поработайте по-новому. Я могу говорить о том, что после нескольких VSCode-сессий в стиле Vim мне стало гораздо удобнее пользоваться этим редактором. А ещё — я очень рад избавлению от мыши!
?4. Перенастройте клавишу Caps Lock (но это необязательно)
Самая бесполезная клавиша, расположенная в самом лучшем месте клавиатуры. Именно так можно охарактеризовать клавишу Caps Lock. Поэтому советую превратить Caps Lock в Escape. Если вы интересуетесь Vim, то уже должны знать о том, что клавиша Escape используется в Vim для переключения режимов. Я очень советую тем, кто стремится к максимальной эффективности, воспользоваться вышеописанной модификацией.
Пользователи Windows и WSL могут использовать uncap — программу, которая превращает клавишу Caps Lock в Escape.
Пользователям macOS в плане переназначения клавиш повезло — они могут решить эту задачу, прибегнув к системным настройкам.
Если вы работаете в Linux — настроить всё как надо вам помогут StackOverflow и Google. Лично я (заслуженный пользователь Arch Linux) использую утилиту
setxkbmap
, с помощью которой делаю из Caps Lock ещё одну клавишу Escape. А потом включаю автозапуск утилиты при запуске системы:setxkbmap -option caps:escape
?5. Глубже изучите Vim
После того, как вы привыкнете к Vim и немного его освоите, придёт время для более глубокого освоения этого редактора ради дальнейшего повышения эффективности своего труда. Ниже я, основываясь на собственном опыте, привожу список самых полезных (и, пожалуй, уникальных для Vim) команд, применимых в нормальном режиме работы:
- ZZ — сохранить документ и выйти из Vim. Красивая команда.
- zz, zt, zb — прокрутка текста, перемещающая строку с курсором, соответственно, в центральную, в верхнюю или в нижнюю часть области просмотра.
- Ctrl+u, Ctrl+d — прокрутка области просмотра вверх или вниз на полстраницы.
- ciw — (Change Inside Word) удаление текущего слова и автоматический переход в режим вставки.
- C — удалить текст от позиции курсора до конца строки и перейти в режим вставки.
- dt<char> — (Delete To <character>) удалить текст от позиции курсора до следующего вхождения указанного символа.
- ~ — (тильда, на стандартной клавиатуре вводится клавишей, находящейся под Escape) переключение регистра (верхний/нижний) текущего или выделенного символа.
- . — (точка) повтор последней команды Vim.
- ggvG= — (перейти в начало файла, войти в визуальный режим, выделить весь текст до конца, выровнять выделенные строки) автоматическое выравнивание текста во всём файле.
Освоение подобного списка команд может показаться неподъёмной задачей. Но помните о том, что стоит стремиться к изучению нового через практику, а не через запоминание. Эти команды Vim, если взглянуть на них с другой точки зрения, показывают то, что этот редактор способен дать нам мощнейшие возможности, доступные без применения мыши или контекстных меню.
Если вас интересуют другие команды Vim — посмотрите это замечательное и довольно длительное видео, демонстрирующее прохождение уроков
vimtutor
, которое записал Вим Дизель (шучу — это всё тот же Люк). Тут собрано множество полезнейших советов по Vim.Итоги
Вероятно, сейчас вы уже достаточно хорошо освоили Vim и значительно повысили свою скорость работы с кодом. И вы наконец сможете похвастаться перед пользователями Reddit или перед коллегами своими отточенными навыками редактирования текстов, когда в ходе работы вам не приходится убирать руки с основной части клавиатуры. Когда вы достигнете подобного уровня, вы можете развиваться в сфере Vim и дальше. Например — в следующих направлениях:
- Можно установить Neovim и поэкспериментировать с ним (это — отрефакторенный форк Vim, рассчитанный на высокий уровень расширяемости и на поддержку графического интерфейса).
- Можно перенести функционал Vim в терминал или интерпретатор командной строки, воспользовавшись vim-airline.
Vim-airline, тема violet (источник)
- Можно попробовать некоторые из популярных Vim-плагинов.
Желаю всем, кто дочитал до этого места, наслаждаться будущим, наполненным благами Vim (и освободиться от власти мыши или трекпада).
Пользуетесь ли вы Vim?
polearnik
ПО сравнению с какой программой? nanо, блокнот? НЕ сказал бы что у меня есть проблемы с скоростью написания кода. скорее проблемы с скоростью понимания но скакать по вкладкак довольно удобно и мышкой. а клавиши Page Up Page Down помогают делать это быстро
vvpoloskin
Ну так тут и не утверждают, что у вас есть проблемы с написанием кода.
Написано же: ускорить работу с кодом.
warhamster
Как вим может хотя бы сравниться по скорости (я уж молчу о каком-то ускорении) в хотя бы такой банальной, но крайне нужной при чтении кода операции, как клик по имени функции/метода в идешечке?
vvpoloskin
Ну вы кликаете не мышкой, а комбинацией gd. Мышку при этом брать в руки не надо.
warhamster
Да, но сначала надо довести курсор до названия, а это уже чисто физически дольше. Есть, наверное, команда для поиска по названию, но если между курсором и нужным методом есть похожий текст — это поможет плохо.
А если надо в обратную сторону — какой будет вимовский аналог «show usages»?
artemisia_borealis
это довольно быстро. Слэш набираете и далее то, что ищете
/это_ищу
Если похожее, то жмёте «N».
А реальное преимущество перед мышью будет тогда, когда вы ищете то, что за пределом экрана.
DirectoriX
Ну прям как Ctrl+F, чудеса. Жаль, что vim найдёт аналогичные строки и, например, в комментариях. Или, например, если я хочу посмотреть все использования переменной i внутри цикла (и у меня есть другие циклы с такой же i) — vim будет искать аж по всему документу. Какая досада.
vvpoloskin
Ну хватит уже осуждать то, в чем не разобрались. В ВИМ полно вариантов для поиска внутри строки, файла, абзаца, фукнции и т.д.
DirectoriX
И в целом проекте (размазанном по куче файлов) он тоже ищет?
А если у меня одна переменная перекрывает область видимости другой — он тоже это корректно обработает?
vvpoloskin
Ну да. 7 лет назад я отлично изучал с помощью него кодовую базу django.
Допускаю, что не для всех языков, но на C и Python с парой дополнений это делалось.
fkthat
А зачем средствами редактора текста делать то, что является задачей IDE?
DirectoriX
Вот именно. Зачем вообще использовать vim для работы с кодом, когда это задача IDE? Конфиги — допустим, но код…
wigneddoom
А код это всегда 100500+ строк размазаных по сотням файлов?
DirectoriX
Не всегда 100500 строк в сотнях файлов, но зачастую хотя бы тысяча строк в десятке файлов.
wigneddoom
Ну мне повезло. Тысяча строк в десятке файлов меня не ставит в тупик.
IDE безусловно удобная вещь, это ещё не говоря о языках/платформах где без неё вообще не возможно что-то вразумительное сделать. Например, разработка под Андроид.
Честно, я не понимаю вашего негатива в сторону vim. Может всё-таки разрешите людям использовать удобные им инструменты?
P/S. Тут ещё emacs фанаты не набежали, они бы вам рассказали про правильное сочетание клавиш.
DirectoriX
Да редактируйте хоть sed'ом если вам так удобнее. Просто vim-фанаты обычно:
— Вот я попробовал vim и трава стала зеленее, а сахар — слаще. Короче, vim — лучше, чем любое другое средство редактирования, все переходите на него, карма очистится (даже на Хабре).
— Чем лучше-то?
— Чем другое средство редактирования.
wigneddoom
А, ну это уже классика. Переход с обсуждения инструмента на его фанатов.
DirectoriX
Не-не-не, вы прям сейчас посмотрите комментарии под этой статьёй (или любой другой про vim): все любители vim'а его прям боготворят, а как дело доходит до «всё равно лучше использовать IDE», так сразу «ничего не знаю, vim — это блокнот + схема управления». Потому что он и есть блокнот со своей схемой управления.
wigneddoom
Нет ну сравнивать vim и блокнот (я так понимаю классический notepad.exe) совсем странно. Vim вполне можно допилить с помощью плагинов до "почти" IDE. Тем более что сейчас существует LSP. Да и сочетания клавиш можно запилить любые. Есть даже извращенцы которые Emacs mode делают.
Vim корректнее было бы сравнивать с тем же Emacs, Sublime text (тоже кастати был очень популярным с армией фанатов), Notepad++ (на винду всегда ставлю).
ghrb
А кому нужен софт без сообщества? Один из базовых критериев при выборе инструмента это состояние сообщества.
vvpoloskin
Не умея использовать vim, не имея в нем опыта, преимущества не понять. Тут нет убер-фич. Но спустя некоторый продолжительный опыт работы с редактором ты понимаешь, что этот редактор по сути продолжение твоих мыслей. Ты интуитивно, рефлекторно набираешь текст, пальцы и текст за ними бегут быстрее твоих мыслей.
А скорость работы редактора и доступность его на любой железке уже идут как бонусом.
Но, безусловно, для этого нужен навык слепой печати.
Вы попробуйте годик поработать в нем, там поймёте.
Arenoros
это абсурд, это ты привык думать в контексте vim, а не он такой удобный. Я пользуюсь vim когда нужно что то совсем небольшое поправить на удалённой машине, для этих задач он неплохо подходит, но ни чем не лучше nano или mc для тех кто привык работать с ними.
Но автор заявляет что VIM магическим образом позволит очень сильно ускориться при работе с кодом после глубинного понимания этой «волшебной» утилиты. Но это полный и бездоказательный бред. Единственный обоснованный плюс vim это наличие данного редактора на 99% posix платформ.
И мне абсолютно не понятно зачем из буханки хлеба делать автобус, а потом ещё и учиться его водить.
bibiw_one
Наличие команд ускоряет работу с текстом
В нано нет команд
В вим есть
Банальный пример, получить буст в скорости работы можно, перейдя с нано на вим и зная только лишь, как работает команда delete. Ситуации, когда необходимо удалить большое количество строк в каком нибудь конфиге, возникают очень часто, и в nano вы 20 раз нажмете ctrl+k, а в vim — выполните простую d20d. Одна только эта мелочь может сэкономить десяток секунд жизни. Из таких мелочей и складывается магическое ускорение работы. Когда знаешь и применяешь кучу возможностей вим, это становится реально заметно
Danik-ik
Как-то странно Вы скорость сравниваете. Где оценка времени на ТОЧНЫЙ подсчёт строк, которые надо удалить? Если их штуки три, выгоды нет, если штук двадцать девять — уже надо точно знать, СКОЛЬКО. Ошибся на одну — и никакого тебе преимущества. В классическом же редакторе я выделю строки почти не глядя, за исключением крайних строк. И удалю скопом
Мне это напомнило анекдот, извините.
P.S. Я не против vim, честно. На днях по приколу часа два в нём просидел, работая над примерами кода, и даже не заплакал ни разу, почти понравилось. Раздражали только длительная (четыре клавиши, Карл! Esc, :, w, Enter) команда сохранения файла и отсутствие сохранения по потере фокуса. Автосохранение по таймеру не предлагать, укушу.
Но как длина полного тормозного пути зависит не только от эффективности тормоза, но и от скорости реакции водителя и скорости срабатывания тормозной системы, так и полное время исполнения функции редактирования зависит от времени, которое надо потратить на подготовку (в том числе расчёт аргументов, если их таки надо вводить)
unsignedchar
Я, например, очень плохо измеряю на глаз, 20 строк надо удалить или 21. У меня так:
d20d
#fuck
u
d19d
fkthat
v20jkd
а можно и просто по номерам строк сделать (нумерация-то, обычно, у всех всегда включена).Arenoros
1. есть 100 других способов это сделать, включая подключение по sftp и редактирование хоть в visual code
2. то что это ровно «20» срок совсем не очевидно, это ещё нужно напрячься посчитать
да и вообще для редактирования конфигов на сервере я сам всегда использую vim и не вижу тут смысла спорить так как ни одним другим редактором я и не пользуюсь для этих целей. Но речь идёт именно о редактировании кода на локальной машине.
shutkarmannbii
Простите что вклинился, но я у себя в нано выделяю область и только потом уже удаляю, можете мне подсказать что я делаю не так??
unsignedchar
Всё так. А если нужно выделить область между скобками (функцию в С/С++, массив, или кусок структурированных данных в пару мегабайт)?
shutkarmannbii
Не спорил с удобством вима или превосходством нано — просто был удивлен тому что надо нажимать 20 раз сочетание клавиш, вместо выделения области и удаления её
unsignedchar
В плюсах, когда базовый класс в одном файле, класс-наследник в другом — так и получается.
В обычном C, когда функция описана в одном файле, а используется в другом — тоже.
fkthat
Затем, что именно редактиировать код в Vim на порядки удобнее чем в "традиционном" редакторе. У меня просто под Visual Studio стоит плагин VimVs, а под VS Code стоит VSCodeVim, и я могу одновременно, не переключаясь использовать все преимущества и фичи и того и другого.
alsoijw
Ryav
Посоветуйте для python, пожалуйста. Нужны autosuggestions и справка, запуск и отладка внутри vim.
Edison
vim-lsp (или любой другой lsp клиент) — вот все что умеет lsp сервер, то будет и у вас, плюс сразу поддержка других языков. Go, C/C++, Rust, Python, etc.
Для деббага есть DAP — но еще сырое. Лично я больше на Go пишу и для деббага использую vim-delve.
Думаю для python тоже что-то есть.
chapuza
Смотря про какой язык речь. Тонны бойлерлейта Java/C# действительно, наверное, удобнее ворочать в IDE.
Навскидку во всех без исключения остальных языках — хорошим разработчикам IDE только мешает.
bibiw_one
А как вы сравниваете IDE и Vim? Можно пользоваться Vim для конфигов, и IDE с Vim плагином для кода, и использовать все плюшки мира)
rastaclaus
gr
wheercool
Есть такая вещь как easymotion и подобные, позволяют довольно удобно навигироваться по коду без мышки.
z0h3
Спуститься в реализацию метода, он же show usages, если используется в определении метода: gd
Обратно: Ctrl — o
warhamster
А как курсор-то поставить на нужное место? Двигать курсор — медленно, поиском — тот еще костыль.
z0h3
Можно по номеру строки:
:<номер строки>
но обычно в vim курсором перемещаются по файлу, поэтому проблемы, что курсор неизвестно где — не возникает, он уже итак где-то рядом с названием метода
unsignedchar
номер_строки g
;)
Ту же команду можно закодировать по разному. Забавно.
Arenoros
А когда есть 10 разных наследников на который из них оно меня приведёт? Или если нужно увидеть всех кто унаследовал этот класс? а какая команда развернёт C++ макрос? И самый главный вопрос дебажить код надо принтами или для реализации выпадающих списков при просмотре локальных переменных в точке останова тоже есть плагин?
Maccimo
И вы действительно кликаете?
В любой нормальной IDE для этого есть горячие клавиши. В IDE от JetBrains это
Ctrl-B
, например.warhamster
Повторюсь, а как довести курсор до нужного места? Вот я прямо уверен, что я быстрее кликну мышкой, даже с учетом переноса руки, чем адепт вима поставит курсор куда надо поиском. Особенно на более-менее обширной выборке случаев, когда между курсором и нужным вхождением будет еще пяток-другой слов с аналогичным началом.
Симулятор, что ли, запилить, чтобы показывал случайный кусок кода и мерял затраченное время…
fkthat
Кликни мышью на конец файла в полтыщи строк, а я посмотрю. И поприкалываюсь. Для упрощения задачи можешь даже заранее руку на мышь положить. :))
unsignedchar
Ухватить мышью прокрутку, потянуть вниз до конца экрана.
DirectoriX
Прокрутить полосу прокрутки в конец — 1 секунда. Кликнуть — ну, пусть ещё одна (хотя наверняка меньше). 2 секунды максимум. За две секунды vim-пользователь нажмёт свои 1-2-3 (или сколько там надо) клавиш и будет с пренебрежением смотреть на мышеюзера всё оставшееся время, аж целую секунду. О ужас. Секунду!
fkthat
Хорошо. Я проиграл.
warhamster
А как в виме выгляжит команда «перейти на вызов именно той функции, которая мне нужна, хоть я его еще даже не вижу на экране и про него вообще пока не знаю»? Это охренительно полезная штука, я ради нее одной готов ночами вим изучать.
unsignedchar
А как это выглядит в ${IDE}? Запишусь в очередь на изучение ;)
warhamster
Я это к тому, что пассаж про конец файла в полтыщи строк вообще непонятно о чём. Зачем может быть нужно кликать неизвестно куда? Если я хочу посмотреть функцию, значит, ее вызов уже есть на экране.
fkthat
Ёмоё. Я уже устал писать. Я почти все время работаю в Visual Studio с плагинонм VsVim. Если мне надо перейти на начало/конец файла, то я нажму
gg
илиG
, если мне надо вырезать или скопировать строковой литерал, то я нажмуdia
илиyia
, и т.п., если же мне надо перейти на определение/реализацию/использование метода, то я просто нажмуF12
, илиShift-F12
, илиCtrl-F12
(шорткаты Visual Studio), вот и все. Мне же в ответ все время пишут: "Если используешь vim, то значит отключайнахсовсем мышь и ***дуй в свой vim". Разговор с глухим.dblokhin
Find Usages в JetBrains. Очень полезная штука.
unsignedchar
Это везде есть.
«перейти на вызов именно той функции, которая мне нужна, хоть я его еще даже не вижу на экране и про него вообще пока не знаю» — это оно разве?
dblokhin
Перейти на вызов функции (а их может быть несколько), хоть он даже не видит его на экране и вообще про него не знает. Оно.
>> Это везде есть.
В vscode, помню, не нашел как ни старался.
unsignedchar
Значит не везде ;)
qtcreator, pycharm это тоже умеют.
vscode — тот ещё универсальный комбайн с кучей плугинов. Почти как vim :D
alklimenko
Ctrl-End почти везде работает
fkthat
Ты не поверишь, но в vim тоже.
alklimenko
Охотно верю, я к тому, что перейти в конец файла в любом редакторе займет столько же времени, как и в vim.
Я как-то пытался освоить vim, но для себя я решил, что он того не стоит. На его изучение нужно потратить довольно большое количество времени, а выгода непонятно когда наступит, учитывая что для большинства vim-овских команд в IDE (я сейчас, в основном, использую IDE от IntelliJ, но и в других будет +- также) есть свои аналоги — комбинации клавиш. И судя по всему, таких как я большинство.
Opensourcer
Действительно работает, но не на всех клавиатурах есть клавиша End. Мне например не очень комфортно печатать на большой клавиатуре, так что мне удобнее использовать Vim, в котором подобные клавиши чаще всего не требуются.
alklimenko
В этом случае можно часто используемым командам назначить комбинации из клавиш, которые есть на клавиатуре
fkthat
Что-нибудь типа
Ctrl-Alt-Shift+Shift+Space
fkthat
Да, действительно. Все ищу способ, как бы еще одну мышь подключить под вторую руку. И тогда вообще можно будет еще и код писать на экранной клавиатуре. :)))