Жемчужина 2. Инструменты разработки: эзотерический Vi

Изображение пользователя Школяр.



Воистину слово «эзотерический» тут не лишнее. Хотя в современном исполнении консольный текстовый редактор Vi утерял некоторые свои таинственные черты (например, текстовый курсор в нем уже можно перемещать при помощи стрелок, а не при помощи колдовских сочетаний в середине буквенной клавиатуры, и клавиши Backspace и Delete работают так, как им положено), он все-таки остается загадочным, эзотерическим и совершенно не нужным средством для редактирования текстовых файлов.
Последний пассаж относительно ненужности — это такая шутка юмора. Пока вы делаете «жесты», пальцами переворачивая фотографии на сенсорном экране, и наслаждаетесь динамической интерактивностью современного графического интерфейса пользователя, необходимости в Vi нет никакой. Если надо будет отредактировать текстовый файл, на нем надо будет просто сделать «тач» - мышью, стилусом или пальцем,- и он откроется. Сезам отдыхает. Однако при глубоком погружении в компьютерные технологии с элементами администрирования оказаться вдруг без графического интерфейса пользователя — раз плюнуть. Перефразируя Жванецкого, одно неверное движение — и вы уже в консоли. А консоль — это окно черное, пустое, с одинокой командной строкой внутри. И как тут отредактировать текстовый файл — известно только Великим Гуру. Ну или тем, кто знает, что такое Vi. Потому что если в UNIX\Linux системе нет никакого редактора текста, Vi там все равно всегда есть. Вот почему мы начинаем исследование инструментов редактирования файлов Perl именно с этого текстового редактора.

Как запустить Vi

Вы не поверите, но надо в строке приглашения набрать vi и нажать Enter. Vi запустится, и будет это выглядеть примерно так:







Попытки начать набирать текст оставят немного странное впечатление, но текст набрать в конце концов получится (если вы будете достаточно терпеливо нажимать на разные клавиши). После чего вы захотите сохранить текст в файл на диске, и покинуть непонятное окно. Однако это окажется еще более проблематичным: привычное Ctrl+C или Ctrl+X, или F10, или любое другое интуитивно понятное сочетание клавиш работать не будет. Не сработает даже многократное нажатие на Escape. Придется проигнорировать интуицию и прочитать дальше этот текст.

Запуск Vi

>vi — запускает Vi, выводит на экран окно справки
>vi my.txt — запускает Vi, загружает в редактор и выводит на экран содержимое файла my.txt. Если файл с именем my.txt отсутствует, то он будет создан, и (пустой) открыт в Vi.

Режимы Vi

Vi уникален на фоне практически всех других известных вам текстовых редакторов тем, что «отличает» процесс редактирования от процесса ввода команд. Когда вы набираете текст на клавиатуре, добавляя его к тексту на экране, удаляете символы при помощи клавиши Delete или Backspace — это редактирование. Если же вы хотите сохранить набранный текст, открыть другой файл, скопировать и вставить фрагмент или выйти из Vi, то это уже команды. Такой способ работы не является недостатком данного текстового редактора, напротив, он придает Vi особенную гибкость во взаимодействии с другими консольными командами и программами обработки текста. В этом пособии я не стану погружаться в глубины и вникать в тонкости, но просто отмечу: Vi умеет гораздо больше, чем кажется на первый взгляд.

Переключение режимов

После запуска Vi находится в режиме ввода команд. Для переключения в режим редактирования достаточно нажать одну из следующих клавиш:
a, A, i, I, o, O, c, C, s, S, R или клавишу Insert.
Нажатие на клавишу Insert в режиме редактирования также переключает Vi из режима вставки в режим замены и обратно.
Тот факт, что вы находитесь в режиме редактирования можно установить по наличию надписи Insert или Replace в левой нижней части окна Vi (см. рисунок ниже):






Из режима редактирования в режим команд переключение происходит нажатием клавиши Esc. Если вы вдруг засомневались, в каком режиме находитесь, просто дважды нажмите клавишу Esc, и будьте уверены, что теперь-то вы точно находитесь в режиме ввода команд.

Выход из Vi

