Emacs для начинающих




Vim - часть 6


       Парадоксально, но, признав некоторую сложность vim, сейчас я попытаюсь обосновать утверждение о его исключительной простоте. Парадокса, собственно, никакого и нет: все зависит от того, с чьей позиции смотреть. Для пользователя, только что загрузившего дистрибутив vim, он действительно сложен. Достаточно сказать, что в файле index.txt свыше 1200 строк, а ведь этот файл - всего лишь перечень доступных команд с краткими описаниями в одно, максимум два предложения. 1000, пусть 500 команд не способствуют желанию познакомиться с редактором. Не будем торопиться. Во-первых, команды довольно часто дублируются. Во-вторых, часть из них унаследована от vi и предполагает возможность ввода на любом алфавитно-цифровом терминале. Современному пользователю более естественным покажется использование функциональных клавиш и клавиш позиционирования курсора, мыши, наконец. Все эти возможности vim, разумеется, поддерживает, но и старые варианты набора команд не отменяются. Список сокращается: предположим, до 150 команд. Не так уж и много для редактора, который может "все" (уточнять и в этот раз не будем), но есть ли основания говорить об "исключительной простоте"? Как это ни странно, есть. И основания эти следующие:

  • логика интерфейса, заложенная авторами, позволяет свести все многообразие команд к сочетаниям значительно меньшего числа их "составляющих";
  • исключительная модифицируемость vim дает возможность создавать "проблемно-ориентированные", при желании - очень простые конфигурации;
  • гибкая система помощи, которую, кстати, можно дополнять самостоятельно и на любом языке;
  • если же потребуется конфигурация, воспользоваться которой можно сразу, не обременяя себя знакомством с документацией, то можно воспользоваться возможностью создания меню, которая у vim тоже есть.

Таким образом сконфигурированный, документированный и дополненный системой меню vim становится "образцом дружественности" к пользователю. Вас что-то не устраивает? Cделайте так, как считаете более удобным! Для этого не нужно обладать какими-то специальными знаниями, но что-то ДЕЛАТЬ - действительно нужно. Здесь придется еще раз признать (и напомнить), что vim написан программистами и для программистов. Но поскольку ряды последних все ширятся, то и круг пользователей также должен расширяться. Если это не так, то, возможно, и потому, что вышеупомянутые более чем 1000 строк одного перечисления команд кого-то "оттолкнули" при знакомстве. Именно на этого кого-то и ориентирован данный материал.

Для начала стоит объяснить, зачем все-таки нужно такое количество команд, если большинство редакторов вполне обходится системой меню. Для примера предлагаю взять части текста, выделяемые для выполнения над ними какой-то операции и называемые, как правило, текстовыми объектами. Можно выделять их мышью, как это и делается во многих редакторах: решение универсальное, но крайне не эргономичное - попробуйте выделить абзацев 5-6. В общем случае текстовым объектом может быть символ, слово, предложение, абзац, текст в целом плюс блоки, которые, в свою очередь, могут быть ограничены угловыми, квадратными, фигурными или круглыми скобками (мы ведь говорим о тексте программы). Курсор (или указатель мыши) в момент выбора также может находиться в начале, конце или внутри текстового объекта. Можно, конечно, "метить" начало и конец текстового объекта - но это бывает так утомительно... Согласитесь, также, что меню, отражающие все эти возможности, выглядело бы весьма громоздким. А вот как это сделано в vim: если курсор в начале объекта, то первая буква команды выделения - <a> (add), а если внутри, то <i> (inner). Теперь осталось указать, что является объектом. Вторая буква - <w>, <s>, <p> или <b>. Нетрудно догадаться об их происхождении : word, sentence, paragraph, block. Не ошибетесь, если предположите, что любая из возможных скобок в качестве второго символа команды, означает, что объект - это блок, ограниченный этим типом скобок. Изящно. И просто. А между тем, это без малого три десятка команд в визуальном режиме.

