§ 4. Редакторы

Введение

01 Стандартным редактором в UNIX долгое время был ed, разработанный Кеном Томпсоном в 1971 году. Этот редактор был создан для телетайпов и выводил минимальный объем информации на стандартный вывод. Его расширенная версия ex использовала режим экранного редактирования и послужила основой для редактора vi, созданного Биллом Джоем в 1976 году, который является наиболее распространенным редактором среди дистрибутивов Linux. Его расширенная версия под названием vim была создана Брамом Моленаром в 1991 году.

02 Одной из основных идей vi и vim являются режимы работы: переключаясь в тот или иной режим, одни и те же клавиши соответствуют различным командам редактора. Также некоторые команды можно комбинировать и задавать им параметры, что позволяет редактировать текст с максимальной эффективностью: не запоминать множество комбинаций клавиш, а создавать комбинации на лету из небольшого числа базовых. Эта идея оказалась удачной и была реализована во многих других редакторах и программах с помощью плагинов или вручную. На данный момент vim-плагины есть для популярных сред программирования (CLion, IntelliJ Idea, Eclipse, Visual Studio) и для популярных браузеров, а для некоторых программ сочетания клавиш из vim являются умолчанием: dwm, zathura, vimb. Также есть сайты, которые используют сочетания клавиш из vim. Таким образом, vim перестал быть просто редактором, а стал популярным подходом к редактированию текста, который используется и другими программами. Далее мы рассмотрим vim как эталонную реализацию этого подхода.

Режимы работы

03 В vim есть следующие основные режимы работы: нормальный, визуальный, режим ввода и режим командной строки. В разных режимах одни и те же клавиши означают различные действия. Например в нормальном режиме клавиша H означает перемещение курсора влево, а в режиме ввода означает ввод символа h.

РежимКлавиша активацииОписание
нормальныйEscрежим по умолчанию
визуальныйV, Shift-V, Ctrl-Vрежим выделения текста
режим вводаI, Shift-Iрежим ввода текста
режим командной строки:режим ввода команд редактора

04 Классическими клавишами для перемещения курсора являются H J K L, которые обозначают перемещение влево, вниз, вверх, вправо соответственно. Так получилось, потому что у автора редактора не было клавиш-стрелок на клавиатуре. Современным объяснение такого выбора клавиш перемещения является близость к середине клавиатуры, т.е. минимальное среднее расстояние до всех остальных клавиш.

05 Для того чтобы ввести текст, надо перейти в режим ввода текста, нажав клавишу I. Затем можно набрать текст, как в любом другом редакторе. В этом режиме клавиша Ctrl-W удаляет последнее слово. Когда текст набран, надо нажать Esc, чтобы вернуться в нормальный режим.

06 В нормальном режиме можно отменить последнее редактирование клавишей U и повторить отмененное редактирование клавишей Ctrl-R. Клавиша A переходит в режим ввода за текущим символом, а клавиша I — перед текущим символом. Клавиша Shift-A переходит в режим ввода в конце строки, а клавиша Shift-I — в начале строки. Наконец, клавиша Shift-C удаляет весь текст до конца строки и переходит в режим ввода, а клавиша C+C (последовательно нажать и отжать клавишу C два раза) удаляет строку целиком и переходит в режим ввода. Клавиша D+D удаялет строку целиком и не переключает режим.

07 Для того чтобы выйти из редактора, надо перейти в режим ввода команд и набрать команду q, что является сокращением от quit. Сокращать можно любые команды, если это не приводит к путанице.

КомандаОписание
:read файлвставить содержимое файла после текущей строки
:write файлзаписать содержимое текущего буфера в файл
:writeзаписать содержимое текущего буфера в связанный с ним файл
:read !lsвставить вывод команды оболочки ls после текущей строки
:write !wcиспользовать текущий буфер в качестве ввода для команды оболочки wc
:%!sortпередать содержимое текущего буфера на ввод команды оболочки sort и заменить содержимое буфера на ее вывод
Команды.

Комбинации команд и режимов

08 Команды и режимы можно комбинировать, чтобы осуществлять редактирование текста более эффективно. Например, чтобы удалить выделенную часть текста, а не строчку целиком, нужно перейти в режим выделения с помощью клавишы V, а затем нажать клавишу D для удаления текста. Для того чтобы отсортировать выделенный текст, надо перейти в режим команд и вызвать команду sort. Для того чтобы пропустить текст через команду оболочки, надо перейти в режим команд и вызвать команду оболочки через восклицательный знак: !tac.

