Vim повсюду: IDE, браузер и shell

Рейтинг: 60.1% · 14 голосов
Исчерпывающий курс по Vim и Neovim: модальное редактирование и грамматика (операторы, движения, текстовые объекты, точка-команда), регистры, метки, макросы, поиск и :substitute, :global, буферы/окна/quickfix, визуальный режим, конфигурация на Lua, маппинги, плагины (lazy.nvim), LSP, автодополнение (blink.cmp), Treesitter, fuzzy-поиск, Git, эргономика и антипаттерны. 34 главы, актуально на 2026 (Vim 9.1, Neovim 0.11/0.12).
Ответить
Аватара пользователя
Roman_Vim
Сообщения: 34
Зарегистрирован: 11 май 2026, 05:31

Vim повсюду: IDE, браузер и shell

Сообщение Roman_Vim »

Оглавление курса (34)
  1. Философия Vim: модальное редактирование и почему это актуально в 2026
  2. Установка и выживание: первый запуск, режимы, как выйти
  3. Перемещение по тексту: движения как основа эффективности
  4. Базовое редактирование: вставка, удаление, копирование
  5. Грамматика Vim: операторы + движения = команды
  6. Текстовые объекты: оперируем структурой, а не символами
  7. Точка-команда и повторяемость: "один штрих, чтобы повторить"
  8. Регистры: продвинутая работа с буфером обмена
  9. Метки и прыжки: навигация по истории перемещений
  10. Поиск: /, ?, *, # и магия паттернов
  11. Замена :substitute и регулярные выражения Vim
  12. Команда :global - оружие массового редактирования
  13. Буферы, окна и вкладки: организация рабочего пространства
  14. Quickfix и location list: пакетная работа по всему проекту
  15. Навигация по файлам: netrw, fuzzy-поиск и проекты
  16. Макросы: автоматизация повторяющихся правок
  17. Визуальный режим и блочное редактирование
  18. Трюки режима вставки
  19. Свёртки, автодополнение и аббревиатуры (встроенные)
  20. Конфигурация с нуля: init.lua и разумные дефолты 2026
  21. Маппинги: leader, which-key и здравые привычки
  22. Скриптинг: основы Vimscript и Lua для Neovim
  23. Менеджеры плагинов: lazy.nvim и lazy-loading
  24. Neovim в 2026: чем отличается и почему выбирают
  25. LSP в Neovim: умные возможности языка
  26. Автодополнение 2026: blink.cmp против nvim-cmp
  27. Treesitter: точная подсветка и структурное редактирование
  28. Fuzzy-поиск: Telescope, fzf-lua и snacks.picker
  29. Git внутри редактора: fugitive, gitsigns и lazygit
  30. Дистрибутивы, отладка и терминал: быстрый старт и интеграции
  31. Vim повсюду: IDE, браузер и shell (вы здесь)
  32. Эргономика и антипаттерны: как не навредить себе и не застрять
  33. Рабочие рецепты, тренажёры и план обучения
  34. Шпаргалка-справочник: все ключевые команды одним списком
Часть VII. Мастерство
Зачем это нужно

Представьте, что вы вложили десятки часов в отработку модального редактирования: ciw, dap, f + ;, макросы, текстовые объекты. А потом открываете браузер, чтобы прочитать документацию, и ваши руки тянутся к стрелочкам и мыши. Открываете командную строку и снова печатаете строку линейно, как в блокноте. Открываете JetBrains-IDE на работе, где "так положено", и теряете половину своей продуктивности.

Главная идея этой главы: навык модального редактирования стоит дороже, если он работает везде. Мускульная память не делится на "редактор" и "не редактор" - она просто срабатывает или нет. Каждый инструмент, где доступен Vim-режим (а таких большинство), это не отдельная конфигурация, которую нужно осваивать заново, а ещё одна площадка, закрепляющая один и тот же словарь движений. Тренажёры (vim-be-good, VimGolf - подробнее в главе 33) полезны, но самое мощное упражнение - это просто прожить весь день в hjkl, не делая исключений для терминала и браузера.

Цель главы - показать, как развернуть Vim-режим в четырёх средах: IDE (JetBrains и VSCode), браузере, shell и утилитах командной строки (less, man, k9s, lazygit). И, что важнее, объяснить где у каждой реализации граница, чтобы вы не воевали с инструментом, требуя от него того, чего он не умеет.

Принцип: один набор движений везде

Прежде чем настраивать конкретные инструменты, зафиксируем философию.