Выход из редактора производится в режиме команд. При этом доступны следующие команды (Внимание! запись :q означает, что надо сначала ввести :, и этот символ появится в нижней строке экрана Vi, затем нажать q, который так же появится в нижней строке экрана, и затем выполнить команду, нажав клавишу Enter).
:q — выйти из Vi
:q! — принудительный выход из Vi даже в том случае, если в редакторе находится несохранённый текст
ZZ — выйти из Vi. Если в редакторе есть несохранённый текст, сохранить его и затем выйти.

Редактирование текста

Текст в Vi можно редактировать как в режиме редактирования, так и в командном режиме.
В режиме редактирования осуществляется НАБОР текста. То есть вы нажимаете клавиши, и соответствующие символы появляются на экране в позиции текстового курсора. Если в нижней части экрана отображено слово Insert происходит вставка символов со сдвигом существующих, а при отображении слова Replace — замена существующих символов теми, которые вы вводите. Посимвольное удаление осуществляется, как и положено, клавишами Backspace и Delete. Клавиши управления курсором (клавиши со стрелками) — управляют курсором, перемещая его в соответствующем направлении.
В командном режиме выполняются такие операции редактирования, как вырезание (копирование) и вставка, удаление слов или строк, а так же операция отмены сделанных изменений. Одной из характерных особенностей Vi, к которой надо привыкнуть, является отсутствие операции выделения. На самом деле, в таких текстовых процессорах как OpenOffice Writer или Microsoft Word, да и в других программах с развитым графическим интерфейсом пользователя, чтобы что-то с чем-то сделать, надо указать программе, над чем вы хотите выполнить операцию. И это указание делается при помощи выделения фрагмента текста или другого объекта. Но при работе на монохромных мониторах (для которой, в частности, и создавался в свое время Vi), где отсутствует инверсия текста, выделить что-то не так-то просто. Текст или есть, или его нет, и третьего не дано. Поэтому в Vi принято вместо выделения указывать редактору объекты для обработки при помощи команд. Вы просто сообщаете Vi: «Я хочу удалить три слова после текстового курсора», а он делает это. Вот минимально необходимый набор команд для этих манипуляций (еще раз напомню — все это делается в командном режиме):

Перемещение

