Наши партнеры








Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net


Vim. По-прежнему: один из лучших

Владимир Попов
vn_popov@linux-online.ru

Вступление (в меру лирическое).

Посетителям Unix4All не нужно, по-видимому, объяснять разницу между текстовым процессором (тем более - издательской системой) и редактором. Если первый - совершенно необходимый инструмент при подготовке печатного издания, то второй, прежде всего, используется для ввода и редактирования собственно текста. Разница становится абсолютно очевидной, если обрабатываемый текст - не бессмертный литературный шедевр, а программа, которую хочется видеть не столько красивой, сколько структурированной, наглядной и, если удастся, с наименьшим количеством ошибок. А ещё хотелось бы потратить на её ввод поменьше времени. Вот для такой-то работы и разрабатываются редакторы. Более или менее успешные.

В мире UNIX редактор требуется всем, не только программистам. Система, использующая текстовые файлы, как основной элемент настройки, без редактора последних просто невозможна. Добавим к этому множество скриптов (исполняемых файлов различных интерпретаторов), частенько возникающую необходимость откорректировать make-файл заинтересовавшего пакета, желание быстро извлекать нужную информацию из всевозможных log-ов... И станет понятно, почему редактор - один из "краеугольных" камней любой UNIX-подобной системы.

"Религиозная" война между поклонниками VI и Emacs уже давно стала "притчей во все языцех" в UNIX-сообществе. Виной тому, на мой взгляд, "экспансия" VI в направлении областей, для которых он первоначально не был предназначен. Удачно задуманная и исполненная система расширения функциональных возможностей, со временем позволила VI и его "потомкам" решать всё более сложные задачи, среди которых и те, для решения которых, казалось, был создан Emacs. Реплика "а я могу это же сделать с помощью VI!", особенно в тех случаях, когда угадывалось нежелание автора даже знакомиться с Emacs, регулярно "подливала масла в огонь"... Страсти потихоньку улеглись, но "увлёкшийся" возможностями собственного роста VI, тем временем, перестал быть самым популярным средством быстрого и простого редактирования текста.

Сильной стороной "новых" редакторов становились, прежде всего, простота редактирования и лёгкость освоения. Осмелюсь предположить, что принципиально новых функциональных возможностей они не предлагали. Прошу не судить слишком строго, но я действительно не знаю в nano, nedit или joe ничего такого, что нельзя было бы реализовать в VI или, тем более, в его современном "потомке" - vim (Vi IMprooved). В то же время, ещё два-три года назад нельзя было не признать, что исчерпывающая документация vim не является ни "прозрачной", ни доступной. Также нельзя было не признать обоснованными жалобы на некоторую "тяжеловесность" vim, исходившие от обладателей 486-х с 32Mb RAM. Не Emacs, положим, но и не nano, однако...

В настоящее время положение изменилось. Помимо "reference guide" - описания всех доступных при редактировании функций и ранее отличавшегося полнотой, документация теперь включает в себя и "user manual" - 46 сравнительно небольших глав, каждая из которых посвящена одной из сторон работы редактора. Ну, а если и это кажется излишним, то есть ещё коротенький справочник в отдельном файле - "quick reference". Что касается "тяжеловесности", то стремительный рост вычислительной мощности настольных систем позволяет забыть и об этом.

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

А стоит ли?...

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

Ответом на первый вопрос является, как ни странно, многофункциональность vim. Попытка осветить все его возможности неминуемо выливается в документ, одним своим объёмом вызывающий у потенциального читателя тоску. Наверное, это один из случаев, когда "лучшее - враг хорошего": полная документация отбивает желание искать ответ на свой конкретный вопрос. Вот тут-то и может пригодиться (смею надеяться) чей-то личный опыт. Особенно, если совпадут, скажем, род деятельности или конкретная задача...

Ответом на второй вопрос является, прежде всего, странное, ничем не обоснованное стремление "быть полезным", за которым, не исключаю, скрываются уже вполне понятные желания расширить круг "доброжелательных единомышленников" и сократить количество непосредственно адресуемых повторяющихся вопросов. Вполне серьёзно верю в то, что умение работать с текстовыми файлами - необходимое условие существования в UNIX-среде. И, наконец, маленький личный интерес: чем больше коллег и знакомых будут пользоваться vim, тем большее распространение получат vim-приёмы представления текста, среди которых есть довольно интересные: папки (folders), например, или общие файлы описания подсветки синтаксиса.

