учебники, программирование, основы, введение в,

 

Текстовый редактор Vi

Что такое текстовый редактор?
В лекции 14 мы обсуждали приемы автоматической обработки текстов, с помощью которых пользователь может избавить себя от бессмысленной ручной работы. Себе он оставляет только творческие задачи – написание командных или sed, awk, Perl, Python ... сценариев, конфигурационных файлов и вообще всего, что можно назвать текстовой частью проекта (см. лекцию 14). Даже в этом идеальном случае ему необходим инструмент творческой, а не автоматической работы с текстом. Но еще чаще приходится вручную изменять проекты, потому что никакая программа никогда не бывает сразу правильной (и никакой способ ошибаться нельзя полностью автоматизировать, кроме ошибок самой автоматизации).
Итак, текстовый редактор в UNIX – это, прежде всего, инструмент создания и изменения текстового проекта, а во вторую очередь – инструмент создания текста "вообще", например письма или романа (далее мы, для краткости, вместо "текстовый редактор" будем иногда говорить просто "редактор", понимая под этим не профессию, а инструмент).
Учитывая проективную организацию UNIX, популярность текстового редактора как инструмента может уступать разве что популярности интерпретатора командной строки: везде, где есть необходимость строить мини-проекты, которые умещаются в командную строку, должна быть возможность создавать и проекты побольше, которые в нее не умещаются. Это означает, что от организации текстового редактора в системе зависит столько же, сколько от организации управляющего интерфейса, так что впечатление об удобстве работы в системе человек составляет в немалой степени и по результатам взаимодействия с текстовым редактором.
Текстовый редактор должен быть доступен так же, как командная строка. В UNIX это означает, что для организации взаимодействия с человеком редактору следует рассчитывать на терминал и его возможности. Если бы редактор был чем-то большим, чем средством создания и изменения проекта, – например, средством отображения модели проекта – такое ограничение стало бы для него катастрофическим. Но работа с текстом с помощью линии передачи текстовой информации и устройств ввода/вывода текстовой информации – вполне очевидное действие. К тому же, сохраняя способность работы на любом терминале, даже самом бестолковом, современный редактор, как и современный shell, имеет законное право пользоваться стандартными свойствами современного терминала.
Тем не менее универсальный текстовый редактор должен отображать текст только текстовыми средствами, безо всяких дополнительных требований к аппаратуре. Что еще важнее, команды со стороны пользователя тоже в идеале должны быть только текстовыми, без расчета на то, что устройство ввода – клавиатура – обзаведется, помимо текстовых, еще и управляющими клавишами, вроде Replace, Go to, Save и т. п. Из управляющих можно полностью рассчитывать только на клавишу "перевод строки". В UNIX можно еще доверять описанным в лекции 8 средствам редактирования, предоставляемым самой терминальной линией. Если ориентироваться на любое возможное терминальное устройство, большего требовать нельзя.
Построчный редактор Ed
Таким жестким условиям удовлетворяет построчный текстовый редактор ed. Построчным он называется, во-первых, из-за того, что не меняет построчного режима работы терминальной линии, а во-вторых, из-за того, что при работе показывает ровно одну строку редактируемого файла (эта строка называется текущей и именно к ней применяется большинство команд).
Редактор ed устроен очень похоже на sed, описанный в лекции 14: он управляется текстовыми командами редактирования, снабженными контекстными адресами. В целом работа с ed по отношению к работе с sed – то же, что работа в командной строке shell по отношению к программированию на нем. В ed есть уже известные нам операторы s, d, p и некоторые другие команды sed, например i (insert) и a (append). Конечно, к операциям sed добавлены и другие, необходимые для интерактивной работы: операции копирования и перемещения строк текста, смены текущей строки (операции перемещения по тексту) и некоторые другие. Работа с файлами перестроена для удобств командного режима: команда w (write) записывает не строку, а весь файл (если не указан контекстный адрес), причем допустим вызов w без параметров: это приводит к записи текста в текущий редактируемый файл. По аналогии с w существует команда r (read), которая вставляет содержимое указанного файла после текущей строки, и команда e (edit), которая открывает новый файл для редактирования.
Кое-какие команды sed пришлось заменить, не нарушая принцип аббревиативности. Например, команда g в ed означает global (как модификатор g в sed), и формат у нее такой: 'g/РВ/команды_ed/'. Эта команда дает возможность выполнять команды_ed только в строках, удовлетворяющих регулярному выражению РВ. Если не указан контекстный адрес, g ищет среди всех строк файла. Есть обоснованное подозрение, что утилита grep получила имя после создания ed, потому что делает она то же, что и команда 'g/re/p', где re – это regular expression.
В ed добавлено несколько полезных свойств в контекстный адрес. Во-первых, появилось удобное обозначение текущей строки – "." . Во-вторых, любой простой контекстный адрес можно дополнить смещением – положительным или отрицательным числом, сдвигающим область действия команды на несколько строк вперед или назад по тексту. Так что вполне допустима команда '/BEGIN/+1,/END/-1d', удаляющая все между строками с BEGIN и END, или команда '.,/обед/s/.*/копать/' (по-хорошему, чтобы не пропустить обед, надо было написать '.,/обед/-1s/.*/копать/').
Нельзя не отметить, что ed как-то уж слишком подчиняется радикальным требованиям к терминальному устройству. В этом редакторе можно с легкостью работать даже на экзотической консоли компьютера PDP-7, состоящей из алфавитно-цифровой клавиатуры и алфавитно-цифрового же печатающего устройства (так это же просто электрическая печатная машинка!). С той же легкостью и удобством ed запускается на приличном терминале, но именно что с той же легкостью и с тем же удобством. А ведь даже shell в его нынешнем виде умеет пользоваться общими для многих терминалов свойствами: управляющими последовательностями или функциональными клавишами (уж как минимум теми, на которых нарисованы стрелки).
Конечно, когда-то и shell этого не умел. Главным препятствием было то, что разные терминалы имеют разные управляющие последовательности и возвращают разные последовательности символов при нажатии на функциональные клавиши. И вообще, не похожи друг на друга. Именно для преодоления этого препятствия были собраны базы данных по терминалам – termcap и terminfo – и создана библиотека работы с терминалом curses. Говорят, что curses была написана специально для создания экранного текстового редактора vi.