w — перемещение на слово вперед. Слово в данном случае это последовательность символов, завершенная или пробелом (переводом строки), или другим символом-разделителем (например, двоеточие, или точка с запятой).
b — на слово назад
e — в конец слова
) — на следующее предложение
} — на следующий абзац
( — на предыдущее предложение
{ — на предыдущий абзац
W — вперед на слово, отделенное пробелом
B — назад на слово, отделенное пробелом
E — в конец слова, отделенного пробелом

Удаление, копирование, вставка

d — удаление. Обычно используется с дополнительными аргументами (d[аргумент]). В результате d удаляет то, на что перемещает аргумент (см. прошлый раздел). Например, dw — удалит следующее за курсором слово, поскольку w перемещает на слово вперед, а d← удалит один символ слева от курсора, ибо именно на один символ влево сдвигает курсор нажатие стрелки . При удалении слов и символов команда d аккуратно обходит символы-разделители, и их не удаляет.
dd — удаление текущей строки.
d↑ — удаление строки выше, а d↓ — удаление строки ниже.
Числовой аргумент перед d позволяет задать, сколько раз надо повторить команду удаления (числовые аргументы можно задавать, кстати, перед большинством команд Vi). Например, 3d↑ удалит три строки выше текущей.
yy — копирование текущей строки в буфер. Значит 4y↑ - копирование в буфер четырех строк выше текущей.
p — вставить после курсора содержимое буфера
> — сдвиг вправо (вставляет символы табуляции)
< — сдвиг влево (удаляет символы табуляции)
u — отменить сделанные изменения. Воспринимает числовой аргумент, и отменяет изменения на несколько шагов назад.

Сохранение файлов

:w — сохранить изменения
:w! — форсированная запись, перезаписать не спрашивая
:w имя — сохранить в файл с таким именем
:w! имя — сохранить в файл с таким именем, перезаписать существующий файл

И это все?

Нет, это часть, малая часть того, что можно было бы рассказать о консольном редакторе текста Vi. Это своего рода спасательный круг для того, кто оказался в консоли без средств графического интерфейса пользователя, и решил в этот момент отредактировать скриптик на языке Perl. Как и всякая свободная и открытая система, эта программа быстро обросла поклонниками, любителями и фанатами, которые непрерывно ее совершенствуют, расширяют функциональность, делают ее все круче и круче. И если у вас есть много свободного времени и толика любознательности, вы получите отменное удовольствие, если решите повозиться с этой программой.
Можете меня спросить — как лично я отношусь к Vi? Я отвечу прямо: отношусь к Vi как к катанию на римской колеснице, с лавровым венком на голове и под восхищенные крики толпы. То есть прикольно, то есть один-два раза подорваться на такое можно. Но ездить на римской колеснице на работу каждый день, по хайвею, за сотню почти что километров... Нет-нет, я лучше на каком-нибудь современном транспорте.
И в то же время — я помню об этом — может так случится, что кроме колесницы транспорта не будет. А значит — надо уметь.
Если вы хотите постичь искусство управления колесницами более глубоко, широко и полно, чем это изложено в данной главе, то вот вам парочка приятных ссылок на онлайн-ресурсы:
http://www.opennet.ru/man.shtml?topic=vi&category=1&russian=0
http://www.emanual.ru/download/2986.html
Если говорить о локальных ресурсах, то в altlinux есть два хороших выбора:

  1. набрать в командной строке man vim и получить хорошую справку на русском языке (да-да, не так страшен man, как его малюют, в альте почти все маны - русские).
  2. установить, используя Synaptic, пакет vimtutor, и затем в строке приглашения терминального окна набрать команду vimtutor. Великолепный пошаговый учебник, и снова - на русском языке!

Вы спросите - почему vim, а не vi? vim является расширенной и улучшенной версией vi, и все то, что будет сказано в этих двух источниках про vim работает и в vi тоже.
Наслаждайтесь!

Упражнения Жемчужины 2

Упражнение 1.

Запустите программу Терминал (Кнопка Приложения>Стандартные>Терминал).
Запустите Vi следующей командой (для разнобразия запустим улучшенную версию): vim /usr/share/vim/doc/quickref.txt
На экран будет выведено содержимое файла quickref.txt, открытое в редакторе Vim. Поскольку файл этот не наш, присвоим его, сохранив его в домашнем каталоге с другим именем:
:w ~/test.txt
Теперь мы получили в свое распоряжение великолепный текстовый полигон. Поэкспериментируйте на нем в свое удовольствие. Для начала удаляйте символы, слова, строки, снизу, сверху, справа, слева. Добейтесь того, чтобы в файле осталось строк 5-6. Если в ходе экспериментов вы случайно доудаляетесь до пустого файла, воспользуйтесь командой u и отмените последние удаления.
Скопируйте в буфер две-три строки (2yy).
Вставьте их. Затем отмените операцию.
Удалите ВСЕ.
Переведите Vim в режим набора текста. Наберите следующие бессмертные строки:
Однажды в студеную зимнюю пору
Я из лесу вышел — был сильный мороз.
Гляжу, поднимается медленно в гору
Лошадка, везущая хворосту воз.

Сохраните файл. Покиньте Vim. Снова запустите Vim. Откройте в нем сохраненный файл, убедитесь, что стихи на месте.
Изображение пользователя derugu.

Вот три скриптовых языка

PHP, Perl и JavaScript.

PHP для программ WEB-направленности на стороне сервера.
Ява - примерно тоже на стороне клиента

А Перл для чего?

Изображение пользователя Школяр.

Три языка

php - хотя может быть использован, как движок для интерпретации скриптов в консоли, однако более ориентирован на создание интерактивных web-страниц
javascript (не имеет никакого отношения к языку java) - изначально был разработан для создания интерактивности на клиентской стороне, однако в технологиях asp.net широко используется и на серверной части.
perl - изначально разработан для как скриптовый язык для обработки текстов. Ныне используется ДЛЯ ВСЕГО. В первой жемчужине я написал, что самое частое применение Perl это 1. автоматизация установки 2. административные скрипты 3. автоматизация тестирования

Изображение пользователя derugu.

vi - эхе-хе...

Даже после почти 5 лет с Линуксом и 2-х лет с ОС Икс рука тянется к mc и его редактору. Виндовское и Досовское детство сказывается.
PS Попробовал набрать vi в OS X - работает!

Изображение пользователя Школяр.

mcedit будет

в следующей жемчужине. Эту тоже надо поправить, black тут сделал мне внушение, показал кое-какие недостатки, надо будет исправить