- Название: “Практическое использование Vim” (2-е издание)
- Автор: Дрю Нейл
- Начало чтения: 28.05.25
- Конец чтения: 16.06.25
- Оценка: 5/5
Введение 
- Откуда узнал про книгу: искал книги по vim, нашёл в Яндексе
- Цель на проработку книги: сделать моё взаимодействие с vim более эффективным
- Глобальная цель: эффективно использовать профессиональные инструменты для выполнения рабочих задач
- Задачи:
- Изучить базовые возможности vim, которые я ещё не знаю
- Внедрить их в свою работу и закрепить, если они будут эффективны и полезны для меня
- Лучше понять философию, историю появления и развития vi и vim
- Получить представление о расширенных возможностях vim, которые могут быть полезны для решения узкоспециализированных задач
Рецензия 
Отличная книга о Vim!
Читал после “Изучаем vi и Vim. Не просто редакторы”. Обе книги отлично дополняют друг друга. Первая - более фундаментальная и теоретическая, вторая - более практико-ориентированная. Рекомендую к прочтению обе всем интересующимся Vim.
По структуре книга - сборник рецептов. Я читал по порядку, но можно было и выборочно. Принцип “от простого к сложному” соблюдается только в рамках глав, но не всей книги.
Что понравилось: практико-ориентированный подход. Структура в виде рецептов для решения конкретных задач
Наиболее полезным для меня было:
- Команды с
g - Описание возможностей поиска и замены
- Описание возможностей макросов
Что не понравилось:
- Местами странное разбиение на рецепты. То слишком большие, то слишком маленькие
- Не хватило более узкоспециализированных рецептов. Лайфхаков, фишечек. В т ч по настройке конфига
Конспект 
Поставьте перед собой цель достичь такого уровня владения редактором Vim, когда вы не будете задумываться о своих действиях. Добившись этого, вы сможете править текст со скоростью мысли.
В руках мастера Vim кромсает текст со скоростью мысли.
Хочу дойти до уровня использования Vim, когда скорость редактирования текста будет по-настоящему впечатляющей
Глава 1. Путь Vim 
>{motion} - увеличить отступ по {motion}. >G - до конца файла.
Не задумывался, но ведь действительно. Использовал только >> - над текущей строкой. Нужно больше использовать c {motion}
На протяжении всей книги автор красной нитью проводит важность команды “точка”. Идеальная формула точки: “одно нажатие для перехода и одно - для изменения”. Я пока не осознал её мощь; использовать чаще
@:- повтор командыEx&- повтор подстановки (:s/old/new)
Глава 2. Командный режим 
Про командный режим интересная аналогия с художником и холстом.
Как часто покидать режим вставки? “Блоки отмены” должны соответствовать одной законченной мысли. Новая строка - не <CR> в режиме вставки, а <Esc>o.
Перемещения в режиме вставки закрывают блок отмены.
Лучше 6 раз нажать точку, чем высчитывать, сколько именно повторов нужно. Не переусердствовать с счетчиками.
gUgU или gUU - текущую строку в верхний регистр
Глава 3. Режим вставки 
Мапинги в insert-mode:
<C-h>- удалить символ слева от курсора<C-w>- удалить слово слева от курсора<C-u>- удалить строку слева от курсора<C-o>- командный подрежим режима вставки. Особо не использую, мб полезно
<C-r>=3*3<CR> - работа с регистром выражений как с калькулятором. Вставит результат. Интересная возможность, мб полезно
Глава 4. Визуальный режим 
gv- выделить последнее визуальное выделениеo- переместить курсор в другой конец выделенного фрагмента
Из построчного и блочного визуального режимов можно переключаться в посимвольный нажатием v
Есть проблемы с использованием точки в визуальном режиме. Поэтому лучше использовать операторы командного режима вместо визуального режима. Вообще если нужно повторять операции, то командный режим лучше визуального
Со строками текста можно работать в любом редакторе, но для выполнения операциями над колонками текста требуется более специализированный инструмент. Vim поддерживает такую возможность
Ведь и правда! Вообще не очевидный момент для большинства редакторов, а в Vim есть из коробки и достаточно понятно
Vr-- заметить выделенный фрагмент на символы. Необычно, надо использовать
В блочном режиме блоки мб непрямоугольные. Можно выделять до концов строк через $ по самой длинной строке
В блочном визуальном режиме лучше юзать I/A вместо i/a
Глава 5. Режим командной строки 
Работают в режиме командной строки:
<C-h>- удалить символ слева от курсора<C-w>- удалить слово слева от курсора<C-u>- удалить строку слева от курсора
:[range]normal{commands} - применение команд нормального режима к диапазону строк. Например, точки
:%normal A;- добавить;в конец каждой строки
Перед выполнением команды перемещает курсор в начало строки
:%normal i//- закомментить все строки в файле
<C-r><C-w> в режиме командной строки - вставить слово под курсором в командную строку
:read !cmd - вывести stdout внешней cmd в текущий буфер
:write !cmd - передать в stdin внешней cmd текущий буфер
Про сценарии:
- Пишем сценарий в
somename.vim - Открываем буфер, в командной строке вызываем
:source somename.vim - Если открыто несколько файлов, можно применить ко всем:
:argdo source somename.vim
Глава 6. Управление несколькими файлами 
:e- считать содержимое файла в буфер. Затрет несохранённые изменения:sp {file}/:vsp {file}- сразу открыть файл в сплите:only- закрыть все окна кроме текущего
Нужно подумать, как оптимизировать работу с сплитами и использовать их чаще.
Хорошая аналогия:
Вкладки Vim больше напоминают виртуальные рабочие столы, чем привычные вкладки в других текстовых редакторах
Глава 7. Открытие файлов и сохранение их на диск 
:pwd - вывод текущей директории
netrw - стандартный обозреватель файлов в Vim. В Neovim его нет
vim . или :E/:Explore
Создать новый файл с несуществующими директориями в названии
:edit some/dir/new.txt
:write -- Ошибка
:!mkdir -p %:h
:writeКейс: открыли файл, для редактирования которого нужны права супер-юзера. Можно всё равно сохранить этот файл, не выходя из vim:
:w !sudo tee % > /dev/null
Потом нажимаем l
Глава 8. Навигация внутри файлов 
go/g^/g$ - к первому / первому непробельному / последнему символу экранной строки