Если вопрос решён как "быть" (в смысле: описывать vim - стоит), то остаётся уточнить: как? Попытка заменить собой документацию, обсуждавшаяся двумя параграфами выше, разумеется, исключается. Исключим также ориентацию на вчерашнего ms_win-пользователя. Отнюдь не из-за предвзятого отношения к MS Windows, тем более что среди пользователей vim, число которых, говорят, уже давно перевалило за миллион, есть и сотрудники MicroSoft, а только из-за его [вчерашнего ms_win-пользователя] неготовности использовать клавиатуру, как основной инструмент ввода. Ориентируемся, таким образом, на UNIX-пользователя, по "несчастливой случайности" не знакомого с vim. Что бы избавить читателя от поисков того, чего в данной статье заведомо нет, перечислим то, что в ней есть:

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

Зачем.

Оставив в стороне само собой разумеющуюся возможность ввода и изменения текста, перечислим возможности, несколько выходящие за пределы стандартных:

  • автозаполнение;
  • поиск в произвольном направлении лексемы "под курсором";
  • поиск "определения" лексемы "под курсором";
  • сравнение двух и более файлов, когда на экран выводятся только не совпадающие фрагменты текстов;
  • полностью настраиваемая автоподсветка синтаксиса для множества типов файлов с возможностью создания типов собственных;
  • возможность работы одновременно во многих кодировках, включая UTF-8;
  • ограниченное только здравым смыслом количество буферов (фактически - открытых файлов);
  • подобным образом ограниченное количество окон (в данном случае термин "окно" очень точно отражает суть: есть файл, а есть окно, через которое мы содержимое этого файла рассматриваем);
  • произвольные размеры и положение окон: окно может занимать всю площадь экрана, а может - часть, причём любую, то есть экран может делиться как по горизонтали, так и по вертикали. Переключения - произвольны. Сказанное справедливо как для графического, так и для консольного режимов.

Приведённый список возможностей даже не претендует на полноту: просто перечислены некоторые из существующих, используемые в повседневной практике: редактировании html-кода, правке конфигурационных файлов, анализе log-ов. Если что-нибудь из упомянутого заинтересовало - читайте дальше.

Для начала.

Основным, как мне кажется, препятствием в освоении vim на первом этапе является наличие у него пяти режимов (modes):

  • "Вставки/замены": обычное экранное редактирование, когда нажатие цифробуквенных клавиш вызывает ввод соответствующих символов в редактируемый текст, клавиши позиционирования перемещают указатель, а функциональные клавиши выполняют назначенные (вами или - по умолчанию) действия;
  • "Нормальный": текст не модифицируется, клавиши позиционирования перемещают указатель, все остальные клавиши (или их последовательности) выполняют назначенные действия, опять-таки - вами или по умолчанию;
  • "Визуальный": режим выделения области с помощью мыши, клавиш перемещения курсора или специальных "меток"
  • "Операторный": вводимые символы детализируют введённый непосредственно перед этим оператор. Благодаря вводу в этом режиме оператор удаления, например, удалит N символов, слов, строк или область выделенную в визуальном режиме;
  • "Командный": для ввода команд, а точнее тех из них, которые вы или авторы не сочли нужным связать с функциональными или обычными клавишами и их последовательностями;

По умолчанию <Esc> (иногда - два нажатия) возвращает в нормальный режим, <Ins> - переводит в режим вставки, а из него - в режим замены. Двоеточие в нормальном режиме даст перевод в командный режим. Символы операторов из, опять-таки, нормального режима переводят в операторный. Символы <v> и <V> - в визуальный.

