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

 

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

Полезные умения Vi
Карманы
Все команды, удаляющие фрагмент текста (d, x, c, s), записывают его в карман, из которого этот фрагмент можно в любое время достать командой p (paste). В соответствии с логикой vi, p вставляет содержимое кармана после курсора, а P – перед. Способность команд удаления запоминать удаленное – удобство, по нашему мнению, в первую очередь психологическое. Оно вселяет уверенность, что текст не пропадает: просто часть этого текста перемещается из видимого мира в невидимый, но она и там в безопасности – до тех пор, пока мы не удалим что-нибудь еще. Тут сетовать можно только на О: если мы не использовали карман, значит, не хотели. Класть в карман части текста можно и не удаляя их, с помощью гнездовой команды y (yank). Она не изменяет видимого мира, а работает, как d без удаления. Команда y подчиняется правилу двойного удара, а синоним Y означает не y$, как в C или D, а гораздо более распространенную операцию – «запомнить текущую строку» (то же, что yy, но в два раза короче).
Если в карман попала целая строка или несколько, команда p вставит содержимое не после курсора, а после текущей строки. Это и понятно: удалили строку, значит, и добавлять надо строку. В тех действительно редких случаях, когда строку нужно запомнить для вставки между символами, следует использовать команды перемещения, не работающие со строками, – поиск по файлу, перемещения внутри строки и т. п. Одну строку, например, можно запомнить с помощью 0y$ (0 здесь поставлен для перехода в начало строки; если курсор уже там, достаточно y$).
Кроме обычного – неименованного – кармана в vi есть карманы именованные. Их 26: карманы именуются буквами латинского алфавита. Для того чтобы результат гнездовой команды записывался в именованный карман вместо обычного, нужно перед этой командой поставить два символа: " и имя кармана. Например, команда "eD удалит конец строки и спрячет ее в карман e, а команда "eP – вставит содержимое кармана e перед курсором. Имена карманов подчиняются правилу синонимов: если вместо строчной использовать прописную букву, то части текста добавляются к содержимому кармана, в конец, а не заменяют его. Можно, например, в разных местах текста использовать "AY для складывания понравившихся строк в карман-аккумулятор a, а потом вынуть их из кармана с помощью "ap. Смысл именованных карманов – в том, что их содержимое не теряется во время редактирования: если вы не трогали карман a, то и под конец работы можно вынуть из него то же содержимое. В старых версиях vi неименованный карман очищался при смене редактируемого файла по :n или :e. Поэтому переносить части текста из файла в файл можно было при помощи :w временный_файл и :r временный_файл – или в именованном кармане.
У именованных карманов есть еще одно примечательное свойство, масштаб возможностей которого постигается не сразу. Команда @карман выполняет содержимое кармана, как последовательность операторов vi. Это означает, что во время работы с текстом программу можно хранить в прямом смысле слова «между строк»; более того, если формат текста позволяет, самые хитрые приемы работы с ним можно превратить в комментарии и оставить насовсем. Когда настанет пора снова редактировать такой файл, сколь угодно длинную команду vi, найденную в комментарии, следует сохранить в каком-нибудь кармане, например с помощью "xY, а потом использовать в виде @x. Кстати, если вы намерены использовать последовательность команд режима командной строки, не забудьте, что начинаться она должна с ":", а команды в ней разделяются символом |. Например, вместо сокращения Ctrl+^ , которое не сработает, если текущий файл не сохранен, можно использовать две команды: ':w!|n#'.
Макрокоманды
Идеология проективной системы и, в частности, З, не одобряет, когда человеку приходится механически повторять одни и те же действия. Если задача была решена, должен существовать способ формализовать и сохранить ее решение. Частично в этом помогает команда ".", которая повторяет последнюю выполненную команду изменения. Например, после удаления двух строк (2dd или d2d, все равно), можно продолжать нажимать "." – и vi всякий раз будет удалять по две строки. Но как сохранить целую последовательность команд? Запись операторов в карман – синтетическое решение, требующее смешения потока данных и потока управления (один и тот же файл, одни и те же регистры), что далеко не всегда бывает удобно.
Для хранения последовательностей команд в vi существует механизм определения макрокоманд – :map. Некоторые алфавитно-цифровые клавиши и подавляющее большинство функциональных в vi не имеют командного смысла (в vim задействованы все алфавитно-цифровые клавиши), но команда вида :map клавиша vi-операторы приведет к тому, что он появится: в командном режиме при нажатии этой клавиши vi будет выполнять заданный список операторов. Строго говоря, :map переопределяет не клавишу, а последовательность входных символов – имя макроса, которое vi будет заменять на тело макроса, как только введете эту последовательность целиком. Вот как можно переопределить клавишу =, чтобы она удаляла отступ в строке (начальные пробелы и табуляции): :map = 0dw.
Если имя макроса должно содержать непечатные символы (вроде Esc), их надо экранировать с помощью ^V (в режиме командной строки vi, как и sh, повторяет возможности терминальной линии). Можно, например, определить макрокоманду, которая по трем нажатиям Esc будет сохранять файл и выходить из редактора: ':map ^[^[^[ :w!^M:q^M' (при этом набрать на клавиатуре надо следующее: :map ^VEsc^VEsc^VEsc :w!^VEnter:q!^VEnter). Просмотреть список уже определенных макросов можно с помощью :map без параметров. Скорее всего, мы увидим, что vi самостоятельно определил несколько макросов для функциональных клавиш, найденных на нашем терминале: стрелок, Page Up, Page Down и т. п.