Логика интерфейса такова, что если вы обнаружили какую-то возможность в одном из режимов, то почти наверняка найдете аналогичную в другом. Упомянутые в первой статье <Ctrl-n> и <Ctrl-p>, обеспечивающие в режиме вставки переход к следующему (next) и предыдущему (previous) вариантам автозаполнения, при автозаполнениях работают практически везде. Одни и те же символы в командах, как правило, несут одну и ту же смысловую нагрузку: <i> - идентификатор, <d> - макроопределение, <f> - файл. Поэтому <[i> - найти первое появление идентификатора (фактически - определение переменной), <[d> - то же для макроопределения. Понятие "первое появление" для файла смысла не имеет, поэтому <[f> идентично <gf> и означает открытие для редактирования файла, имя которого находится под курсором. Если тем же i,d,f предшествует <Ctrl-W> (признак window-команд), то результатом будет открытие нового окна (а для файла - и нового буфера) с переходом к определению переменной или макрокоманды. Если команда имеет "соседей по смыслу", то скорее всего они будут вызываться изменением регистра второго (уточняющего) символа. Так, <[I> и <[D> распечатают все строки с данным идентификатором или макропеременной. Те же символы присутствуют в составе <Ctrl-X> (eXtended - расширенного) подрежима режима вставки. Этот подрежим полностью ориентирован на автозаполнение. Нетрудно догадаться, что символы <I>, <D>, <F> в качестве завершающих (после <Ctrl-X-Ctrl>) инициируют автозаполнение имен переменной, макрокоманды и файла соответственно, а <n> и <p>, как и прежде, будут означать следующий и предыдущий варианты автозаполнения.

"Универсальными" могут быть не только последние символы команд, как в предыдущих примерах, но и первые. Прежде всего, это уже упоминавшиеся <Ctrl-X> - первый символ расширенного подрежима вставки, и <Ctrl-W> - первый символ window-команд. Как правило, команда детализируется вторым символом. Кроме уже названных, для window-команд это: <+> - увеличить, <-> - уменьшить, <=> - сделать равными размеры окон, <s> - разделить (split), <c> - закрыть (close), <n> - открыть новое (new), <r> и <R> - поменять местами (rotate) окна. Еще одним "универсальным" символом может быть символ, идентифицирующий именованный буфер или, в соответствии с документацией, регистр. Если помните, комбинация <"x> (где 'x' - любой символ: a-zA-Z0-9%#:-") означает использование регистра с командами <y>,<d>,<p> - копирование, удаление, вставка (yank, delete, paste). Аналогично, <qx> означает переход в режим записи в регистр, а <q> - выход из него. Записываются как символы, так и управляющие последовательности (фактически - команды редактора). Если в регистр записаны команды редактора, то его содержимое можно выполнить командой <@x>. Но это возможно уже только с регистрами a-z. Содержимое регистра можно вставить командой <Ctrl-R>, причем это допустимо как непосредственно в тексте (режим вставки), так и в командном режиме. На этом список символов - "универсальных составляющих" команд - можно считать исчерпанным, но - не исчерпывающим, поскольку есть и уникальные комбинации, не имеющие аналогов в других режимах. Например, <Ctrl-U> в режиме вставки удаляет строку, а <Ctrl-V> позволяет ввести символ посредством ввода его трехзначного десятичного кода. В нормальном режиме <Ctrl-L> перерисовывает экран, <Ctrl-R> отменяет действия undo (<u>), а <Ctrl-A> и <Ctrl-X> инкрементируют или декрементируют число под курсором. Так же уникальны команды поиска и замены, перечисленные в первой статье. <U> в визуальном режиме переводит выделенный фрагмент в верхний регистр, а <u> - в нижний. <~> поменяет регистр для одного символа в нормальном режиме и для выделенного фрагмента - в визуальном.

Некоторые символы сохраняют свое назначение и в командном режиме: <!> - фильтр, <@x> - выполнить содержимое регистра 'x', '<' и '>' - уменьшить и, соответственно, увеличить "отступ" строк. Вообще, командный режим стоит несколько "особняком", поскольку является практически самодостаточным: в нем доступны практически все действия, инициируемые командами остальных режимов, разве что объем ввода будет больше. Зато текст команд достаточно "прозрачен". Например:

:buffer N - перейти к буферу N;
:Print - распечатать;
:set - показать или установить опции.

А количество вводимых символов уменьшается благодаря допустимым сокращениям и уже неоднократно упоминавшемуся автозаполнению. Перечислять эти самые "EX" команды нет смысла - их без малого три сотни, а вот просмотреть этот список - стоит. Хотя бы для того, чтобы знать, какие еще возможности имеет vim. Кроме команд, дублирующих команды других режимов, мы найдем здесь команды управления буферами (==открытыми файлами), меню, "привязкой" команд к клавиатурным последовательностям (map), средства программирования, индексации (tags), управления редактором и многое, многое другое.<




Содержание  Назад  Вперед