Проблема управляющего ввода
Однако даже с помощью curses не восполнить бедности управляющего ввода. Управляющий ввод – это такое взаимодействие человека и машины, когда человек командует ею, а не просто передает данные (скажем, текст). И если практически вся клавиатура предназначена для ввода данных, то как с ее же помощью передавать команды?
Можно считать (с некоторой натяжкой, кстати), что на клавиатуре терминала есть клавиши со стрелками. На многих терминалах имеются функциональные клавиши, помеченные F1, F2 и т. д.. Часто встречаются терминалы с клавишами Page Up и Page Down. Всего этого явно недостаточно для того, чтобы редактирование было удобным и быстрым. Нужно или искать компромисс, или выдумывать концепцию Управляющего ввода, не использующую понятие управляющих клавиш.
Компромисс может быть достигнут тремя способами. Можно ориентироваться на какой-нибудь определенный терминал (или даже самостоятельно его изготовить), на котором будут все нужные управляющие клавиши. При этом редактор немедленно перестает быть универсальным и исчезает вместе с терминалом. Можно понадеяться на F1, F2 и т. д., поскольку, если они есть, то уж в количестве не менее восьми штук. Каждой функциональной клавише приписывается несколько функций редактирования, и пользователь старательно их запоминает. Нам доводилось встречать изготовленные типографским способом бумажки с названиями этих функций, которые следовало наклеивать на клавиатуру^ тем самым сводя задачу к предыдущей. Еще курьезнее были терминалы с программируемыми надписями над функциональными клавишами: на такой терминал можно было вывести управляющую последовательность, и надпись над F2 менялась, скажем, на Save!
Третий вариант – использовать в качестве управляющих непечатные символы (из тех, что добываются при помощи клавиши Ctrl) и основанные на них последовательности. Сам по себе этот третий вариант не лишен смысла, потому что таким образом можно вернуть совсем уж было утерянный принцип аббревиативности. Верно, так и рассуждали те, кто дал клавиатурному модификатору такое имя – Control, то есть "Управление". Все бы ничего, но многие команды приходится вводить одной рукой: другая удерживает Ctrl!
Клавиатурные модификаторы используются популярной в UNIX-сообществе интегрированной средой редактирования GNU Emacs. Emacs – сложное и очень многофункциональное сочетание текстового редактора и всего остального, что может понадобиться пользователю (в особенности – программисту): от файловой оболочки до почтового клиента. В Emacs предполагается, что кроме клавиатурного модификатора Ctrl есть еще один – Meta (такие терминалы и в самом деле встречаются). Нажатие на Ctrl оставляет от кода символа первые пять битов, так что ^A – это символ с ascii-кодом 1, а нажатие на Meta, наоборот, добавляет к коду символа знаковый бит, так что Meta+a – это символ с кодом 225. К сожалению, в неамериканской кодировке такие символы вполне могут означать букву, а не быть управляющими. Например, в кодировке KOI8-R 225 соответствует русское прописное А.
Самые нужные команды – односимвольные, они состоят из нажатия Ctrl или Meta вместе с каким-нибудь символом. В них уже можно соблюсти принцип аббревиативности: для перемещения курсора (если не вспоминать о "стрелках") служат клавиши ^B, ^F, ^P и ^N – от backward char, forward char, previous line и next line соответственно, а перемещение по словам осуществляется при помощи Meta и тех же f и b.
Если Meta нет – не беда, вместо него можно использовать ESC, тогда команды удлинятся на одно нажатие. Большая часть команд Emacs – многосимвольные, начинаются они со специальных Ctrl-клавиш (самая частая – ^X), после которых можно набирать что угодно – это будет управляющая последовательность. Чем реже команда требуется, тем она длиннее, это помогает соблюсти З. В составных командах тоже можно соблюдать аббревиативность, можно попробовать навести некоторую систему: какой тип команд начинается на Ctrl, какой – на Meta, а какой – на ^X.
Однако стройной системы в Emacs не получилось – прежде всего, по вине его главного достоинства: Emacs – легко расширяемый редактор. Дело в том, что весь редактор написан на диалекте LISP – одного из самых старых и самых теоретически продуманных языков программирования. LISP – интерпретатор, и вдобавок – язык высокого уровня, реализующий концепцию функционального программирования. Это, между прочим, означает, что дополнения к Emacs будут строго следовать З: максимум интеллектуальной работы, при небольшой длине текста. Поэтому каждый член Emacs-сообщества, скорее всего, уже немножко автор Emacs. Пословица о семи няньках к Emacs, к счастью, неприменима, но даже в списке основных авторов стоит 165 фамилий. Подробно о LISP и Emacs рассказано в [2] и [36].

