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