Заметки по книге "Изучаем vi и Vim. Не просто редакторы"


  • Название: “Изучаем vi и Vim. Не просто редакторы” (8-е издание)
  • Автор: Арнольд Роббинс, Элберт Ханна
  • Начало чтения: 27.04.25
  • Конец чтения: 11.05.25
  • Оценка: 5/5

Введение copy

  • Откуда узнал про книгу: искал книги по vim, нашёл в Яндексе
  • Цель на проработку книги: сделать моё взаимодействие с vim более эффективным
  • Глобальная цель: эффективно использовать профессиональные инструменты для выполнения рабочих задач
  • Задачи:
    1. Изучить базовые возможности vim, которые я ещё не знаю
    2. Внедрить их в свою работу и закрепить, если они будут эффективны и полезны для меня
    3. Лучше понять философию, историю появления и развития vi и vim
    4. Получить представление о расширенных возможностях vim, которые могут быть полезны для решения узкоспециализированных задач

Рецензия copy

Отличная книга о Vim!

Подробно описывает возможности и настройки текстовых редакторов ex, vi и Vim. Если вы новичок в Vim, лучше начать изучение с более простых материалов (vimtutor, краткие статьи и уроки), однако если хотите погрузиться в возможности Vim глубже, обязательно прочитайте.

Что понравилось:

  • Хорошая структура книги, “От простого к сложному”. Книга начинается с описания базовых возможностей vi и заканчивается сборкой IDE на базе Vim
  • Подробнейший обзор функций и возможностей vi и Vim
  • Сумасшедшая справка по всем возможным командам и настройкам Vim

Наиболее полезным для меня было:

  1. Описание того, как работают буферы в Vim
  2. Описание текстового редактора ex. Понял, почему командная строка в Vim такая, какая она есть
  3. Хоткеи для работы с окнами в Vim

Что не понравилось:

  • Встречаются бесполезные скриншоты
  • В конце книги слишком много внимания уделено вещам, не относящимся к Vim напрямую

Конспект copy

Часть 1. Основные приёмы работы в vi и Vim copy

Глава 1. Знакомство с vi и Vim copy

vi копирует открываемый файл в буфер - область памяти, выделяемую временно. Все изменения производятся с буфером и не влияют на исходный файл до момента сохранения. Исходный файл меняется только в момент сохранения изменений.

  • ZZ в командном режиме - сохранить изменения и выйти из vim (== :wq)
  • :e! - отменить все изменения в буфере и заново открыть файл
  • :w! - перезапись существующего файла

! после :e или :q снимает дефолтное ограничение на удаление несохранённых изменений

Глава 2. Основы редактирования copy

  • cc - удалить строку и перейти в режим вставки
  • dw - удалить до конца слова и пробельный символ после слова
  • cw == ce - удалить до конца слова, но не пробелы после слова
  • X - удалить символ до курсора. Не знал! Мб, полезно
  • U - восстановить строку в состояние до изменений
  • I - вставка в начало строки. Редко использую! Мб, полезно
  • R - замена существующих символов новыми, поверх старых. Не использую и вряд ли буду. Можно переназначить клавишу

Можно использовать числовые префиксы перед i и a: 10i<some><ESC> - вставить <some> 10 раз

Лайфхак: 2r& - чтобы заменить || на &&

  • J - объединение следующей строки с текущей через пробел.
  • <n>J, чтобы объединить сразу несколько строк. При этом 1J и 2J - это одно и то же. 3J - текущая + две следующих

Глава 3. Эффективная навигация copy

Хоткеи для навигации по экранам:

  • 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. За пределами основ copy

v/c/d/y + G / 13G - выделить / заменить / удалить / скопировать с текущей строки до конца файла / 13-й строки. Не знал, что тут можно не только “до конца файла”, но и до конкретной строки. Мб полезно

vim -R файл - открыть readonly. Даст изменить, но не даст сохранить изменения без !

Глава 5. Знакомство с редактором ex copy

  • 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. Глобальная замена copy

  • :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. Продвинутое редактирование copy

~/.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 copy

Глава 8.Vim: обзор и отличия от vi copy

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 copy

Все дефолтные мапинги для работы с окнами начинаются с 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 для программистов copy

Многие современные среды программирования пытаются предоставить комплексные решения, однако всё, что действительно нужно, - это мощный и эффективный редактор с некоторыми дополнительными возможностями

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

make можно запускать в cmd. Результат в Quickfix List

  • :cnext, :cprevious - перемещения курсора по пунктам qf
  • :colder, :cnewer - перемещения к более старому / новому qf. Происходит “под капотом”, если qf окно не открыто, то оно и не откроется

Глава 12. Сценарии Vim copy

В качестве примера для иллюстрации возможностей Vim приводится скрипт, который автоматически меняет цветовую тему в зависимости от времени суток.

Зачем это надо на практике - не понятно, но это ведь очень круто! Такое довольно нетривиальное для текстового редактора поведение можно реализовать всего в пару десятков строк

Автокоманды

Автокоманды можно привязывать к группам, чтобы потом было проще удалять их, ссылаясь на группу

Сначала удаляем автокоманды из автогруппы, потом удаляем автогруппу, если надо

Пример использования автокоманд: установка разных отступов в зависимости от типа файла

Глава 13. Прочие полезные возможности Vim copy

Можно редактировать файлы на удалённых компьютерах!

vim scp://username@host:port//home/username/file

scp - безопасное удалённое копирование через ssh

Шок! Уверен, что JB IDE тоже так умеют; поразительно, что в Vim есть такая функциональность

Дифы

vimdiff старый новый
vim -d старый новый

:set viminfo ... - какую инфу о сессии сохранять

Инфа хранится в файле ~/.viminfo

  • :mksession файл - сохранить инфу о сессии в файл
  • :source файл - восстановить сессию из файла

Глава 14. Несколько продвинутых приёмов работы с Vim copy

Авторы предлагают ряд кастомных маппингов, состоящих из двух одинаковых символов (// и т.п.). Я заметил, что для меня такие мапинги самые неудобные. Удобнее нажимать разные клавиши разными пальцами; особенно пальцами разных рук.

Часть 3. Vim в более широкой среде copy

vi - это не просто редактор. Это целая философия: способ мыслить о словах по-новому

Плагины для Google Chrome:

  • wasavi - редактирование текстовых полей
  • vimium - навигация по страницам

Как и при вводе текста вслепую всеми пальцами рук, использование Vim при написании кода делает редактирование текста программ более эффективным, чем любой управляемый мышью GUI-редактор

читайте также