Текстовые объекты, перемещения, действия

09 В нормальном режиме существуют клавишы, соответствующие текстовым объектам, которые можно комбинировать с клавишей D или C. Для того чтобы удалить текст внутри кавычек, нужна комбинация D+I+Shift-", которую можно интерпретировать как delete inside quote, для удаления текста вместе с кавычками используют комбинацию D+A+Shift-", которую можно интерпретировать как delete a quote. В данных записях плюс означает последовательное нажатие клавиш, а минус одновременное. Если ввести просто D+W, то удалится текст, начиная с текущей позиции, и до конца слова.

КлавишаОписание
Dудалить текст
Yскопировать текст
G+U G+Shift-Uизменить регистр на нижний/верхний
~изменить регистр на противоположный
Действия.

10 Удаленный с помощью команд нормального режима текст попадает в специальный регистр, из которого этот текст можно вставить в другую часть файла. Для вставки после курсора используется клавиша P, для вставки перед курсором — Shift-P. Для того чтобы заполнить этот регистр без удаления, используется клавиша Y. Например, чтобы скопировать слово под курсором, испольуют Y+I+W.

КлавишаОписание
Wслово
Sпредложение
" 'текст внутри кавычек
{ [ (текст внутри скобок
tXML/HTML-тег
Текстовые объекты.

11 Некоторые текстовые объекты используются также являются командами перемещения. Клавиша W перемещает курсор к началу следующего слова, клавиша } перемещает курсор к концу текущего параграфа, а клавиша { — к началу, клавиша G+G перемещает курсор к началу файла, а клавиша Shift-G — к концу файла.

КлавишаОписание
^ $ 0начало/конец строки, начало строки без учета пробелов
Eконец текущего слова
W Bначало следующего/предыдущего слова
{ }начало/конец текущего параграфа
G+G Shift-Gначало/конец файла
F+символ Shift-F+символк ближайшему символу в строке (поиск вперед/назад)
T+символ Shift-T+символк ближайшему символу в строке (поиск вперед/назад), но курсор остановится перед ним
Перемещения по тексту.

Макросы

12 Поскольку все команды являются последтельностями клавиш, то их можно записать в текстовом виде: в виде символов, которые выводятся на экран, когда эти клавиши нажимаются в режиме ввода. Сделать это можно вручную, но есть специальная команда Q+символ, которая записывает последовательность клавиш в регистр с указанным в виде символа именем. Запись заканчивается, когда вы повторно нажимаете клавишу Q, а записанная последовательность называется макросом. Полученную последовательность можно повторить, нажав Shift-2+символ. Макросы полезны для массовой обработки файлов построчно или по каким-либо другим элементам структуры файла (например, тегам).

Повторение команд

13 Для большинства команд можно задать количество раз, которое их надо повторить. Например, 1+0+J сдвинет курсор на десять строчек вниз, а 1+0+Shift-2+z повторит десять раз макрос, сохраненный в регистре z.

Задания

Массовое переименование файлов1 балл

14 Команда оболочки vidir из пакета moreutils используется для быстрого переименования файлов. Она запускает редактор, указанный в переменной среды EDITOR и в нем открывается специальный файл, в котором находятся имена файлов переданных команде. По умолчанию это имена файлов в текущей директории. Каждая строка пронумерована, поэтому, когда вы изменяете имена файлов и закрываете редактор, vidir повторяет все эти изменения в файловой системе. Предположим, что мы запустили env EDITOR=vim vidir. Напишите последовательность клавиш, которые надо нажать в редакторе vim, чтобы изменить регистр всех имен файлов в текущей директории на противоположный.

Массовая обработка строк1 балл

15 У вас есть файл, где на каждой строчке есть некоторый набор символов, включая пробелы. Напишите макрос, который обернет одну строчку в кавычки. Макрос должен быть написан таким образом, что при повторении его N раз будут обернуты в кавычки N строк.

hello world
 a line with leading white space
1
!@#$%^&*()

Связь с оболочкой1 балл

16 Напишите последовательность клавиш, которые нужно нажать в редакторе vim, чтобы вставить текущую дату на следующую за курсором строчку.

Преобразование XML в Java properties2 балла

17 Напишите макрос для преобразования следующего XML файла в файла формата Java Properties. В задании необходимо использовать текстовый объект типа тег.

<property>
  <name>dfs.namenode.name.dir</name>
  <value>/var/hdfs/name</value>
</property>
XML.
dfs.namenode.name.dir=/var/hdfs/name
Java properties.

Видео

Запись лекции 25.09.2021.