Экранный редактор Vi
Vi называется экранным редактором, поскольку использует в качестве рабочего поля весь экран терминала, а не одну строку, как ed. Экран задействован большей частью для отображения редактируемого текста, а одну строку – последнюю – vi отводит для общения с пользователем в стиле ed. Помимо понятия текущей строки в vi появляется текущая позиция в строке, указателем на которую работает курсор (между прочим, до курсора создатели терминалов тоже додумались не сразу: ведь в пишущих машинках его не было). Все команды vi применяются к тексту именно в том месте, где находится курсор. Все это так похоже на устройство многих современных текстовых редакторов, что в объяснении не нуждается.
Три режима
Создатели vi не пошли на компромисс, а решились на смелый шаг: отказаться от традиционной концепции Управляющего ввода (впрочем, тогда она не была столь уж традиционной; скорее наоборот: концепция управления vi очень напоминает традиционную для того времени концепцию управления ed). Этот шаг, пожалуй, самый трудный и при освоении vi. В vi предусмотрено три режима работы: режим командной строки, практически повторяющий возможности ed, командный режим, в котором нажатие на любую клавишу означает какую-нибудь команду редактору, и режим вставки, в котором нажатие на клавишу с печатным символом приводит к вставке этого символа перед курсором (как в обычных текстовых редакторах). Можно представить дело так, как если бы на терминале имелась клавиша Control Lock, и в активном ее состоянии все символы были бы командными, а в неактивном – обычными.
Основной режим работы vi – командный, а не режим вставки. Суть его в том, что, как было сказано ранее, большую часть времени пользователь UNIX проводит, изменяя проекты. Причем когда он создает проект, все, что требуется от редактора, – не мешать. Набивает программист текст программы – и пусть набивает, в режиме вставки; ему при этом почти ничего не нужно. А вот для исправления ошибок, для ориентации и перемещения по тексту, для преобразования необходим творческий подход и соответствующие средства редактирования. Следовательно, прежде всего, пользователю должны быть доступны команды редактирования, а перейти – одной командой – в режим вставки и понабивать текст будет не так уж утомительно.
Итак, в начале работы vi находится в командном режиме. Весь экран, кроме последней строки, занят текстом, и каждое нажатие клавиши выполняется как команда. Соответствующие печатные символы при этом не отображаются – незачем, это только собьет с толку; лучше сразу увидеть результат. Например, команда x удаляет символ под курсором, и ничего нагляднее собственно удаления не придумаешь. Аббревиативность этой команды основана не на названии, а на внешнем виде: x означает "поставить крест". Кстати, команда X удаляет символ перед курсором, т. е. x действует как Delete, а X – как Backspace.
Запомним правило синонимов: прописная буква выполняет ту же команду, что и строчная, но несколько иначе. Это правило позволяет сократить количество запоминаемых сущностей – сообразно У.
Для перехода в режим вставки предусмотрены две простые команды: i (insert) – для вставки текста перед курсором, a (append) – для вставки после курсора. Согласно правилу, A тоже переводит vi в режим вставки, но при этом перемещает курсор в конец строки: чаще всего именно добавление текста в конец строки и бывает нужно. А I перед включением режима вставки перемещает курсор в начало строки, причем не в самое начало, а в то место, откуда начинается текст, – на первый неразделитель. Команда особенно полезна, когда текстовый файл размечен отступами (а в программах это сплошь и рядом). Еще одна команда – o (open) – вставка текста в новую строку, которая добавляется после текущей. O ведет себя так же, только строка добавляется перед текущей.
Режим вставки – некомандный, в нем доступно очень мало команд редактирования и (в ортодоксальном vi) никаких команд перемещения по тексту. Обычно vi подражает терминальной линии: есть команды удаления только что введенного символа, слова и всей строки. Единственная дополнительная команда нужна, когда используется автоматическое добавление отступа (т. н. autoindent; при редактировании файла, размеченного отступами, – например, программы – без этого обходиться неудобно). Если vi добавил, скажем, 18 пробелов отступа, а вложенный блок текста закончился, потребуется переместить курсор в позицию предыдущего отступа (например, 12-ю). Вместо того чтобы 12 раз нажимать пробел, лучше использовать ^D (автоматический отступ включается специальной переменной настройки vi: :se autoindent, а величина сдвига з адается другой переменной: :set shiftwidth=6).
Для выхода из режима вставки используйте клавишу "Escape". Начинающим пользователям vi рекомендуется в случае потери ориентации немедленно жать на Esc: это приведет vi в исходный – командный – режим редактирования. Еще одна команда, ^C, вместо ожидаемого аварийного выхода из редактора вызовет только аварийный останов текущей команды: vi по-своему обрабатывает сигнал TERM.
Последнюю строку экрана vi оставил для диалога с пользователем. Во-первых, в ней vi выводит информационные сообщения, а во-вторых, использует ее под командную строку. Чтобы перейти в режим командной строки, надо нажать ":". Курсор переместится вниз экрана, и появится подсказка ":". Вводимое в режиме командной строки отображается на экране, и это правильно, потому что команды данного режима обычно довольно длинные: содержат имена файлов, регулярные выражения или цепочки команд редактора ex. Сигналом об окончании команды служит, как и в ed, перевод строки.
Редактором ex называется построчная ипостась редактора vi. Собственно, ex – это vi, постоянно находящийся в режиме командной строки. Если в vi в командном режиме выполнить команду Q, он превращается в ex, а ex превращается в vi по команде vi из командной строки. Ex существует на случай совсем уж тупого (т. н. dumb) терминала, работа с которым в экранном режиме невозможна. В ex/vi сохранились многие команды ed: e, w и r, s (поиск с заменой!) и некоторые другие. Слегка развилось понятие контекстного адреса. Самая главная команда ex/vi – команда выхода из редактора, q (quit). Так как это – команда ex, в vi ее нужно вводить в режиме командной строки, после ":". Если отредактированный текст не записан в файл, vi не подчинится такой команде, сообщая, что файл изменен и не сохранен. Если сохранять исправления не нужно, можно усилить команду восклицательным знаком: :q!.
Таково правило усиления команд командной строки: если после файловой команды поставить "!", vi выполнит ее во что бы то ни стало. Помешать может только ограничение доступа или невозможное имя файла. На случай, когда вы совсем заредактировали текст, но в файл еще не записали, полезна команда :e!.
Для записи в файл используйте команду :w; этой команде можно задать контекстный адрес и (или) имя файла, чтобы записать указанный диапазон строк в файл с этим именем. Если vi сопротивляется – вникните в его аргументацию или используйте :w!. Можно редактировать несколько файлов по очереди, для этого надо запустить vi файл1 файл2 ... и использовать для переключения между ними команду :n (next; с параметром–именем файла эта команда работает аналогично :e) и :rew (rewind). Удобнее всего работать с двумя файлами, потому что специальное имя # обозначает предыдущий отредактированный файл, а :n#Enter имеет еще более короткое сокращение – ^^ в командном режиме.