Следующее, что стоит рассмотреть, это - конфигурационный файл. И название, и местоположение его традиционны для UNIX: ~/.vimrc Пример (vimrc_example.vim) - можно найти в каталоге самого vim (для Linux обычно -/usr/share/vim/vimNN/, где NN - номер версии.

Впервые познакомившемуся с возможностями конфигурации vim, трудно устоять перед соблазном "подогнать" его под "милый сердцу" прототип: для кого-то - MultiEdit, для кого-то - nedit, а для кого-то - и notepad. Это не сложно. Однако не стоит торопиться: vim имеет возможности, которых, вполне возможно, не было у "прототипа", а, познакомившись с ними однажды, вы, быть может, уже не захотите от них отказываться. Хотя, как способ "знакомства", такая методика вполне оправдана. Перечислим наиболее тривиальные возможности редактирования. Подразумеваются настройки "по умолчанию", ввод в нормальном режиме, кроме тех случаев, когда оговаривается иное. Двоеточие говорит о переходе в командный режим.

Разумеется, можно как угодно позиционироваться в файле:

  • [n]G - переход на строку n, 0G - BOF, $G - EOF
  • ) или ( - следующее или предыдущее предложения
  • } или { - то же для параграфа
  • ]] или [[ - то же для секции, функции
  • % - переход к ответной скобке (matching)
  • `` - предыдущее местонахождение, с точностью до символа
  • '' - то же, с точностью до строки
  • все перемещения по файлу в пределах сессии протоколируются, а <Ctrl-O> и <Ctrl-I> позволяют перемещаться по зафиксированным в этом протоколе позициям.

Весьма удобным является механизм меток, к которым всегда можно вернуться:

  • mx - пометить текущую позицию буквой "x" (буква, разумеется, любая)
  • `x - перейти к метке "x"
  • 'x - перейти к строке с меткой "x"

Ещё одна возможность, довольно редко встречающаяся у редакторов, - множество именованных буферов. В последних версиях MS Windows это называется многостраничным clipboard-ом. Буферы, как и метки, метятся одной буквой:

  • "x - именованный буфер с меткой "x". С таким буфером возможны все стандартные операции:
    y - копировать (yank)
    d - вырезать (cut)
    p - вставить (paste). Причём, вставлять можно как перед ( <[p> ), так и после ( <]p> ) позиции под курсором. Если эта позиция - начало или конец строки, то разница довольно существенна.
  • буфер, именованный как "* совпадает с clipboard X-Window.

Разумеется, есть множество средств поиска/замены:

  • /text - искать "text" ниже
  • ?text - то же, но выше, то есть в предшествующей курсору части текста
  • n - повторить поиск в том же направлении
  • N - то же, но в обратном направлении
  • * - найти слово такое же, как под курсором ниже по файлу
  • # - то же, но выше по файлу
  • :[address]s/text/replacement/[gci] - в адресном пространстве address заменить "text" на "replacement".
    Опции: { global-confirm-insensitive case },
    что означает: { все - с запросом подтверждения - игнорируя регистр }

    Для тех, кто знает, что такое регулярные выражения, отметим, что они в операторах поиска/замены - работают.

    Не нужно пугаться "многословного" синтаксиса: вспомните о программируемых клавишах и вы поймёте, что достаточно ввести нужную фразу в ~/.vimrc лишь однажды.

Разумеется, есть полный список файловых операций. Перечислять все вряд ли имеет смысл: в них нет ничего "экзотического". Интереснее упомянуть автозаполнение: набрав пару-тройку первых символов и не выходя из режима вставки, нажмите <Ctrl-n> (или <Ctrl-p>): vim начнёт предлагать варианты продолжения слова из имеющихся в вашем файле. Ещё один сюрприз: <[i> покажет в командной строке определение переменной, находящейся под курсором, а <[d> - определение макро, если символы под курсором являются переменной или макрокомандой, разумеется. Запомнить проще, если догадаться, что в первом случае i означает included, а во втором d - defined. И ещё "фокус": справка по поводу кода символа под курсором, причём сразу во всех системах исчисления кроме двоичной, разве что. Последовательное нажатие <ga> даст практически полную информацию о символе под курсором.

Разумеется, можно отказаться от сделанных изменений (undo), введя просто <u>, а можно восстановить сразу всю редактируемую строку: <U>. Иногда бывает нужно отказаться от отмены изменений (undo the undo's). Можно и это: <Ctrl-R>

Можно изменить регистр символа под курсором нажатием <~>.

И, напоследок, часто весьма облегчающая жизнь точка <.> - повторить последнюю операцию.

Теперь понятно, почему не достаточно одного режима: всё разнообразие функций трудно покрыть только функциональными клавишами, а использование клавиш обычных требует отказа на какое-то время от режима экранного редактирования. Среди множества установок, задаваемых командами ":set ..." есть и задающая режим вставки как действующий по умолчанию, что делает vim похожим на большинство экранных редакторов. Попробуйте. И, скорее всего, вы убедитесь, что заданный по умолчанию разработчиками нормальный режим с точки зрения затрат времени экономичнее.

Похожая ситуация с предложенными для использования по умолчанию клавишами: невозможно не заметить, что те же клавиши "работают" и при просмотре man-страниц, и в популярной screen, и даже для стандартного интерпретатора командной строки bash, оказывается, существует vi-подобный режим. Одним словом, в UNIX-среде освоение vim проходит заметно легче, если вы не совсем "чайник".

Разумеется, это не все. Десятки утилит, разработанных специально для vim, дополняют и без того немалый список возможностей. Среди них средства для создания перекрёстных ссылок с файлами других форматов, "рисование" псевдографикой, таблицы, дополняющие форматеры, конвертеры и тому подобное.

Остановимся, однако, на этом для начала. Если некоторые из перечисленных возможностей показались интересными, перейдём к обсуждению управлением vim.

Приручаем vim.

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

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

А количество вводимых символов уменьшается благодаря допустимым сокращениям и уже неоднократно упоминавшемуся автозаполнению.

Из личного опыта.

Перечисленные команды - далеко не все, существующие в vim, однако, на мой взгляд, и их многовато, несмотря на все аналогии и аббревиатуры. Мне, во всяком случае, никак не удаётся их запомнить. И не нужно, как выясняется. Что-то выносим в ~/.vimrc, что-то запоминаем, что-то всегда можно получить из меню, а на крайний случай всегда есть :help или :help command. vim более функционален и гибок, чем может потребоваться отдельному пользователю. Поэтому, если не хочется возиться с его настройкой, то лучше и не связываться или воспользоваться чужой конфигурацией. И только собравший и настроивший vim "под себя" полностью его оценит. А теперь - "плоды" собственных экспериментов:

  • в большинстве случаев перекомпилировать vim не приходится, но если уж случится, и у вас есть претензии к производительности своего компьютера, то vim можно заметно "облегчить". Опции --disable-gui и --without-x превращают vim в чисто консольное приложение и существенно снижают, таким образом, требования к компьютеру. Откажитесь от встроенной поддержки не используемых интерпретаторов: мне, например, нужным показался только perl (опция --enable-perlinterp). А вот набор качеств приходится выбирать большим (опция --with-features=big): не вдаваясь в детали, скажу, что это требуется для поддержки некоторых команд, необходимым в связи с использованием кириллицы [1];
  • надеюсь, никого не удивило предложение отказаться от графической "ипостаси" vim? Дело в том, что именно для редактора я не вижу смысла жертвовать площадью экрана ради элементов декора, без которых не обходится ни одна графическая оболочка. Разумеется, если бы консольный режим сводился к 24-м строкам с 80-тью символами в каждой, то ни малейшей конкуренции режимам графическим он бы не составил. Но с повсеместным внедрением framebuffer даже 12-дюймовый ноутбук обеспечивает 100х37 знакомест в цвете при 75 Гц кадровой развёртки. Соответствующие 800х600 X-Window, не представляются достойной альтернативой. Настойчиво рекомендую пересмотреть своё отношение к консоли, пока этого не посоветовал окулист;
  • обязательно включите в ~/.vimrc опцию:
               set langmap=йцу...ЙЦУ...;qwe...QWE...
    Три точки в данном случае означают "все остальные символы на клавиатуре" в нижнем и верхнем регистрах для раскладок ru и us. <;> перед 'qwe' отделяет "подменяемый" набор от "подменяющего". Точку с запятой (в наборе, а не разделяющую) и двойные кавычки нужно исключать (quote) с помощью backslash (), как обычно. Данная опция делает не нужным переключение раскладки клавиатуры, когда требуется латинский символ в нормальном режиме;
  • хотите выходить из редактора по <F10>? Вставляем в ~/.vimrc следующие строки:
               map  <F10>   :q<CR>
               imap <F10>   <Esc>:q<CR>
               cmap <F10>   <Esc><Esc>:q<CR>
    Последние две команды можно заменить одной:
               map! <Esc>   :q<CR>
    но для этого уже нужно знать о существовании map! (map для режимов команд и вставки);
  • во второй позиции может быть и последовательность символов. Например,
               map  <F6>   :set number<CR>
               map  n<F6>  :set nonumber<CR>
    будет по <F6> включать нумерацию строк, а по <n><F6> - выключать;
  • система меню, присутствующая в графическом режиме, доступна и в режиме консольном. Для её активации всё в тот же ~/vimrc нужно вставить следующие команды:
               source $VIMRUNTIME/menu.vim
               set wildmenu
               set cpo-=<
               set wcm=<C-Z>
               map <F9> :emenu <C-Z>
    На месте <F9> может быть, разумеется, любая клавиатурная последовательность. Можно иметь личный меню-файл, тогда первая строка должна указывать на него. В данном же случае состав меню определяется файлом menu.vim. Строки этого файла, содержащие команды меню (строки с командами программирования пока не обсуждаем), выглядят, обычно следующим образом:
               amenu m.n &File.&Close<Tab>:q :confirm q<CR>
    Элементы строки разделяются пробелами. В данном случае первый из них, amenu - команда, обеспечивающая появление данной позиции меню во всех (all) режимах. Второй (m.n) - число, часть до точки которого определяет позицию в главном (горизонтальном), а после точки - в выпадающем (вертикальном) меню. Подобным образом лексемы до и после точки третьего элемента строки представляют собой текстовое содержание позиции меню. Пробелы и точки в составе этих лексем исключаются (quote) с помощью обратной косой черты (backslash). Допустим только один служебный символ - <Tab>. Ведущим (hot) символам в составе лексем предшествует амперсенд (&). Четвёртый элемент - собственно команда, которую нужно выполнить. Просто и эффективно. Если команда предполагает редактирование или если Вам требуется дополнительный контроль над командами - не завершайте строки <CR>. Фактически, система меню просто вводит за вас необходимую "EX"-команду.
  • вышеупомянутый режим сравнения файлов запускается командой:
               vimdiff file1 file2 ...
  • folding ("папки") управляются группой z-команд. Как нетрудно догадаться, zc, zo и zd означают соответственно закрытие, открытие и удаление folding-а (close, open, delete). Принцип группирования строк задаётся соответствующей опцией. У меня это, например:
                set foldmethod=marker
  • очень интересна опция
                set virtualedit=block
    позволяющая отмечать блок независимо от того, есть в нужной позиции символ или нет, то есть так, как если бы пустые позиции автоматически заполнялись пробелами;
  • ещё одна очень "приятная" мелочь: модификатор ("v", "V" или CTRL-V) между оператором и командой перемещения определят его область действия в символах, словах или блоках;
  • не стесняйтесь отредактировать $VIMRUNTIME/syntax/syncolor.vim - цвета, предложенные авторами для отображения синтаксиса не так безобразны, как это имеет место в редакторе MidnightCommander, например, но тоже не всем по вкусу;
  • для открытия файла в кодировке win-1251 используйте команду:
                   :e ++enc=cp1251 file
    или, если запомнить её никак не удаётся, введите в menu.vim, секция File menu, следующие строки:
                   amenu 10.355 &File.OpWin :e ++enc=cp1251
                   amenu 10.360 &File.EncWin :w ++enc=cp1251
                   amenu 10.365 &File.EncKoi :w ++enc=koi8-r
    Эти позиции меню позволят открывать файл в кодировке win-1251 и сохранять его в win-1251 или в koi8-r;
  • если упомянутое выше сохранение последовательностей команд в именованном регистре (с целью последующего многократного вызова) пришлось по вкусу - стоит заметить, что последовательности эти записываются в ~/.viminfo. Файл этот можно сохранять и редактировать, а несложный скрипт, переименовывающий его версии, позволит иметь несколько наборов макрокоманд на разные "случаи жизни".

Примечания разместителя:

[1] Мне кажется, несколько вдаться в детали тут необходимо. Дело в том, что только включение опции --with-features=big обеспечивает поддержку той самой функции langmap, о которой речь пойдет двумя пунктами ниже. А без нее для ввода любой команды в обычном режиме пришлось бы каждый раз переключаться на латиницу.

И еще. В большинстве дистрибутивов Linux, претендующих на интернациональность, vim штатно собран с поддержкой langmap (а в Gentoo, скажем, она автоматически включается при установке через систему портежей). А вот во FreeBSD при установке vim из прекомпилированного пакета поддержки langmap не обнаруживается - об этом нужно позаботиться самому, собирая его из системы портов.

Обратно к тексту