Настройки
Чтобы созданные макросы не пропадали, их можно вписать в файл настроек ex/vi. Имена многих настроечных файлов UNIX начинаются на "." (чтобы не мозолить пользователю глаза при каждом ls), а заканчиваются на rc (от Resource Container – хранилище ресурсов). Поэтому настроечные файлы называют еще rc-файлами или профилями. Rc-файл для ex/vi логично называется .exrc. В нем записываются команды ex, которые vi выполняет при каждом запуске. Этот файл можно отредактировать вручную, а можно воспользоваться командой редактора :mkexrc имя_файла, которая создает его. Получившийся файл содержит все настройки и макросы, включая стандартные, поэтому рекомендуется взять оттуда только то, что создано своими руками, и перенести в .exrc.
В этом же файле хранятся и настройки. Настройка vi – это предопределенная переменная, значение которой можно менять. Переменные бывают строковые (задаются при помощи :set переменная=значение) и логические (задаются при помощи :set переменная и :set noпеременная). Список всех возможных настроек выводится командой :set all. Их немало. Самые популярные имеют даже второй – сокращенный – вариант написания; да и саму команду set можно сокращать до se. Вдобавок к уже известным autoindent (ai), shiftwidth (sw) и magic приведем несколько самых, на наш взгляд, примечательных: number (nu) – показывать номера строк; wrapmagin=ширина (wm) – переносить вставку текста в новую строку, если ширина текущей больше указанной ширины; showmatch (sm) – отмечать в процессе ввода парные скобки. Showmatch происходит так: при наборе закрывающей скобки в тексте курсор на долю секунды перескакивает на открывающую и возвращается обратно (позиция ввода, конечно, не меняется).
В nvi и vim добавлено еще несколько полезных настроек. Добавленные в разные версии vi настройки могут делать одно и то же, а называться, к сожалению, по-разному. Например, нестандартный для vi способ отображения длинных строк, при котором они не показываются целиком (как в vi), а скрываются за правой границей экрана, в nvi называется leftright, а в vim – nowrap (т. е. no+wrap). Как минимум три полезные настройки у них общие. Первая, tildeop, управляет поведением команды "~". В ортодоксальном vi команда ~ меняет регистр буквы под курсором (превращает строчную букву в прописную и обратно), после чего перемещает курсор на одну позицию вперед. Это не очень-то согласуется с идеологией vi: команда действует только на текущий символ. Поэтому :se tildeop превращает "~" в гнездовую команду. В этом случае для изменения регистра всех букв слова достаточно команды ~w, а всей строки – ~~ (в vim вы можете, не включая tildeop, воспользоваться гнездовой командой g~). Две другие настройки, showmode и ruler, предписывают редактору выводить в поле командной строки полезную информацию: текущий режим работы и номера строки и колонки под курсором. (В одной из версий vi настройка showmode называлась novice, «новичок»; выключить ее удалось не сразу: редактор упорно не понимал :set nonovice. Зато согласился на :set vice...)
Контекстные ссылки
В ex/vi реализован оригинальный способ превратить несколько текстовых файлов в единый гипертекст, где любое слово в тексте может указывать на любую точку другого (или того же самого) текста. Сами файлы при этом не изменяются, а ссылки хранятся в дополнительном внешнем файле по имени tags. Формат этого файла прост: первое поле в строке – ярлык (tag, слово-ссылка), второе – имя файла, а остаток – команда поиска vi, указывающая на контекст. Перейти по ссылке – закрыть текущий файл, подглядеть в tags, открыть файл, указанный ярлыком, и найти контекст – можно одной командой ex :tag ярлык. Если ярлык встречается в тексте, то можно подогнать курсор к его началу и нажать ^]. Для возврата в предыдущий контекст (туда, откуда была подана команда :tag) используется сочетание ^T (Tag).
Такой механизм особенно удобен при работе со структурированными текстами: программами, файлами настроек, журналами и т. п. Например, имя функции или глобальной переменной может служить ссылкой на место, где ее описали. Утилита ctags создает файл tags для текстов программ на некоторых языках программирования.
Метки текста
Последнее свойство vi, о котором мы расскажем, – метки. Метка – это именованная закладка в тексте, видимая не глазом, но внутренним взором пользователя и редактором vi. Имя метки, как водится, – строчная латинская буква, а поставить ее можно командой m метка (например, ma). С этого момента и до окончания редактирования (а в vim – и после) редактор будет помнить, что есть в файле место, помеченное a, на которое можно вернуться с помощью команды 'a. Можно перейти на начало строки, в которой была метка 'a. Наконец, специальная метка существует для того места в файле, где была выполнена последняя операция по изменению текста, перейти на это место можно с помощью " или ".
В заключение – замечание по поводу И. У этого принципа есть «оборотная сторона»: информация в проективной системе открыта полностью, и доступ к ней организован удобным для изучения системы образом, но работать с такой системой, не используя заложенных в ней знаний, практически невозможно. Система рассчитана именно на то, что пользователь будет активно ее осваивать, а значит, находить удачные решения мелких подзадач и самые подходящие для этого инструменты – с тем, чтобы впоследствии ими пользоваться. Система не рассчитана на то, что пользователь будет ждать от нее решения своих задач.
К редактору vi это утверждение применимо не просто полностью, а, скажем, процентов на 150. Если знать только минимальный набор команд редактирования – это худший из возможных текстовый редактор. Если не лениться заглядывать в руководство и экспериментировать, мало что может показаться удобнее. Впрочем, это уже дело вкуса и привычки.