Перемещение по тексту
Команд в командном режиме немало – почти все буквы и множество сочетаний вида Ctrl+буква. Даже для перемещения влево, вниз, вверх и вправо на одну позицию зарезервированы буквы hjkl. Это, конечно же, на случай, если клавиши-стрелки у терминала отсутствуют или выдают невесть что. Клавиши h и l означают соответственно "влево" и "вправо" (вместо них можно использовать привычные Backspace и пробел), клавишу j можно рассматривать как крючок вниз; тогда k не нуждается в объяснениях. В vi очень много команд перемещения по тексту. Перемещение – это смена точки редактирования, которая чаще всего привязана к какому-нибудь элементу структуры текста: следующее слово, предложение, парная скобка и т. п. Управляемая командой машина может отыскать следующий структурный элемент куда лучше человека, которому свойственно ошибаться.
Например, перемещение по словам – w (word, переход на начало следующего слова), b (back word, на начало предыдущего слова) и e (end, на конец текущего слова) – стоит доверить vi. Словами в этом случае считаются цепочки букв, цифр и знаков "_" (похоже на определение идентификатора в языке Си). Прописные W, B и E считают словами цепочки любых неразделителей (похоже на определение параметра в shell). Перемещать курсор можно по предложениям (команды ")" и "("). Предложения заканчиваются соответствующим знаком препинания и разделителем после него. Перемещение по абзацам – команды "}" и "{"(абзацы разделяются пустой строкой; именно пустой: строка, содержащая одни только пробелы или табуляции, не подходит).
Поиск шаблона в тексте – тоже команда перемещения. Задать шаблон и поискать его можно с помощью команды "/". Для ввода шаблона vi использует командную строку, чтобы пользователю было видно, что он набирает. Шаблон – это, конечно, регулярное выражение, но можно выключить настройку magic (:set nomagic), тогда любой символ в шаблоне будет считаться обычным. Vi ищет вперед по тексту; если шаблон не найден, выводится сообщение и поиск продолжается с начала файла. Поиск назад по тексту задается командой "?". Повторный поиск того же самого шаблона в ту же сторону – команда n (next), а поиск того же шаблона в другую сторону – N.
Любая команда vi может иметь множитель. Множитель – это число, которое пользователь набирает в командном режиме непосредственно перед командой, и в результате команда выполняется указанное число раз. Число это не отображается на экране: подобно имени команды, множитель – это часть уже решенной пользователем мини-задачи редактирования; ее внешний вид имеет значение только для редактора, пользователя же интересует результат. Например, команда 10x удалит десять символов справа от курсора, а команда 7+ переместит курсор на семь строк вперед ("+" и "-" – команды перемещения на начало следующей или предыдущей строки). Команда G (Go) без множителя – переход на последнюю строку файла (незаменима при дописывании текста), а для перехода, допустим, на строку с номером 33 используется команда 33G.
В любом случае пользователь волен экспериментировать с одной командой, как ему заблагорассудится: даже в самой ортодоксальной версии vi есть команда u – undo. Всякий может ошибиться: вместо 10 набрать 100, вместо z – x или неправильно составить шаблон для поиска с заменой. Если получившийся измененный текст не нравится – надо вернуть его в предыдущее состояние. Отменить можно только одно – последнее – действие с текстом. Если соблюдать некоторую внутреннюю дисциплину и не совершать необдуманных действий, одного уровня должно быть достаточно. В vim – современной версии vi, обладающей массой дополнительных возможностей, все-таки встроили бесконечный undo. На наш взгляд, это компромисс между дополнительным удобством и строгой дисциплиной.
Гнездовые команды
Основные команды редактирования vi – гнездовые. Гнездовая команда в самом простом виде состоит из действия и команды перемещения. В этом случае команда перемещения не изменяет положения курсора, а определяет фрагмент текста, к которому vi применит действие. Например, операция dw (delete word) состоит из действия d (delete) и команды w, в результате удалится одно слово. Другая гнездовая команда – c (change) – аналогична d; единственное отличие – после выполнения c редактор переходит в режим вставки. Это очень важная команда vi, потому что с ее помощью можно исключить одно неудобство, свойственное практически всем текстовым редакторам с упрощенной концепцией управления.
Дело в том, что в типичном текстовом редакторе есть два режима ввода текста – вставка и замена. И в ситуации, когда одно слово надо заменить другим, пользователь должен или сначала удалить это слово (десять раз нажать клавишу Del), а затем в режиме вставки вписать новое слово. Другой вариант – начать вписывать слово в режиме замены, а когда новое станет длиннее старого, переключиться в режим вставки. И в том и в другом случае человек вынужден все время контролировать себя: не удалил или не заменил ли он лишнего. А в редакторе vi для замены слова на что угодно подается команда cw (change word), и оказывается, что самую неинтересную работу редактор уже за вас сделал и уже включил режим вставки; остается только творческая часть – придумать, на что заменять удаленное. Обычный vi поставит (временно) в конце заменяемой области символ $ и при наборе текст до $ будет "заменяться" (на самом деле этот текст уже удален, просто vi до поры не убирает его с экрана терминала), а после – вставляться. В vim такое свойство можно включить одним из значений настройки cpoptions, но по умолчанию он сразу удаляет заменяемый участок текста.
Перемещением в гнездовой команде может быть не только w, а любая команда перемещения. Например, довольно удобны команды вида c/шаблон (изменить текст от курсора до найденного шаблона) или d100G (удалить строки от текущей до сотой). Между прочим, аббревиативность команд vi позволяет читать их полные имена: например, предыдущая команда читается delete 100 Go, а какая-нибудь c7w – change 7 words.
Остроумна гнездовая команда "!". После команды перемещения она спросит в командной строке имя утилиты–фильтра (напомним, что фильтр в UNIX – это программа, которая читает со стандартного ввода и пишет на стандартный вывод). Строки, определяемые командой перемещения, vi передаст этой утилите и результат подставит вместо них. Так что отсортировать все строки до конца файла проще простого: достаточно ввести команду !Gsort. Есть гнездовые команды > и <, которые сдвигают группу строк на один стандартный шаг (vi-настройка shiftwidth).

