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

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

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

Сценарии

Когда пользователь изменяет текст или настройки редактора здесь и сейчас, команды редактору суть всегда результат мыслительной работы человека. А вот автоматические команды должны проделывать часть этой работы самостоятельно. Возникает необходимость иметь встроенный язык программирования, на котором можно было бы описывать логику принятия определенного решения, в первую очередь проверку разнообразных условий и вычисление значений. В EMACS такой язык был изначально, а в vi – нет. То, что получилось у авторов vim ( *expression* ), похоже на весьма сложный shell (например, zsh ) с поддержкой исключений и несметным числом внутренних переменных и функций.

Больше того. Vim можно собрать с поддержкой нескольких языков программирования, тогда писать сценарии можно будет на них! Авторы редактора воспользовались тем, что многие языки программирования предназначены для подобного использования. Достаточно скомпоновать vim со специализированной библиотекой такого языка и определить для него команду вызова, способ доступа ко "внутренностям" vim и способ обработки результата. По этой схеме в vim встраиваются Python, Perl, Tcl и Ruby, а также анализатор текстов на Си cscope. Еще vim может служить интерфейсом для отладчиков и сред разработки. Ссылки на соответствующую документацию есть на *doc-file-list* под заголовком Interfaces.

Подсветка синтаксиса и форматирование

Многие виртуальные терминалы (виртуальные консоли Linux и FreeBSD, xterm -подобные программы) умеют выводить текст несколькими цветами. Те, что не умеют, могут подчеркивать выдачу, использовать повышенную яркость или негативное отображение. Все это можно применять для подсветки синтаксиса редактируемого текста: выделять в нем ключевые слова или определенные языковые конструкции ( *syntax-highlighting* ).

В vim используется единый способ подсветки элементов самого редактора и частей редактируемого текста ( *:highlight* ). Сначала с помощью команды :highlight задаются разные типы подсветки. Например, команда :hi NonText term=bold cterm=bold ctermfg=4 означает, что на терминалах области текста, соответствующие типу "NonText", будут высвечиваться ярким, причем на цветных – синим (цвет 4 по стандарту ANSI). Редактор сам использует некоторые типы подсветки (в частности, когда строк в редактируемом файле меньше, чем на экране, на месте недостающих выводятся NonText -ом символы "~" ). Набор типов подсветки называется цветовой схемой и может лежать в файле ~/.vim/colors/имя_схемы.vim ( *:colorscheme* ).

Затем необходимо описать синтаксис того, что предстоит подсвечивать. Область может задаваться строкой, регулярным выражением или двумя регулярными выражениями, определяющими ее начало и конец; в последнем случае допускается вложение в одну область других. Здесь иногда приходится пускаться на всякие хитрости, вроде "нежадных" регулярных выражений и предпросмотра, да к тому же задавать порядок, в котором определенные части текста могут следовать друг за другом ( *:syn-define* ). Например, команда :syntax region pasComment start=/{/ end=/}/ описывает область комментариев языка Pascal.

Дальше остается только привязать каждую область к определенному типу вывода ( *:highlight-link* ), например, :highlight link pasComment NonText, и указанная область будет высвечиваться указанным типом подсветки. Описание и привязка синтаксиса зависит от типа файла: например, синтаксис почтового сообщения (типа mail ) vim будет искать в ~/.vim/syntax/mail.vim.

С определением типа файла связана и другая способность vim: форматирование текстов ( *formatting* ). Форматировать текст можно в процессе набора, автоматически, а можно и по запросу, с помощью гнездовой команды gq. Процесс форматирования управляется настройками formatoptions ( fo ) и comments ( com ). Если их недостаточно, есть возможность написать на любом встроенном языке vim собственные функции. Форматирование и подсветка бывают весьма полезны при работе со структурированным текстом, например при написании программ. При этом синтаксически неверные конструкции vim может специально выделять, а неожиданное поведение vim при форматировании может свидетельствовать об ошибке в тексте, безупречном с точки зрения синтаксиса.