ea / gea - полезные комбы
Команды поиска можно использовать в операциях
v + /ge<CR> + d
а можно даже
d + /ge
Метки:
m{char}- поставить метку. Нижний регистр - логально для буфера, верхний - глобально- `{mark} - к метке
Автоматические метки:
- `` - позиция перед последним переходом в текущем файле
- `. - место последнего изменения
- `^ - место последней вставки
- `[ / `] - начало / конец последнего изменения/скопированного блока
- `< / `> - начало / конец последнего выделения в визуальном режиме
matchit.vim - для расширения % до ключевых слов. Мб полезно для lua
Глава 9. Навигация между файлами 
Команды перемещения - внутри файла, команды перехода - между файлами. Некоторые перемещения классифицируются как переходы - перемещения на дальние дистанции (не соседняя строка / слово)
:jumps - список переходов
Каждое окно имеет свой собственный список переходов для <C-o> и <C-i>
:changes - история изменений
g; и g, - перемещения вперёд-назад по истории изменений. Вот это здорово, не знал
Вышли из режима вставки, перешли в другое место документа, gi вернёт обратно и сразу перейдёт в режим вставки. Мб, полезно. У меня конфликтует с LSP мапингом, мб поменять.
Список изменений свой для каждого буфера
Параметр suffixesadd - для определения списка расширений, которые vim будет подставлять после имени файла для gf
Глава 10. Копирование и вставка 
gp и gP - аналог p / P для вставки строк, но курсор будет в конце блока. Поиспользовать, мб, полезно
Глава 11. Макросы 
q{register}- старт записи макросаq- стоп@{register}- воспроизведение@@- повторить последний макрос
Макросы на самом деле записываются в регистры. :reg a - можно просмотреть содержимое регистра и увидеть запись макроса
Как записать хороший макрос:
- Нормализовать положение курсора
- Перемещать курсор повторяемыми командами. Можно использовать команды поиска, текстовые объекты. Нельзя использовать мышь
- Если команда терпит неудачу (k на первой строке и т.п.), Vim прерывает макрос.
f{char}- хороший предохранитель
Два варианта выполнения макросов: последовательный и параллельный. Параллельный по факту тоже последовательный, это просто такое название. Отличия в том, что последовательный останавливается, если один макрос зафейлился, параллельный - нет
3@a- последовательный- выделить вызиальный блок, а потом
:normal @a- параллельный
Записали макрос в регистр a: qa –> q
qaещё раз - перезаписьqA- дозапись в конец регистра
Интересный момент: как правило, я нормализовывал курсор в конце макроса (переходя к следующему элементу). Но правильнее делать это в начале макроса, чтобы он был более универсальным
:argdo normal @a - выполнить макрос для всех буферов в списке аргументов
В макросы можно записывать команды Ex в т ч (в примере - :next)
:wall - сохранить все буферы в списке
:wnext - сохранить текущий файл и перейти к следующему буферу
Интересный пример: задача пронумеровать строки
one
two
three1) one
2) two
3) threeКак делать:
:let i=0qaI<C-r>=i<CR>)<esc>:let i += 1q
Используем переменную-счетчик и регистр выражений для вставки в текст документа
Vim не оптимизирует макросы, не удаляет компенсирующие друг друга действия
:put a - вставляет содержимое регистра в новую строку, ниже предыдущей (даже если в регистре не строка)
Как редактировать макросы:
- Вставить в буфер из регистра:
:put aили"ap - Отредактировать
- Скопировать обратно в регистр:
0и потом"ay$
Глава 12. Поиск по шаблону и поиск точного совпадения 
Параметр ignorecase - игнорировать регистр при поиске
\c- игнорировать регистр\C- не игнорировать регистр
Вводятся в любом месте в поиске /
smartcase - игнорировать только в нижнем регистре. Имба
По умолчанию поиск интерпретирует .,*? как спецсимволы. /\V{выражение} - отключает эту функциональность. Все символы воспринимаются как обычные
/\v<the> - поиск “the” как СЛОВА
Шаблон - текст в командной строке. Совпадение - фактически найденный текст. Шаблон не всегда равен совпадению
\zs и \ze - задают начало и конец совпадения. То есть можно из выборки селектить не всё, а только часть. Вот это круто, не хватало!
Есть функция escape, которая автоматически экранирует, там ещё юзается регистр вычислений. Сложно
Глава 13. Поиск 
gn- в визуальном режиме выделить следующее совпадение, но не перемещать курсор. Можно использовать как текстовый объект.dgn/cgnи тд/lang/e- искать совпадения и ставить курсор на последний символ
Глава 14. Подстановка 
:[range]s[ubtitle]/{pattern}/{string}/[flags]
Флаги:
g- глобально во всей строкеc- запрос подтвержденияn- только подсчет числа совпадений, без подстановки&- повторно использовать набор флагов предыдущей команды
Спецсимволы в строке замены:
\r- возврат каретки\t- табуляция\\- один обратный слеш\1,\2,\0- совпадение с первым/вторым/…/последним подвыражением в скобках&- полное совпадение с шаблоном~-{string}из предыдущей команды подстановки\={vim script}- вычисляет результат{vim script}
Если поле шаблона оставить пустым, то будет использован шаблон из последней команды поиска
:%s/\n/ - объединить все строки файла через запятые. Интересная вещь, мб нужно поиграться с диапазонами ещё
Можно вставлять содержимое регистра в {string}
Пример:
:s/target/raplacement/g
g&- повторить предыдущую команду замены, но для всего файла:&&- повторить последнюю команду подстановки. Работает с диапазонами, полезно с визуальным режимом
Задача: переставить поля CSV файла в обратном порядке (три поля)
/\v^([^,]*),([^,]*),([^,]*)$
:%s//\3,\2,\1Как-то задумывался про эту задачу. Удивительно, как просто она решается в Vim.
Как выполнить замену во всех файлах проекта:
- Сформировать команды поиска и замены
- Через
:vimgrepнайти все совпадения по команде поиска :cfdo {cmd}- выполнить команду для всех элементов QuickFix List:cfdo update- сохранить все изменения
:update- сохраняет файл на диск, но только если он был изменён
Глава 15. Глобализация команд 
:global (:g) позволяет применить команду Ex для каждой строки, соответствующей шаблону
:[range] global[!] /{pattern}/[range][cmd]
По умочанию применяется ко всему буферу
! / :vgloval (:v) - инвертировать (inVert), т.е. применять для строк НЕ удовлетворяющих шаблону
cmd мб пустым, тогда будет просто print
p- printd- delete
:g/todo/yank A - выписать все TODO в регистр a. Заглавная а - значит “добавить”
:g/todo/t$ - скопировать в конец буфера
Глава 17. Quickfix List 
:cnext/:cprev- следующая / предыдущая записи:copen/:cclose- открыть/закрыть qf:cdo {cmd}- применить к каждой строке:cfdo- применить к каждому файлу:colder/:cnewer- переходы по спискам qf
Можно настроить :make и :compiler для сборки проекта