Компания ALT Linux
Опубликован: 14.12.2004 | Доступ: свободный | Студентов: 12604 / 1647 | Оценка: 4.19 / 3.84 | Длительность: 18:18:00
ISBN: 978-5-9556-0019-1
Лекция 16:

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

< Лекция 15 || Лекция 16: 12345 || Лекция 17 >

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

Конечно, разработчики vim не оставили без внимания режим командной строки, который в vi устроен так же примитивно, как в самом старом shell. Подобно новым командным интерпретаторам, *Command-line-mode* позволяет редактировать вводимую командную строку с помощью "стрелочек" и, что еще важнее, позволяет работать с историей команд. Поиск по истории организован по принципу, придуманному в tcsh: если вы набрали начало команды, по клавише "стрелка вверх" vim будет показывать только те команды из истории, что начинаются так же. Для хранения истории и состояния буферов используется файл $HOME/.viminfo. Переменная настройки viminfo определяет, что именно и в каком объеме запоминается в этом файле.

Подобно tcsh (а также emacs ), в командной строке vim поддерживается достраивание: вы набираете начало текста, нажимаете Tab, и редактор сам подбирает соответствующее окончание. Достраивание зависит от контекста: по умолчанию Tab ищет подходящее слово в списке команд, после файловой команды (вроде :w или :split ) – среди файлов, после :tag или :help – среди соответствующих ярлыков, после :set – среди настроек, а после :map – среди макрокоманд. Если достраиваемая строка достигла точки выбора (возможно несколько вариантов), способ этого выбора управляется настройками wildmode ( wim ) и wildmenu ( wmnu ) – от упрямого поиска до вывешивания разноцветного текстового меню, в котором с помощью "стрелочек" можно выбрать нужный вариант.

Достраивание возможно и в режиме вставки. Раздел *ins-completion* описывает десяток разных команд достраивания ; все они начинаются с ^X (видимо, от expand, "расширять"), за которым следует команда, определяющая тип достраивания. Чаще всего используются ^X^Fдостраивание имен файлов ( file ) и ^X^P ( ^X^N ) – достраивание до слова, встречающегося в этом же тексте до ( previous ) или после ( next ) курсора. Вместо двух последних команд режима вставки можно использовать ^P и ^N. Кроме того, возможно достраивание по разным типам словарей, по ярлыкам, по командам командного режима и т. д.

Альтернативы

Подобно тому как не существует единого стиля оформления программы на Си, не существует и единого стиля работы самого vim. Все характеристики, отличающие vim от vi, в том числе и представление текста на экране, авторы постарались сделать очень гибким, чтобы каждый мог подстраивать поведение редактора под свой вкус. Внешним видом и представлением текста управляет великое множество настроек, но те, что отличают поведение двух редакторов друг от друга, собраны в переменной настройки cpoptions ( cpo ) (compatible options, параметры совместимости). Устройство cpoptions, как и formatoptions, флаговое: наличие в ее содержимом определенного символа означает включение (или выключение) какого-нибудь измененного поведения редактора. Для флаговых настроек в vim выдумали даже специальные варианты команды :set – *:set+=* для добавления флага в переменную и *:set-=* для удаления его оттуда.

Например, флаг cpoptions u делает команду u (undo) одноуровневой, как в vi, а флаг n включает представление длинных строк в стиле vi (продолжение строки выводится с начала экрана, а не с позиции номера строки, как это принято в vim ). Добавить оба флага можно командой :set cpoptions+=un. Флаг W запрещает что-либо записывать в файл, защищенный от записи (это только на первый взгляд звучит нелепо: ведь системный администратор чаще всех пользуется текстовым редактором, и хорошо бы запретить такое даже ему – пока он собственноручно не скажет :se cpo-=W ).

С командами vi авторы vim обращались весьма осторожно, не изменив ни одну, за исключением разве что "~". Для новых команд были использованы буквы и управляющие последовательности, которые не нашли применения в vi. Множество команд перемещения начинается с префикса [ или ] (в ортодоксальном vi были только команды [[ и ]], все прочие символы после скобок считались ошибочными). Стандартные команды vi начинают работать несколько иначе, если перед ними поставить префикс g.