Кстати сказать, расстановкой отступов в программах на Си занимается отдельная часть редактора, именуемая *C-indenting*. Дело в том, что стилей программирования на Си великое множество, поэтому одно какое-то представление о форматировании программы обречено на неприятие большинством программистов. Переменная cindent ( cin ) включает режим форматирования, для настройки которого не надо переписывать синтаксический анализатор, достаточно подобрать флаги в переменной cinoptions ( cino ) по своему вкусу. *C-indenting* тоже отлично сигнализирует о неявной ошибке. Например, если при написании сложного условия в операторе if() вы не закрыли какую-нибудь пару скобок, при переносе строки вместо обычного отступа шириной в shiftwidth редактор добавит их два. Vim посчитает эту строку продолжением предыдущей, ведь оператор if еще не закончился закрывающей скобкой.

Средства разработки программ

Постоянная работа программиста состоит не столько в написании программы, сколько в ее отладке. Применительно к программам на Си, например, начальная стадия написания программы проходит по сценарию edit-compile-edit: "редактирование – компиляция – отслеживание ошибок – редактирование – ...". Алгоритм, предлагаемый *Quickfix*, соответствует этому сценарию. Сначала вы подаете команду :make (обычно это приводит к запуску утилиты make(1) ), которая должна вызвать компилятор для сборки программы из одного или нескольких исходных файлов. Все сообщения об ошибках (формат их описан в переменной errorformat ) обрабатываются vim, и из них создается подобие ярлыков, в которых указано, в каком файле и в какой строке найдена ошибка.

Можно использовать команды перехода по ошибкам или открыть по команде :copen окно со списком ошибок ( *quickfix-window* ), перемещение курсора в котором на очередную строку приводит к открытию в соседнем окне файла с этой ошибкой и показу нужной строки, которая к тому же, будет подсвечиваться. По команде :make запускается то, что записано в настройке makeprg; что именно будет при этом происходить – редактору безразлично. Если из выдачи можно выудить что-нибудь, соответствующее errorformat, совсем хорошо, будет что внести в список ошибок. Так что эта схема выходит далеко за рамки сценария "компиляция – редактирование".

Частный случай той же схемы реализован командой :grep. Запускается программа из grepprg (обычно что-нибудь вроде grep -n ) со всеми параметрами, которые передаются :grep, и каждая строка результата считается "ошибкой". С получившимся списком вхождений можно работать так же, как и со списком ошибок; командами :cl, :cn, :cp и :cc или в окне.

Обычно в тексте программы по нескольку раз встречаются определенные слова – скажем, имена переменных. И очень часто бывает нужно посмотреть, как используется переменная в другом месте программы или где и как описана функция. Можно воспользоваться командами немедленного поиска слова – * и #. Команда * ищет вперед ( # – назад) по тексту слово, на котором стоит курсор, так что для поиска следующего или предыдущего вхождения идентификатора Си в текст программы достаточно нажатия одной клавиши!

Однако если в программе есть ссылки на другие включаемые файлы, например используется директива "#include" препроцессора Си, описание функции или макроса скорее всего делается именно в них. Тогда нужен более мощный механизм поиска, который бы распознавал такие включения и умел просматривать целые деревья вложенных друг в друга файлов. В vim этот механизм называется *definition-search* ("поиск описаний"). Он управляется настройкой include, задающей формат оператора включения, path, определяющего каталог для поиска файлов, и comment, указывающего области текста, в которых не надо выискивать операторы включения.

Команда [i показывает первое найденное в дереве файлов вхождение слова (оно-то обычно и бывает описанием функции или макроса), а [I показывает все вхождения. Команда [^I (или, что то же самое, [Tab ) открывает файл с найденным описанием (первым вхождением) и устанавливает туда курсор. Наконец, оконный вариант этой команды, ^Wi, создает для показа результата новое окно.

< Лекция 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