§ 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 | предложение |
" ' | текст внутри кавычек |
{ [ ( | текст внутри скобок |
t | XML/HTML-тег |
11 Некоторые текстовые объекты используются также являются командами перемещения. Клавиша W перемещает курсор к началу следующего слова, клавиша } перемещает курсор к концу текущего параграфа, а клавиша { — к началу, клавиша G+G перемещает курсор к началу файла, а клавиша Shift-G — к концу файла.
Клавиша | Описание |
---|---|
^ $ 0 | начало/конец строки, начало строки без учета пробелов |
E | конец текущего слова |
W B | начало следующего/предыдущего слова |
{ } | начало/конец текущего параграфа |
G+G Shift-G | начало/конец файла |
F+символ Shift-F+символ | к ближайшему символу в строке (поиск вперед/назад) |
T+символ Shift-T+символ | к ближайшему символу в строке (поиск вперед/назад), но курсор остановится перед ним |
Макросы
12 Поскольку все команды являются последтельностями клавиш, то их можно записать в текстовом виде: в виде символов, которые выводятся на экран, когда эти клавиши нажимаются в режиме ввода. Сделать это можно вручную, но есть специальная команда
Повторение команд
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. В задании необходимо использовать текстовый объект типа тег
.