Среди прочих модифицированных команд есть и довольно полезные: команды gj и gk, альтернативные j и k, перемещают курсор на следующую или предыдущую строку на экране. Это значит, что при работе со строкой длиной, например, в три ширины экрана, gj переместит курсор от начала строки на начало ее второй трети (на экране это выглядит как движение вниз). "Настоящая" j работает со строками текста: она перемещает курсор из позиции "строка M, колонка N" в позицию "строка M+1, колонка N", так что все содержимое длинной строки будет по j пропускаться. Помощь по модифицированным командам доступна по *[* и *g*.

Свертка и сравнение

При работе со структурированным текстом часто возникает необходимость сделать из него нечто вроде оглавления – для того, чтобы оценить текст в целом. Обычно с этим справляются специальные программы, однако их не всегда удобно применять по ходу редактирования. Кроме того, хочется работать не со вторичной информацией, не с дайджестом, а с самим файлом, только представленным в свернутом виде. Если представить себе файл в виде бумажной ленты с текстом поперек, то такая свертка будет похожа на складывание ленты "гармошкой" (см. замечательный пример ASCII-art в учебнике по vim, *28.1* ). Это напоминает тех "неведомых зверюшек", что мы рисовали в детстве на полосках бумаги: в свернутом виде – голова да ноги, а в развернутом между головой и ногами появляются и плечи с крыльями, и руки, и брюшко, и прочие части тела. Именно такая процедура свертки в vim называется *Folding*.

Можно задавать "линии сгиба" вручную, но лучше, конечно, доверить эту работу редактору: vim сам умеет их проводить, руководствуясь глубиной отступа (отлично смотрятся программы на Python ), регулярными выражениями, настройками подсветки синтаксиса, сравнением с другим (похожим) файлом, а если ничего не помогает – специальными метками, расставленными в тексте. Свертка весьма удобна при редактировании программ (особенно чужих), документации, файлов настройки и тому подобного. Простой способ увидеть свертку в действии – привязать ее к глубине отступа: :set foldmethod=indent. Команда zC (Close) закрывает текущую свертку (остается только линия сгиба с информацией о том, сколько строк пропущено), команда zO (Open) – раскрывает ее, а команды zM (Make) и zR (Reduce) – закрывают и раскрывают свертки по всему файлу. Для каждого файла можно иметь несколько размеченных карт свертки, которые можно записывать по команде :mkview имя_файла, а считывать – по команде :loadview имя_файла.

Частный случай использования свертки – применение vim вместо утилиты diff(1). Передаем имена сравниваемых файлов программе vimdiff (это ссылка на vim ), и редактор запускается в режиме сравнения: два окна с файлами, в которых одинаковые строки свернуты, а остальные – подсвечены сообразно различиям. Режим *vimdiff* – не просто цветной diff, это еще и удобный инструмент слияния двух слегка различных версий одного файла.

Задача слияния версий постоянно встает перед человеком, вынужденным редактировать чужие тексты, например перед тем, кто отвечает за работоспособность некоторой свободно распространяемой программы в определенном дистрибутиве ОС ( сопровождающим пакет, package maintainer). При выходе каждой новой версии этой программы сопровождающий должен вычитать изменения, которые сделали в ней авторы, и проверять, накладываются ли на новый текст программы так называемые "заплатки". Заплатки представляют собой не что иное, как файлы с результатами работы diff. С помощью заплатки и утилиты patch(1) можно, взявши "нелатаный" файл, получить "латаный" – или наоборот. Трудности начинаются, когда авторы поправляют сам нелатаный файл, и поэтому не все изменения, отраженные в заплатке, утилита patch соглашается проделать. Тут-то на помощь и приходит vimdiff.

Команды [c и ]c позволяют перемещаться по точкам различия, а :diffget и :diffput – избавляться от этих различий, копируя соответствующие строки файлов из одного в другой. Эти команды распознают контекстный адрес, и для того чтобы получить файл, содержащий только часть различий, можно, например, для этих строк выдать команду :.diffget.

< Лекция 15 || Лекция 16: 12345 || Лекция 17 >
Max Akt
Max Akt

Я прохожу курс "Операционная система Unix" и после тестов, вижу в отчете, что этот тест сдало еще 25 человек. Почему так мало, это ведь реально хороший и полезный урок. Здесь естьи теория и практичесские материалы. Сам курс написан хорошо, живым языком. И здесь я получил ответы на вопросы по Linux, которые боялся спросить. Наверное это из-за того, что в названии курса написано не Linux, а Unix и это многих отпугивает.

Andranik Avakian
Andranik Avakian

41. УК РФ и Комментарии (ст. 273)

М. 2000 г. Издательство: ALT Linux, Институт Логики

Уголовный Кодекс РФ и комментарии к нему?

По ссылке открывается сайт документации Linux, раздел Linux Installation and Getting Started