- Название: “Изучаем vi и Vim. Не просто редакторы” (8-е издание)
- Автор: Арнольд Роббинс, Элберт Ханна
- Начало чтения: 27.04.25
- Конец чтения: 11.05.25
- Оценка: 5/5
Введение 
- Откуда узнал про книгу: искал книги по vim, нашёл в Яндексе
- Цель на проработку книги: сделать моё взаимодействие с vim более эффективным
- Глобальная цель: эффективно использовать профессиональные инструменты для выполнения рабочих задач
- Задачи:
- Изучить базовые возможности vim, которые я ещё не знаю
- Внедрить их в свою работу и закрепить, если они будут эффективны и полезны для меня
- Лучше понять философию, историю появления и развития vi и vim
- Получить представление о расширенных возможностях vim, которые могут быть полезны для решения узкоспециализированных задач
Рецензия 
Отличная книга о Vim!
Подробно описывает возможности и настройки текстовых редакторов ex, vi и Vim. Если вы новичок в Vim, лучше начать изучение с более простых материалов (vimtutor, краткие статьи и уроки), однако если хотите погрузиться в возможности Vim глубже, обязательно прочитайте.
Что понравилось:
- Хорошая структура книги, “От простого к сложному”. Книга начинается с описания базовых возможностей vi и заканчивается сборкой IDE на базе Vim
- Подробнейший обзор функций и возможностей vi и Vim
- Сумасшедшая справка по всем возможным командам и настройкам Vim
Наиболее полезным для меня было:
- Описание того, как работают буферы в Vim
- Описание текстового редактора ex. Понял, почему командная строка в Vim такая, какая она есть
- Хоткеи для работы с окнами в Vim
Что не понравилось:
- Встречаются бесполезные скриншоты
- В конце книги слишком много внимания уделено вещам, не относящимся к Vim напрямую
Конспект 
Часть 1. Основные приёмы работы в vi и Vim 
Глава 1. Знакомство с vi и Vim 
vi копирует открываемый файл в буфер - область памяти, выделяемую временно. Все изменения производятся с буфером и не влияют на исходный файл до момента сохранения. Исходный файл меняется только в момент сохранения изменений.
ZZ
в командном режиме - сохранить изменения и выйти из vim (==:wq
):e!
- отменить все изменения в буфере и заново открыть файл:w!
- перезапись существующего файла
!
после :e
или :q
снимает дефолтное ограничение на удаление несохранённых изменений
Глава 2. Основы редактирования 
cc
- удалить строку и перейти в режим вставкиdw
- удалить до конца слова и пробельный символ после словаcw
==ce
- удалить до конца слова, но не пробелы после словаX
- удалить символ до курсора. Не знал! Мб, полезноU
- восстановить строку в состояние до измененийI
- вставка в начало строки. Редко использую! Мб, полезноR
- замена существующих символов новыми, поверх старых. Не использую и вряд ли буду. Можно переназначить клавишу
Можно использовать числовые префиксы перед i
и a
:
10i<some><ESC>
- вставить <some>
10 раз
Лайфхак: 2r&
- чтобы заменить ||
на &&
J
- объединение следующей строки с текущей через пробел.<n>J
, чтобы объединить сразу несколько строк. При этом1J
и2J
- это одно и то же.3J
- текущая + две следующих
Глава 3. Эффективная навигация 
Хоткеи для навигации по экранам:
ctrl+f/b
- вперед / назад на экранctrl+d/u
- вперед / назад на пол-экранаctrl+e/y
- вперед / назад по строкам, не сдвигая курсор
Для меня абсолютно неюзабельные. В Neovim я использую neoscroll
для плавного скроллинга без перемещения курсора
z + enter/./-
- подвинуть текущую строку вверх/центр/низ экрана<n>z<enter>
- подвинуть строку<n>
в верх экрана
Из всех этих мапингов знал только про z.
. Нужно попрактиковаться, возможно, они будут полезны
ctrl+l
- перерисовать экран без прокрутки
H/M/L
- курсор в верх/середину/низ экрана<n>H/L
- кn-й
строке сверху/снизу
Не использую и вряд ли буду. Можно перемапить эти клавиши
Перемещение по строкам:
Enter
/+
- к первому непустому в следующей строке-
- к первому непустому в предыдущей строке
n/N
- переход вперед/назад по результатам поиска. Очень редко использую N
<n>G
- к строке<n>
. Я в основном использую:<n>
- `` - в исходное положение (до G) или на последнее редактирование. Не знал. Нужно попрактиковаться; мб, будет полезно
Глава 4. За пределами основ 
v/c/d/y
+ G
/ 13G
- выделить / заменить / удалить / скопировать с текущей строки до конца файла / 13-й строки. Не знал, что тут можно не только “до конца файла”, но и до конкретной строки. Мб полезно
vim -R файл
- открыть readonly. Даст изменить, но не даст сохранить изменения без !
Глава 5. Знакомство с редактором ex 
- vi - визуальный режим линейного редактора ex
- ex - потомок ed
- ed - основан на qed
Q
в командном режиме vim вызывает ex. vi
в ex возвращает обратно
Описанные далее команды ex помогли мне понять суть происходящего в командной строки vim. В частности - почему команда поиска и замены такая на первый взгляд странная
Команды
d
- удалитьm
- переместитьt
- скопировать
Диапазоны
:3,18
- строки с 3 по 18:.,.+5
- текущая и +5 вниз:%
- все строки в файле:.,$
- с текущей строки до конца файла
Шаблоны поиска
:/шаблон/d
- удалить строку, содержащую шаблон:g/шаблон
- найти упоминания шаблона в файле
Другие операции
:wq
- сохранить и выйти. Файл будет перезаписан, даже если в нём не было изменений:x
- сохранить и выйти. Файл НЕ будет перезаписан, если в нём не было изменений:w newfile
- сохранить все изменения с момента последнего сохранения в новом файле. Старый файл останется неизменённым:230,$w newfile
- сохранить в новый файл только часть текущего буфера (с 230 строки до конца файла):230,$w >> newfile
- добавить часть текущего в буфера в конец файла:r file
- считать файл в текущий буфер:%r file
- считать в конец буфера:0r file
- считать в начало буфера:e file
- открыть файл
vim запоминает последние 2 файла (текущий и “альтернативный”) - на них можно ссылаться как %
и #
:e #
- быстрое переключение между двумя файлами:e!
- сбрасывает текущий буфер до последнего сохранения:w %.new
- тут будет вместо%
подставлено имя текущего файла
ctrl+6
в командном режиме - аналог :e #
- переключение между последним файлом. Звучит как очень полезный, но очень неудобный мапинг! Нужно перемапить на другую комбинацию клавиш
Глава 6. Глобальная замена 
:s/старый/новый/
- заменить первый найденный старый шаблон на новый в текущей строке:s/старый/новый/g
- все в текущей строке:1,5s/старый/новый/
- первый в диапазоне строк:%s/старый/новый/g
- все во всём файлеg
- global (все вхождения в строку)c
- confirm (с подтверждением)
:%s/старый/новый/gc
- все во всём файле, с подтверждениемy
- заменитьn
- пропуститьa
- это и все остальныеq
- завершитьl
- заменить это и завершить (last)ctrl+e/y
- прокрутка экранаesc
- тоже завершить
:g/шаблон/ команда
- применить команду ко всем строкам, удовлетворяющим шаблону:g/шаблон/s/старое/новое/g
- заменить старый шаблон на новый только в строках, где найден шаблон
Метасимволы в шаблонах
.
- любой одиночный символл*
- ноль и более одиночных символов как тот, что перед этим^
- в начале строки$
- в конце\
- экранирование
Есть спец мета-символы для второй части строки замены. &
- подстановка совпадения из старого шаблона
:s
- повтор последней замены
:set edcompatible
- запомнить флаги предыдущей замены (g/c
) и применять их к последующим
Любое время, потраченное на изучение синтаксиса регулярных выражений окупится тысячекратно!
:%s/\<child\>/children/g
- заменить child на children как слово
\<слово\>
- заменить как слово
В очередной раз убеждаюсь в правильности выражения “GUI делает сложные задачи простыми, а терминал - невыполнимые задачи выполнимыми”.
Командная строка ex предоставляет огромные возможности. Можно одной командой переместить блоки текста на 1000 страниц и т.д. Но бОльшую часть моей работы составляют более простые задачи. Для них не требуется вся эта мощь, а требуется скорость на простых операциях. Проще нажать “w” в GUI чем вводить \<слово\>
Нужно создавать команды, которые используя “изкоробочную” мощь Vim-а будут упрощать мои частые операции с текстом
troff
(для набощиков и лазерных принтеров) иnroff
(для терминалов и линейных принтеров) используются для создания страниц руководства
Когда заменяем пути, нужно экранировать /
: \/
- это неудобно. Можно использовать :
в качестве разделителя :s
:
:%s:/home/tim:/home/linda:g
то же самое что
:%s/\/home\/tim/\/home\/linda/g
Вот это не знал, вот это удобно!
:g/^$/d
- удалить пустые строки:g/^[ tab]$/d
- удалить пустые, а так же содержащие пробелы/табы строки:%s/ *$//
- удалить все пробелы в конце строк
Интересный кейс :g
- можно использовать для n повторений ex
-команд
:1,10g/^/ 12,17t$
- 10 раз скопировать строки с 12 по 17 в конец файла
Этот и другие лайфхаки: https://github.com/learning-vi/vi-files/tree/master/unix-world-tutorial
Глава 7. Продвинутое редактирование 
~/.exrc
считывается перед запуском vi
и vim
. Если есть .exrc
в текущей директории, применяется поверх того, что был взят из домашней
Параметры
:set параметр
и:set noпараметр
- переключение булевых параметров:set параметр!
- тоггл булевого параметра:set параметр=20
- установка значения:set all
- вывести все используемые значения:set параметр?
- вывод значения параметра:set
- те параметры, которые специально поменяли
Внешние команды
:r !команда
- считать результат внешней команды прям в файл:96,99!sort
- посортировать строки c 96 по 99. Можно изменить текст при помощи внешних команд
Если возможность задавать аббревиатуры, которые будут автоматически “раскрываться” в режиме вставки ( :ab
)
:map e ea
- “в конец слова = в конец слова и добавить”. Интересный мапинг, нужно попробовать:map! =f some
- можно мапить комбинации в режиме вставки для ускорения ввода
Для программистов
:set autoindent
- автоотступ. Если строка имеет отступ, то при добавлении новой строки (Enter) она будет иметь такой же отступ:set shiftwidth=4
- устанавливает, на сколько пробелов будет сдвигать<<
и>>
. По умолчанию - 8:set tabstop=4
- кол-во пробелов в табуляции, отображаемое на экране:set expandtab
- при нажатии tab вводить достаточное количество пробелов, чтобы переместить курсор к следующей остановке табуляции:set list
- включить отображение скрытых символов
%
не на скобке автоматически найдёт первую скобку далее по строке и прыгнет к её паре
Часть 2. Vim 
Глава 8.Vim: обзор и отличия от vi 
Vim начинается там, где кончается vi.
Первая версия vim создана 2 ноября 1991 года, выпущена в январе 1992 года.
Цель создания Vim - быть надёжным редактором, на который могут положиться профессиональные разработчики ПО.
Хороший момент про текстовый редактор ed из видео “История лучшего текстового редактора – Vim (Unix?)” с канала “Куда войти?”:
[…] и теперь я просто нажимаю Enter, ну и оно сработало. Я знаю это, потому что это крутой софт и он точно сделал это.
Мне в сборке neovim тоже очень важна надёжность. Лучше пусть функций будет немного, но они будут работать предсказуемо, надёжно и точно.
vi и Vim всегда записывают файл с добавлением в конце символа новой строки. Чтобы этого не происходило: :set binary
Аргументы командной строки Vim
-d
- запустить в режиме сравнения. Сравнивает 2-4 файла-M
- отключить опцию записи. Отключает:w
и:w!
-o[n]
/-O[n]
- открыть файлы в n окнах (горизонтально / вертикально)
Глава 10. Многооконный режим в Vim 
Все дефолтные мапинги для работы с окнами начинаются с ctrl+w
. Перед ними можно ставить числа, как перед обычными командами vim.
:vnew
- открыть в вертикальном сплите новый буфер. Интересно, не знал, мб полезно будет
Перемещение курсора по окнам:
ctrl+w
+w
- циклический перебор окон (вниз/вправо)ctrl+w
+shift+w
- циклический перебор окон (вверх/влево)ctrl+w
+t
- к самому левому верхнему (top)ctrl+w
+b
- к самому левому верхнему (bottom)ctrl+w
+p
- к предыдущему окну
1. Перемещение окон без изменения компоновки
ctrl+w
+r
- повернуть окна направо/внизctrl+w
+shift+r
- повернуть в другую сторону
Работает только с той строкой / столбцом, в котором находится текущее окно. Представим окна в виде одномерного массива. Эти команды выполняют циклический сдвиг в нём
ctrl+w
+x
- поменять текущее окно с следующим (если оно есть; иначе - с предыдущим). Можно добавить в начало число, тогда поменяется местами не с соседним, а сn-м
Не знал и вот этих команд (особенно последней) прям не хватало! Я как дурак переставлял буферы вручную. Нужно замапить более удобный хоткей.
2. Перемещение окон с изменением компоновки
ctrl+w
+shift+h/j/k/l
- переместить окно в лево/низ/верх/право, использовать всю ширину экрана. Не знал, не использовал. Мб, удобноctrl+w
+shift+t
- переместить окно на новую вкладку. Редко пользуюсь вкладками, мб, надо чаще
Изменение размеров окон
ctrl+w
+=
- старается максимально выровнять размеры оконctrl+w
+-/+
- уменьшение/увеличение высоты окнаctrl+w
+</>
- уменьшение/увеличение ширины окна:resize -4 / +4
- аналогично:resize 10
- задать высоту окна ровно 10 строк
winheight
и winwidth
- минимальная ширина/высота, которые должно иметь активное окно. Удобно для переключения между двумя файлами, чтобы размеры автоматом подстраивались
Буферы и окна
:ls
/ :files
/ :buffers
- вывод буферов. !
- с доп. инфой
Флаги буферов
%
- буфер текущего текущего окна;#
- альтернативный буферa
- активный буфер (загружен и видим);h
- скрытый (загружен но не отображается ни в одном окне)-
- только для чтения;=
- нельзя сделать не для чтения+
- изменённый буфер;x
- с ошибкамиu
- буфер типа какhelp
- не отображается без!
:windo cmd
- выполнитьcmd
в каждом окне:bufdo cmd
- выполнитьcmd
в каждом буфере, в т ч в скрытыхctrl+w + f
- открыть файл под курсором в горизонтальном сплитеctrl+w + g + f
- открыть файл под курсором в новой вкладкеctrl+w + o
- закрыть все окна кроме текущего
Мощь! Одна из самых полезных для меня глав была
Глава 11. Расширенные возможности Vim для программистов 
Многие современные среды программирования пытаются предоставить комплексные решения, однако всё, что действительно нужно, - это мощный и эффективный редактор с некоторыми дополнительными возможностями
Поразительно, насколько мощные и широкие возможности, предоставляли vi и vim ещё в 90-х годах. 30 лет прошло, а многое более чем актуально и сейчас
make
можно запускать в cmd. Результат в Quickfix List
:cnext
,:cprevious
- перемещения курсора по пунктам qf:colder
,:cnewer
- перемещения к более старому / новому qf. Происходит “под капотом”, если qf окно не открыто, то оно и не откроется
Глава 12. Сценарии Vim 
В качестве примера для иллюстрации возможностей Vim приводится скрипт, который автоматически меняет цветовую тему в зависимости от времени суток.
Зачем это надо на практике - не понятно, но это ведь очень круто! Такое довольно нетривиальное для текстового редактора поведение можно реализовать всего в пару десятков строк
Автокоманды
Автокоманды можно привязывать к группам, чтобы потом было проще удалять их, ссылаясь на группу
Сначала удаляем автокоманды из автогруппы, потом удаляем автогруппу, если надо
Пример использования автокоманд: установка разных отступов в зависимости от типа файла
Глава 13. Прочие полезные возможности Vim 
Можно редактировать файлы на удалённых компьютерах!
vim scp://username@host:port//home/username/file
scp - безопасное удалённое копирование через ssh
Шок! Уверен, что JB IDE тоже так умеют; поразительно, что в Vim есть такая функциональность
Дифы
vimdiff старый новый
vim -d старый новый
:set viminfo ...
- какую инфу о сессии сохранять
Инфа хранится в файле ~/.viminfo
:mksession файл
- сохранить инфу о сессии в файл:source файл
- восстановить сессию из файла
Глава 14. Несколько продвинутых приёмов работы с Vim 
Авторы предлагают ряд кастомных маппингов, состоящих из двух одинаковых символов (//
и т.п.). Я заметил, что для меня такие мапинги самые неудобные. Удобнее нажимать разные клавиши разными пальцами; особенно пальцами разных рук.
Часть 3. Vim в более широкой среде 
vi - это не просто редактор. Это целая философия: способ мыслить о словах по-новому
Плагины для Google Chrome:
- wasavi - редактирование текстовых полей
- vimium - навигация по страницам
Как и при вводе текста вслепую всеми пальцами рук, использование Vim при написании кода делает редактирование текста программ более эффективным, чем любой управляемый мышью GUI-редактор