Vi как проективная система
Виной тому особое умонастроение авторов vi или требования аппаратуры, но в этом редакторе все четыре принципа организации проективных систем соблюдаются безукоризненно.
Предполагается, что процесс редактирования будет проходить в полном соответствии с О и З: "Хорошо подумай, укрепи дух свой и нажми пару клавиш". В отношении О вообще все довольно строго. Например, одноуровневый откат (u). В соответствии с О, каждое изменение проекта должно быть обдуманным решением, по сценарию "подумал – сделал – оценил – (возможно) отменил". А для сценария "сделал – сделал – оценил – отменил – отменил – подумал" в проективных системах почти нет места, и в редакторе vi – тоже. Зачастую нажатия полудюжины клавиш достаточно для разительного изменения текста. Это может быть очень удобно, только если пользователь четко понимает, что делает. Примером может служить 1GdGZZ (ОСТОРОЖНО! Эта команда удаляет весь текст и записывает пустой файл!).
Каким образом соблюдать У в многофункциональной системе – вопрос сложный, однако, на наш взгляд, авторы сделали максимум возможного, чтобы устроить из множества команд подобие пирамиды, о которой говорилось в лекции 2. Показательно "краткое руководство по ex и vi", которое есть во всех BSD-системах (в FreeBSD – /usr/share/doc/usd/12.vi/summary.ascii.gz): оно содержит 14 разделов, посвященных разным типам команд, в каждом из которых описано не больше дюжины операторов (три раздела совсем короткие). Введение гнездовых команд, командная строка, настройки (о которых речь впереди) – все это нацелено на У (и, разумеется, И: ведь так и учиться легче).
По части З авторы vi весьма пунктуальны, вплоть до экономии на нажатиях клавиш. Например, для замены одного символа другим есть специальная команда r (replace). И действительно, в два раза быстрее набрать, допустим, ra ("заменить на a"), чем c aEsc (результат – тот же). X, как можно догадаться, введено вместо dh. А для последовательности команд :wEnter:qEnter (выход с сохранением) придумано аж два сокращения: во-первых, :xEnter (от exit), а во-вторых, совершенно неожиданное, но очень удобное ZZ (из командного режима, всего две буквы).
Неудивительно, что для оперативных изменений внутри строки было выдумано еще несколько команд перемещения. Во-первых, это 0, ^ и $ – переход на начало строки, на первый неразделитель в строке (туда же, куда и I) и на конец строки. Во вторых – команды поиска символа в строке f (find) и t (to). Эти команды работают только внутри строки и ищут только один символ, но зато сразу, без нажатия на Enter. Команда t останавливается перед найденным символом, а f – на нем. Сочетания вроде "ct." (change to ".") очень коротки, а нужны бывают часто. В виде F и T эти команды ведут поиск влево по строке. Наконец, ";" и "," выполняют по отношению к ним ту же роль, что n и N – по отношению к "/". Если под курсором находится скобка – круглая, квадратная или фигурная, открывающая или закрывающая – команда % переместится на парную ей (учитывая вложенные скобки).
Побочным эффектом такой экономии движений оказывается то, что сокращенными командами действительно можно пользоваться! Достаточно подглядеть в упомянутое "краткое руководство" (оно отлично выглядит, распечатанное в три колонки и сложенное гармошкой) и почувствовать, что новый способ быстрее. Кажется, никто еще не проводил исследования, сколько действий при редактировании текста относятся к содержанию, а сколько – к управлению. Несомненно, vi оказался бы чемпионом краткого управления.
Все гнездовые команды подчиняются правилу двойного удара: команда, состоящая из двух одинаковых символов-действий подряд, применяется к текущей строке. Например, dd удаляет текущую строку, а >> сдвигает ее вправо. Кстати, правило синонимов срабатывает и в гнездовых командах: D и C работают как сокращения от d$ и c$. Экономия движений!

 

 
На главную | Содержание | < Назад....Вперёд >
С вопросами и предложениями можно обращаться по nicivas@bk.ru. 2013 г.Яндекс.Метрика