Vim
Можно рассматривать vi не как конкретную программу, а как концепцию редактирования текста. Более или менее vi-подобных текстовых редакторов существует несколько – так же, как есть несколько видов UNIX-подобных систем. Разные vi можно условно поделить на два множества: программы, повторяющие возможности vi, и программы, возможности которых выходят далеко за его пределы при сохранении максимума совместимости. К «vi-братьям» можно отнести программы, основанные на исходном тексте первого vi (в каждой операционной системе их слегка поправляли), и редактор nvi, предназначенный для замены vi после того, как в его исходных текстах обнаружились части, которые нельзя распространять свободно. В nvi, по заявлению авторов, повторены даже ошибки vi. Отличить один vi от другого проще всего с помощью команды :ver.
Совсем другую картину можно наблюдать в редакторах vim и elvis. Возможности vi, и без того немалые, расширены в этих редакторах далеко за пределы умопостижимости. Особенно постарались авторы vim (vi improved, усовершенствованный vi). Одной документации с этим редактором приходит более трех с половиной мегабайтов. Как и emacs, vim следует рассматривать как среду редактирования текста, в которой поддерживается решение большинства задач, непосредственно связанных с редактированием. Осваивать vim стоит, как и всякую проективную систему, постепенно: для начала составить представление о его возможностях и способах использования, а затем не лениться искать в документации наиболее подходящий для решения каждой задачи инструмент. В конце концов у вас в руках окажется подмножество возможностей редактора, отвечающее вашему стилю работы с текстом и специфике задач.
Встроенная помощь
В лекции 6 мы пришли к мысли, что получение информации можно с удобством организовать теми же средствами, что и управление проективной системой. Поэтому разделы документации по vim удобнее всего читать при помощи самого vim: правила работы с документацией и ее заголовок документации доступны по команде :help. Документация vim – жестко гипертекстовая: любой объект vim имеет соответствующий ярлык в файле tags документации (их там без малого шесть с половиной тысяч). Значит, любое упоминание имени объекта в тексте служит одновременно контекстной ссылкой на описание этого объекта, так что команда ^] работает в файле помощи почти на каждом слове. Команда :help объект_vim работает так же, как :tag, только использует заранее определенный tags. Каждый параграф руководства vim снабжен ярлыком вида *название*; не умножая сущностей, будем и мы оформлять таким способом ссылки на руководство.
Структура гипертекста достаточно приемлема: небольшая интерактивная обучающая среда для начинающих; руководство пользователя (учебник, «VIM User Manual»): три раздела по 6-12 глав, в лекции по 6-12 небольших параграфов; полная документация («VIM Referecne Manual»): девять разделов, при необходимости также поделенных на главы и параграфы, сводные таблицы-справочники. Не имея намерения пересказывать содержимое этой документации, мы ограничимся лишь описанием самых интересных, на наш взгляд, возможностей. Предполагается, что для изучения этих возможностей будет использована не наша книга, а сам vim. В частности, все отличия vim от ортодоксального vi кратко и внятно описаны в *vi-differences*.
Буферы и многооконность
В vi была возможность редактировать несколько файлов по очереди. Если при работе с одним файлом требовался режим autoindent, а при работе с другим – не требовался (например, текст на Си и текст на английском), приходилось после переключения с файла на файл всякий раз командовать то :se ai, то :se noai. В vim с каждым файлом связан буфер, в котором запоминаются настройки редактора (*buffers*). Многие настройки относятся по умолчанию к текущему буферу, но есть и возможность явно задать область их действия с помощью setlocal и setglobal. Локальна автоматическая метка '\' и другие автоматические метки, определенные в vim (*mark-motions*), локальны стили подсветки синтаксиса, форматирования и представления текста, о которых речь пойдет дальше.
Побочным эффектом введения буферов стала возможность показывать несколько файлов одновременно, не меняя соответствующих настроек. Экран терминала можно разбить на несколько прямоугольников и связать с каждым из них свой буфер. Переключаться между получившимися окнами можно с помощью ^W^W, а изменять их размер – с помощью ^W+, ^W- и ^W_. Именно в виде отдельного окна открывается страница помощи.
Типизация файлов и автокоманды
Различия в настройках для работы с разными файлами зависят прежде всего от типа файла. Для того чтобы при открытии файла на редактирование vim применял соответствующий набор настроек, пришлось реализовать распознавание типа файла (*filetype*), и одновременно механизм подключаемых модулей (*filetype-plugins*) – специальных файлов настройки vim, содержимое которых выполняется при открытии файла определенного типа. Если настройки, предлагаемые по умолчанию, не подходят, можно создать собственный файл настроек для определенного типа: например, подключаемый модуль для программ на Си будет лежать в ~/.vim/ftplugin/c.vim. Символ "~" означает здесь домашний каталог пользователя.
После того как vim научился распознавать типы файлов, многие полуавтоматические работы стали автоматическими. Целый раздел документации, *autocommand*, посвящен автоматическим командам. Автоматическая команда привязывается к типу файла и списку событий, с этим файлом происходящих. Например, команда :autocmd BufRead *.txt set expandtab привяжет к событию «чтение из файла» для файлов, чье имя заканчивается на .txt, включение настройки expandtab (превращать символы табуляции в последовательность пробелов).

Сценарии
Когда пользователь изменяет текст или настройки редактора здесь и сейчас, команды редактору суть всегда результат мыслительной работы человека. А вот автоматические команды должны проделывать часть этой работы самостоятельно. Возникает необходимость иметь встроенный язык программирования, на котором можно было бы описывать логику принятия определенного решения, в первую очередь проверку разнообразных условий и вычисление значений. В 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, создает для показа результата новое окно.

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

Конечно, разработчики 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.

 

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