Переносится грамматика, а не конфиг. Самое ценное, что вы переносите между средами, - это базовый слой: движения (w, b, e, f, t, 0, $, gg, G), операторы (d, c, y), текстовые объекты (iw, ip, i(, it), счётчики (3w, d2j) и точка-команда .. Эти вещи реализованы практически в любом Vim-эмуляторе. А вот продвинутые фичи - :global, :normal, Ex-команды, плагины normal-режима, persistent undo - поддерживаются неравномерно или не поддерживаются вовсе.

Разделение труда. Хорошая стратегия в любой IDE: оставить родному инструменту то, что он делает лучше (рефакторинг, навигацию по символам, отладку, ресайз панелей, систему контроля версий), а Vim-режим использовать для того, в чём он силён, - точечное редактирование текста, поиск, повторяемость. Попытка заставить IDE-Vim делать Ctrl-W менеджмент окон вместо родных шорткатов IDE - путь к фрустрации.

Единый leader и единые маппинги. Если вы используете <Space> как leader в Neovim, имеет смысл задать тот же leader и набор базовых маппингов в .ideavimrc. Чем меньше расхождений между средами, тем крепче привычка. Полное единообразие недостижимо (об этом ниже), но к нему стоит стремиться.

IdeaVim в JetBrains

IdeaVim - официальный плагин-эмулятор Vim для IDE на платформе IntelliJ (IntelliJ IDEA, PyCharm, WebStorm, GoLand, RubyMine, CLion и др.). Это не "лёгкая имитация", а довольно полная реализация normal/visual/insert-режимов, текстовых объектов, регистров, макросов, marks и даже части Ex-команд. В 2025 году JetBrains запустила для IdeaVim программу вознаграждений за вклад, и плагин активно развивается.
Про Fleet: редактор Fleet от JetBrains (публично доступен с 2023-2024 гг.) НЕ использует плагин IdeaVim. У него собственный встроенный Vim-режим на отдельном движке. Поэтому конфиг .ideavimrc и приём :action ниже относятся к IDE на платформе IntelliJ, но не к Fleet.
Файл .ideavimrc

IdeaVim читает конфигурацию из ~/.ideavimrc (по аналогии с ~/.vimrc). Синтаксис - Vimscript. Можно даже подключить существующий ~/.vimrc, чтобы переиспользовать привычные маппинги:

Код: Выделить всё

" ~/.ideavimrc

" Переиспользуем общий конфиг, если он совместим
source ~/.vimrc

" Базовые опции
set scrolloff=8
set incsearch
set ignorecase
set smartcase
set clipboard+=unnamed
set whichwrap=b,s,<,>,h,l,[,]

" Тот же leader, что и в Neovim
let mapleader = " "

" Включаем эмуляцию популярных плагинов
set surround
set commentary
set easymotion
set highlightedyank
set NERDTree
Ключевая особенность: IdeaVim умеет эмулировать ряд популярных плагинов через set <имя>. Это встроенные имитации vim-surround, vim-commentary, vim-easymotion (для прыжков по экрану), vim-highlightedyank и других. Внешние Vim-плагины ставить нельзя - только то, что поддержано самим IdeaVim.

Мост к командам IDE: :action и <Action>

Самая мощная возможность IdeaVim - вызывать любое действие IDE по его идентификатору. Это позволяет повесить родные функции JetBrains (рефакторинг, навигацию, git) на удобные leader-маппинги в Vim-стиле:

Код: Выделить всё

" Навигация и рефакторинг через действия IDE
nnoremap <leader>rn :action RenameElement<CR>
nnoremap <leader>ca :action ShowIntentionActions<CR>
nnoremap gd :action GotoDeclaration<CR>
nnoremap gr :action FindUsages<CR>
nnoremap <leader>ff :action GotoFile<CR>
nnoremap <leader>fg :action FindInPath<CR>
nnoremap [d :action GotoPreviousError<CR>
nnoremap ]d :action GotoNextError<CR>

" Современный синтаксис через <Action> работает и в map-выражениях
nmap <leader>b <Action>(ToggleLineBreakpoint)
Идентификатор действия можно узнать командой :actionlist (с фильтром по подстроке) или через Help -> Find Action в самой IDE. Этот приём - главный способ примирить Vim-грамматику с богатством IDE: движения остаются Vim-ными, а "умные" операции делегируются JetBrains.

Конфликты с системными шорткатами IDE: handlers

На практике самая частая боль - конфликт Vim-биндингов с родными Ctrl-шорткатами JetBrains. Например, Ctrl-V в Vim - визуальный блок, а в IDE - вставка из буфера; Ctrl-R в Vim - redo, в IDE - Run; Ctrl-W в Vim - окна, в IDE - расширение выделения. IdeaVim решает это через sethandler: для каждого сочетания можно указать, кто его получает - Vim (a/i/n/v), IDE (ide) или оба.

Код: Выделить всё

" sethandler <клавиша> [режим]:обработчик
" a:vim - отдать Vim во всех режимах; ide - отдать IDE
sethandler <C-V> n-v:vim i:ide      " блок-визуал в normal/visual, вставка в insert
sethandler <C-R> n:ide              " отдать Ctrl-R под Run в IDE
sethandler <C-C> a:ide              " копирование IDE всегда
Если конкретное сочетание нужно целиком оставить за IDE, помогают списки keymodel/<Action>-маппинги или прямое отключение клавиши через sethandler ... a:ide. А чтобы временно выключить эмуляцию Vim в активном редакторе целиком (когда хочется "как обычно"), используйте действие IDE :action VimPluginToggle либо иконку IdeaVim в статус-баре - это удобно повесить на маппинг:

Код: Выделить всё

nnoremap <leader>vv :action VimPluginToggle<CR>
В отдельных контекстах (например, окна инструментов, поля ввода, дифф-вьюеры) эмуляция и так не активна - Vim-режим работает только в редакторе кода.

Что НЕ стоит ждать от IdeaVim
  • Полноценного :global и :normal в произвольной форме (часть Ex-команд работает, но не вся экосистема).
  • Управления сплитами через Ctrl-W - используйте родные шорткаты IDE для разделения и навигации по окнам.
  • Внешних normal-режимных плагинов (fugitive, telescope и т.п.) - их роль закрывают встроенные функции IDE через :action.
VSCode: Neovim-бэкенд против VSCodeVim

В VSCode есть два принципиально разных подхода к Vim-режиму, и выбор между ними - это выбор между "лёгкой эмуляцией" и "настоящим Vim".

VSCodeVim - эмуляция

VSCodeVim (расширение vscodevim.vim) - самое популярное и простое решение. Оно эмулирует Vim на TypeScript: реализует normal/visual/insert-режимы, текстовые объекты, многие операторы. Опции задаются не в vimrc, а в settings.json VSCode:

Код: Выделить всё

{
  "vim.leader": "<space>",
  "vim.useSystemClipboard": true,
  "vim.hlsearch": true,
  "vim.incsearch": true,
  "vim.easymotion": true,
  "vim.sneak": true,
  "vim.normalModeKeyBindingsNonRecursive": [
    { "before": ["<leader>", "f", "f"], "commands": ["workbench.action.quickOpen"] },
    { "before": ["g", "d"], "commands": ["editor.action.revealDefinition"] }
  ]
}
Поддержка ~/.vimrc в VSCodeVim - экспериментальная и охватывает только маппинги, не опции. Поэтому маппинги к командам VSCode описывают прямо в settings.json через массивы normalModeKeyBindings*. VSCodeVim хорош, если вам не нужны Ex-команды и сложная семантика Vim - он лёгкий и работает "из коробки".

VSCode Neovim - настоящий бэкенд

vscode-neovim (расширение asvetliakov.vscode-neovim) идёт принципиально иначе: оно встраивает реальный процесс Neovim в качестве бэкенда. Normal-режимные нажатия обрабатывает не эмулятор, а настоящий Neovim. Это значит, что вам доступны:
  • :global, :vglobal, :normal, :substitute с полной семантикой - то, чего нет в эмуляторах;
  • макросы и регистры точно как в Neovim;
  • normal-режимные плагины (например, vim-surround, targets.vim, плагины текстовых объектов), подключённые через ваш init.lua;
  • ваша собственная конфигурация Neovim, в том числе keymaps normal-режима.
При этом insert-режим, подсветка, автодополнение и LSP остаются за VSCode - Neovim управляет буфером и normal/visual-логикой, а VSCode рисует. Это разделение даёт лучшее из двух миров: семантику Vim и UI VSCode.

Код: Выделить всё

Критерий                 |  VSCodeVim               |  VSCode Neovim
-------------------------+--------------------------+-----------------------------------
Движок                   |  эмуляция на TS          |  реальный Neovim-процесс
:global / :normal        |  нет/частично            |  да
Normal-режимные плагины  |  нет                     |  да (через init.lua)
Конфигурация             |  settings.json           |  init.lua + settings.json
Порог входа              |  низкий                  |  выше (нужен установленный Neovim)
Кому                     |  нужен лёгкий Vim-режим  |  нужна полная семантика Vim
Практический вывод: если вы уже живёте в Neovim и хотите ту же мощь внутри VSCode - берите vscode-neovim. Если нужен просто "Vim-режим, чтобы не тянуться к мыши" - VSCodeVim проще.

Vim в браузере: Vimium и Tridactyl

Браузер - это место, где средний разработчик проводит уйму времени: документация, code review, поиск. Перенести сюда Vim-навигацию - значит закрепить мускульную память там, где раньше господствовала мышь.

Vimium (Chrome/Firefox)

Vimium - самое популярное расширение, добавляющее Vim-навигацию на любую страницу. Ключевая механика - link hints: нажимаете f, и поверх всех кликабельных элементов появляются буквенные метки; набираете метку - переходите по ссылке без мыши.

Код: Выделить всё

Клавиша  |  Действие
---------+-------------------------------------------------------
j / k    |  скролл вниз / вверх
h / l    |  скролл влево / вправо
gg / G   |  в начало / конец страницы
d / u    |  полэкрана вниз / вверх
f        |  подсветить ссылки метками (открыть в текущей вкладке)
F        |  то же, но открыть в новой вкладке
o        |  omnibar: открыть URL/историю/закладки
J / K    |  предыдущая / следующая вкладка
x        |  закрыть вкладку
H / L    |  назад / вперёд по истории
/        |  поиск по странице, n/N - следующее/предыдущее
i        |  insert-режим (передать ввод странице)
<Esc>    |  выйти из insert-режима / снять фокус
Обратите внимание: словарь практически идентичен Vim. j/k, gg/G, d/u, /, n/N работают одинаково. Это и есть перенос мускульной памяти в чистом виде.

Tridactyl (Firefox)

Tridactyl - более мощная альтернатива для Firefox, ближе по духу к легендарному Vimperator. Помимо link hints и hjkl-скролла, он поддерживает Ex-подобную командную строку (:), собственный конфиг с bind-командами, и - главная фишка - режим редактирования текстовых полей во внешнем Vim/Neovim: нажимаете Ctrl-I в <textarea> и правите содержимое в настоящем редакторе, после :wq текст возвращается в поле. Для тех, кто пишет длинные комментарии и посты, это снимает главное ограничение браузерного Vim-режима - слабый встроенный редактор полей.

Границы браузерного Vim-режима

Расширение - это всё-таки контент-скрипт, инжектируемый в страницу, и у него есть жёсткие пределы:
  • Привилегированные страницы. Vimium (как и любое расширение под Manifest V3) НЕ работает на служебных страницах браузера: chrome://, chrome-extension://, страница Web Store, about: в Firefox, страница новой вкладки в некоторых сборках. Там контент-скрипты запрещены политикой браузера - f, j/k просто не сработают, и это не баг настройки. Аналогично расширение часто слепо на PDF-вьюере и на страницах внутри кросс-доменных iframe.
  • Manifest V3. Переход Chrome на MV3 ужесточил модель расширений (service worker вместо фоновой страницы, ограничения на инжекцию) - на функциональность Vimium это в целом не повлияло, но усилило именно запрет на привилегированных страницах.
  • Safari и браузеры без полноценного Vim-расширения. В Safari нет аналога уровня Vimium/Tridactyl (доступны лишь ограниченные расширения), поэтому полноценный Vim-режим там собрать не получится - это типичная граница, о которой стоит знать заранее, прежде чем пытаться "жить в hjkl" в любом браузере.
Vi-режим в shell

Командная строка - это тоже текст, который вы редактируете. По умолчанию bash и zsh работают в Emacs-режиме редактирования строки. Переключение в vi-режим переносит туда привычные движения.

bash и readline

bash использует библиотеку readline. Включить vi-режим можно на сессию:

Код: Выделить всё

set -o vi
Или навсегда - в ~/.inputrc (конфиг readline, который читают все программы, использующие эту библиотеку):

Код: Выделить всё

# ~/.inputrc
set editing-mode vi
set show-mode-in-prompt on
set vi-ins-mode-string \1\e[6 q\2
set vi-cmd-mode-string \1\e[2 q\2
show-mode-in-prompt показывает текущий режим, а vi-ins-mode-string/vi-cmd-mode-string меняют форму курсора (тонкая черта в insert, блок в normal) - критично важная подсказка, потому что в shell нет статусной строки. Поскольку ~/.inputrc читается всеми readline-программами (включая python REPL, psql, mysql, gdb и многие другие), одна настройка включает vi-режим сразу везде.

В readline-vi после <Esc> (переход в command-режим) работают h/l, w/b/e, 0/$, f/F/t/T, dw, cw, d$, cc, r, x, p, а также //? для поиска по истории команд и k/j для перебора истории.

zsh

zsh не использует readline, у него собственный line editor (ZLE), поэтому ~/.inputrc на него не влияет. Включается vi-режим в ~/.zshrc:

Код: Выделить всё

bindkey -v
# Уменьшаем задержку перехода в normal-режим (по умолчанию 0.4с)
export KEYTIMEOUT=1
KEYTIMEOUT=1 (в сотых долях секунды) убирает раздражающую паузу после <Esc>. В zsh можно навешивать собственные bindkey-маппинги для каждого режима (vicmd - command-режим, viins - insert), например, вернуть Ctrl-R для fuzzy-поиска по истории:

Код: Выделить всё

bindkey -M vicmd '/' history-incremental-search-backward
bindkey -M viins '^R' history-incremental-search-backward
Полезная привычка: повесить v в command-режиме на открытие текущей команды в полноценном $EDITOR (это поведение есть и в bash через edit-and-execute-command, обычно на v после загрузки модуля edit-command-line в zsh):

Код: Выделить всё

# zsh
autoload -Uz edit-command-line
zle -N edit-command-line
bindkey -M vicmd 'v' edit-command-line
Теперь длинную команду можно отредактировать в Neovim со всей его мощью, а по выходу она исполнится.

Природа задержки Esc и распознавание escape-последовательностей

Пауза после Esc - не каприз zsh, а фундаментальная проблема терминала. В терминале клавиша Esc физически шлёт байт 0x1B - и ровно с него же начинаются escape-последовательности стрелок, F-клавиш, Home/End (например, Up это ESC [ A). Получив ESC, line editor не знает сразу: это одиночный Esc (выйти в command-режим) или начало многобайтовой последовательности. Поэтому он ждёт небольшой таймаут - придут ли следующие байты.
  • zsh: таймаут регулируется KEYTIMEOUT (в сотых долях секунды). KEYTIMEOUT=1 делает переход почти мгновенным, но слишком малое значение может "разорвать" медленные последовательности по SSH с высокой задержкой.
  • bash/readline: аналог - keyseq-timeout (в миллисекундах) в ~/.inputrc:

Код: Выделить всё

  # ~/.inputrc - ускорить распознавание одиночного Esc
  set keyseq-timeout 25
Поведение зависит от терминала и канала: по медленному SSH или в некоторых эмуляторах слишком агрессивный таймаут ломает стрелки и функциональные клавиши. Если после ускорения Esc стрелки в shell начали "глючить" - поднимите значение. Многие предпочитают вообще не трогать таймаут, а перейти в command-режим альтернативной клавишей, не страдающей от неоднозначности (часто на это вешают jk или Ctrl-[, который и так равен Esc, но без ожидания у некоторых конфигураций).

Vim-навигация в утилитах командной строки

Многие TUI-инструменты по умолчанию понимают Vim-движения, потому что их авторы - те же люди, что живут в Vim. Это значит, что вам не нужно ничего настраивать - навык работает сам.

Код: Выделить всё

Инструмент          |  Что работает "из коробки"
--------------------+-----------------------------------------------------------
less                |  j/k, d/u, gg/G (через g/G), /+n/N, ?, q
man                 |  использует less как pager - те же клавиши
git log / git diff  |  по умолчанию через less - те же клавиши
k9s                 |  j/k навигация, / фильтр, : команды-ресурсы, gg/G
lazygit             |  h/j/k/l между панелями и по спискам, / поиск
fzf                 |  поддерживает --bind для vi-стиля; Ctrl-J/Ctrl-K навигация
tig                 |  j/k, /, gg/G - Vim-словарь по умолчанию
htop / btop         |  частично (btop поддерживает vim-keys опцией)
Jupyter             |  есть vi-mode для редактирования ячеек
Маленький, но показательный факт: команда man показывает страницы через less, поэтому /pattern + n для поиска внутри man-страницы - это ровно тот же поиск, что и в Vim. Вы уже умеете читать документацию по-Vim-ному, даже если не знали об этом.

Для less стоит запомнить: g - в начало (вместо gg, хотя gg тоже сработает), G - в конец, &pattern - показать только совпадающие строки (аналог фильтрации), F - режим "следования" как tail -f. Прокрутка d/u - это пол-окна (half-window) по умолчанию, но величина настраивается (передать число перед d/u задаёт новый шаг).

Практические примеры

Пример 1. Редактирование длинной команды в shell (zsh, vi-mode).

Код: Выделить всё

Было (в командной строке):
  docker run --rm -it -v $(pwd):/app -w /app -e NODE_ENV=production node:20 npm test

Хотим заменить production на development.

Важно: в shell vi-mode (readline/ZLE) НЕТ внутристрочного поиска `/` - 
он биндится на поиск по ИСТОРИИ команд (см. Пример 4). И НЕТ текстовых
объектов (`iw`, `aw`, `i(`): доступны только движения + операторы
(`w`, `b`, `f`, `t`, `F`, `dw`, `cw`, `ct`, `cc`, `r`, `x`, `p`).
Поэтому позиционируемся движениями по строке, а не поиском.

Нажимаем: <Esc>            (переходим в command-режим)
          F=               (поиск НАЗАД по строке к '=' перед значением)
          l                (вправо на первый символ значения - 'p')
          ct<Space>        (change till next space - удаляет production)
          development<Esc> (печатаем новое значение)

Альтернатива, если курсор уже стоит на 'p' начала production:
          cwdevelopment<Esc>  (change word - слово до конца от курсора)

Стало:
  docker run --rm -it -v $(pwd):/app -w /app -e NODE_ENV=development node:20 npm test
Замечание про ciw: текстовый объект iw ("inner word") есть только в
полноценном Vim/Neovim. В readline и ZLE его нет - там пришлось бы целиться
движением (cw от начала слова или ct <пробел>). Разбор ciw vs cw
уместен в редакторе, но не в командной строке.
Пример 2. Переход по ссылке в браузере без мыши (Vimium).

Код: Выделить всё

Было: открыта страница документации, нужно перейти в раздел "Configuration".
Нажимаем: f          (появляются буквенные метки на всех ссылках)
          SA         (набираем метку нужной ссылки; метки по умолчанию
                      показываются заглавными с домашнего ряда, но
                      ввод регистронезависим - sa тоже сработает)
Стало: открыт раздел Configuration, рука не покидала клавиатуру.
Пример 3. Рефакторинг имени в JetBrains через IdeaVim.

Код: Выделить всё

Было: курсор на переменной userCnt, хотим переименовать во всём проекте.
Нажимаем: <leader>rn      (маппинг на :action RenameElement)
          userCount<CR>   (вводим новое имя, IDE правит все использования)
Стало: переменная переименована проектно - Vim-движение запустило IDE-рефакторинг.
Пример 4. Поиск по истории команд в bash vi-mode.

Код: Выделить всё

Было: нужно найти давнюю команду с "rsync".
Нажимаем: <Esc>        (command-режим readline)
          /rsync<CR>   (поиск назад по истории)
          n            (следующее совпадение, если не та)
          <CR>         (выполнить найденную)
Лучшие практики 2026
  • Один leader, один словарь. Задайте <Space> как leader в Neovim, IdeaVim (let mapleader = " ") и VSCode ("vim.leader": "<space>"). Расхождения в маппингах между средами стирают мускульную память - стремитесь к максимальному совпадению базового слоя.
  • В IDE делегируйте "умное" через мост к действиям. В IdeaVim вешайте рефакторинг, навигацию и git на leader-маппинги через :action/<Action>; в VSCode - через commands в normalModeKeyBindings. Не пытайтесь воспроизвести IDE-функции средствами Vim - пусть Vim занимается текстом, а IDE своим.
  • Выбор VSCode-расширения по потребности. Нужна полная семантика Vim (:global, :normal, normal-режимные плагины, ваш init.lua) - vscode-neovim с реальным Neovim-бэкендом. Нужен лёгкий Vim-режим без Ex-команд - VSCodeVim.
  • Покажите режим в shell. В bash добавьте set show-mode-in-prompt on и смену формы курсора в ~/.inputrc; в zsh используйте KEYTIMEOUT=1 и индикатор режима. Без статусной строки визуальная подсказка о текущем режиме экономит много ошибочных нажатий.
  • Используйте ~/.inputrc как единую точку. Одна строка set editing-mode vi включает vi-режим во всех readline-программах сразу (REPL Python, psql, gdb и др.) - это бесплатное распространение навыка.
  • Закрепляйте навык через "Vim everywhere", а не только тренажёрами. Перенос одного и того же словаря движений во все инструменты (терминал, браузер, IDE) закрепляет мускульную память быстрее и естественнее, чем изолированные дриллы. Тренажёры (см. главу 33) - дополнение, а не замена ежедневной практике.
  • Не отключайте родные шорткаты IDE ради чистоты Vim. Persistent undo в IDE-Vim ненадёжен - пользуйтесь Local History (JetBrains) и Timeline (VSCode) вместо u-"машины времени". Это не компромисс, а правильное разделение труда.
Частые ошибки
  • Воевать с IDE-Vim за неподдерживаемые фичи. Попытки использовать :global, произвольные Ex-команды, Ctrl-W-менеджмент окон или persistent undo в IdeaVim/VSCodeVim приводят к фрустрации. Если нужна полная семантика - берите vscode-neovim (реальный бэкенд); иначе принимайте границы эмулятора.
  • Конфликты маппингов плагинов. Классика - s одновременно у vim-surround и vim-easymotion/sneak. Решайте заранее: переназначьте surround (например, на <leader>s) или отключите конфликтующую фичу.
  • clipboard=unnamedplus вслепую в IDE. В IDE-средах системный буфер обычно уже проброшен. Дублирующие глобальные настройки буфера могут конфликтовать с родным копированием IDE - проверяйте поведение, прежде чем глобально вешать unnamed.
  • Забыть, что zsh не читает ~/.inputrc. Частая путаница: настроили vi-режим в ~/.inputrc, а в zsh ничего не изменилось. zsh использует ZLE - настраивается через bindkey -v в ~/.zshrc.
  • Раздражающая задержка после <Esc> в shell. Без KEYTIMEOUT=1 (zsh) или keyseq-timeout (bash/readline) переход в command-режим ощущается "залипающим". Это не баг, а таймаут на распознавание escape-последовательностей: Esc и стрелки начинаются с одного байта 0x1B. Слишком агрессивное ускорение ломает стрелки/F-клавиши по медленному SSH - балансируйте значение.
  • i в Vimium ловит ввод. В браузерном Vim-режиме нажатие i (или фокус на поле ввода) передаёт клавиши странице - j/k начнут печататься в текстовом поле. Выход - <Esc>.
  • Ожидать единообразия там, где его нет. Полное совпадение поведения между Neovim, IdeaVim, VSCodeVim и браузером недостижимо - реализации отличаются в краях (поведение ., отдельные текстовые объекты, регистры). Совпадает базовый слой; на него и опирайтесь.
Упражнения
  1. Shell vi-mode. Включите vi-режим в своём shell (set -o vi для bash или bindkey -v для zsh). Настройте индикацию режима и форму курсора. Проживите в нём день: редактируйте команды через <Esc> + движения, ищите по истории через /. Какие три команды вы раньше переписывали целиком, а теперь правите точечно?
  1. ~/.inputrc для всех REPL. Добавьте set editing-mode vi в ~/.inputrc. Откройте python3, psql (или любой доступный readline-REPL) и убедитесь, что vi-движения работают и там. Запишите, в скольких разных программах навык теперь доступен.
  1. Браузер без мыши. Поставьте Vimium (Chrome) или Tridactyl (Firefox). В течение часа навигации по документации не касайтесь мыши: только f для ссылок, j/k/d/u для скролла, o для открытия URL, J/K для вкладок. Засеките, насколько естественно ложатся уже знакомые gg/G///n.
  1. IdeaVim или VSCode-мост. В своей IDE настройте минимум три leader-маппинга к родным действиям: переименование, переход к определению, поиск по проекту (:action в .ideavimrc или commands в settings.json). Убедитесь, что leader совпадает с вашим Neovim-leader.
  1. Сравнение VSCode-расширений. Если используете VSCode, поставьте vscode-neovim и попробуйте выполнить :%g/TODO/d (удалить все строки с TODO) на тестовом файле. Затем попробуйте то же в VSCodeVim. Зафиксируйте разницу - это наглядная демонстрация "эмуляция vs реальный бэкенд".
  1. Аудит единообразия. Выпишите 10 базовых движений/команд, которыми пользуетесь чаще всего. Проверьте каждое в четырёх средах: Neovim, IDE-Vim, браузер, shell vi-mode. Отметьте, где что не работает, - это карта реальных границ вашего "Vim everywhere".
Главное из главы
  • Ценность модального редактирования многократно возрастает, когда один набор движений работает везде: в IDE, браузере, shell и TUI-утилитах. Переносится грамматика (движения + операторы + текстовые объекты + .), а не конфиг целиком.
  • IdeaVim - полноценный Vim-движок JetBrains; конфигурируется через ~/.ideavimrc, эмулирует часть плагинов через set <имя>, а к функциям IDE подключается через :action/<Action>. Делегируйте "умное" родной IDE.
  • В VSCode есть выбор: VSCodeVim (лёгкая эмуляция, настройка в settings.json) против vscode-neovim (реальный Neovim-бэкенд с :global/:normal/плагинами и вашим init.lua). Выбирайте по тому, нужна ли полная семантика Vim.
  • В браузере Vimium/Tridactyl дают f для перехода по ссылкам и hjkl-скролл; словарь почти идентичен Vim. Tridactyl умеет править поля во внешнем редакторе.
  • В shell vi-режим включается через set -o vi (bash/readline, конфиг ~/.inputrc) или bindkey -v (zsh, конфиг ~/.zshrc); ~/.inputrc распространяет vi-режим на все readline-программы разом.
  • Многие TUI-инструменты (less, man, git-pager, k9s, lazygit, tig, fzf) понимают Vim-движения по умолчанию - навык работает без настройки.
  • Не воюйте с границами эмуляторов и решайте конфликты маппингов заранее. Эргономика и борьба с вредными привычками при этом - тема следующей главы 32.
👍2 ❤️5 🔥1 😄 🤔1
✔ Лучший ответ сформирован автоматически — Xapa
Roman_Vim писал(а):нажимаете Ctrl-I в textarea и правите содержимое в настоящем редакторе, после :wq текст возвращается в поле вот это в тридактиле прям киллер фича для меня. длинные посты на форумах писать во встроенном поле браузера это боль, а тут открыл нвим и норм. спс что показали, поставил
Перейти к ответу →
Аватара пользователя
vasya2025
Сообщения: 1
Зарегистрирован: 02 июн 2026, 07:48

Re: Vim повсюду: IDE, браузер и shell

Сообщение vasya2025 »

настроил bindkey -v в zsh и чуть не выкинул, пока не дошло про KEYTIMEOUT=1. до этого после esc реально как залипало, думал терминал тормозит. поставил 1 и сразу другое ощущение
👍 ❤️ 🔥 😄 🤔1
Аватара пользователя
andy_timur
Сообщения: 1
Зарегистрирован: 24 май 2026, 23:57

Re: Vim повсюду: IDE, браузер и shell

Сообщение andy_timur »

у меня в идее долго не работал gd через :action GotoDeclaration, оказалось я Ctrl-V забил под блок-визуал и поломал вставку в insert. sethandler <C-V> n-v:vim i:ide все починил, как в уроке. читайте про хендлеры внимательно, я полчаса потерял
👍1 ❤️2 🔥1 😄 🤔
Аватара пользователя
grafanapro
Сообщения: 1
Зарегистрирован: 14 май 2026, 06:38

Re: Vim повсюду: IDE, браузер и shell

Сообщение grafanapro »

вопрос по shell vi-mode: в уроке пишут что / в командной строке это поиск по ИСТОРИИ а не по строке. а как тогда внутри длинной команды быстро прыгнуть к нужному месту если текстовых объектов типа ciw тоже нет? только f/t и движениями ковырять? или я что то упускаю
👍 ❤️ 🔥 😄 🤔
Аватара пользователя
zig_enjoyer
Сообщения: 1
Зарегистрирован: 15 май 2026, 09:12

Re: Vim повсюду: IDE, браузер и shell

Сообщение zig_enjoyer »

лайфхак добавлю: в zsh повесил v в vicmd на edit-command-line через autoload, как в уроке написано. теперь любую монструозную docker команду открываю в нвиме и правлю нормально. жизнь поменялась
👍 ❤️1 🔥 😄 🤔
Аватара пользователя
Xapa
Сообщения: 1
Зарегистрирован: 07 июн 2026, 08:07

Re: Vim повсюду: IDE, браузер и shell

Сообщение Xapa »

✔ Лучший ответ — сформирован автоматически
Roman_Vim писал(а):нажимаете Ctrl-I в textarea и правите содержимое в настоящем редакторе, после :wq текст возвращается в поле
вот это в тридактиле прям киллер фича для меня. длинные посты на форумах писать во встроенном поле браузера это боль, а тут открыл нвим и норм. спс что показали, поставил
👍2 ❤️1 🔥 😄 🤔1
Аватара пользователя
avisaper
Сообщения: 1
Зарегистрирован: 30 май 2026, 12:22

Re: Vim повсюду: IDE, браузер и shell

Сообщение avisaper »

короткое спасибо за таблицу vscodevim vs vscode-neovim. наконец понял почему у меня :%g/TODO/d не пахал - сидел на эмуляции. перешел на neovim бэкенд
👍2 ❤️ 🔥 😄 🤔
Ответить
← Предыдущая глава
Дистрибутивы, отладка и терминал: быстрый старт и интеграции
Следующая глава →
Эргономика и антипаттерны: как не навредить себе и не застрять

Все главы курса «Vim и Neovim: модальное редактирование от основ до современного Neovim»

Поделиться темой: ✈ Telegram VK

Вернуться в «Vim и Neovim: модальное редактирование от основ до Neovim 2026»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость