Семь привычек эффективного редактирования текстов

Bram Moolenaar

Если вы проводите достаточно много времени набирая обычные текстовые файлы, например, программы или HTML-код, вы могли бы сэкономить значительную часть этого времени используя хороший текстовый редактор и используя его эффективно. Эта статья знакомит с принципами и даёт подсказки, как выполнять эту работу быстрее и с меньшим количеством ошибок.

Для демонстрации идей эффективного редактирования будет использован текстовый редактор с открытым исходным кодом vim (Vi IMproved), но сами идеи могут с тем же успехом использоваться при работе и с другими редакторами. Выбор правильного редактора, фактически, является первым шагом к эффективному редактированию. Обсуждение выбора наиболее подходящего редактора заняло бы слишком много места и здесь проводиться не будет. Если вы не знаете, какой редактор вам стоит начать использовать, либо не удовлетворены тем редактором, который используете в данный момент, попробуйте Vim, и он вас не разочарует.

[Команды и опции Vim набраны таким шрифтом]

Часть 1: редактирование файла

1. Перемещайтесь по тексту быстро

Обычно гораздо больше времени тратится на чтение, поиск ошибок и выбор места в файле, над которым нужно поработать, чем на непосредственный ввод или изменение текста. Перемещение по тексту осуществляется очень часто, поэтому было бы полезно научиться делать это быстро.

Достаточно часто требуется осуществлять поиск некоторого текста, о котором известно, что он встречается в данном файле. Или просматривать все строки, в которые входит определенное слово или фраза. Можно просто воспользоваться командой поиска /шаблон для нахождения интересующего места, но есть и более изящные способы:

При работе со структурированным текстом имеется ещё больше возможностей для быстрой навигации. В Vim есть специальные команды для программ на C (и подобных ему языках, таких как C++ и Java):

Конечно же, подобных команд существует гораздо больше. Дело в том, что вам нужно изучить эти команды, чтобы использовать. Вы можете возразить, что, вероятно, не сможете выучить все эти команды, ведь существуют сотни различных команд перемещения среди которых есть и простые, и достаточно хитроумные, и что уйдут недели тренировок на изучение всех этих команд. Что ж, вам и не нужно изучать их все. Вместо этого нужно разобраться в своем индивидуальном стиле редактирования и изучить только те команды, которые помогут сделать его более эффективным.

Вот три простых шага:

  1. Во время редактирования обращайте внимание на действия, которые вы периодически повторяете и/или на которые тратите существенное время.
  2. Выясните, не существует ли команды редактора, которая помогла бы выполнять данные действия быстрее. Посмотрите документацию, спросите друга или посмотрите, как это делают другие.
  3. Тренируйтесь пользоваться командой. Делайте это до тех пор, пока пальцы не смогут выполнять её не думая.

Посмотрим на примере, как это работает:

  1. Вы заметили, что во время редактирования файлов C-программ, вы часто тратите время на поиск объявления функций. В настоящее время вы пользуетесь командой * для поиска других мест, в которых встречается имя функции, но это заканчивается хождением по большому количеству совпадений, в которых функция вызывается, а не объявляется. В голову приходит идея, что должен существовать какой-то более эффективный способ.
  2. Просмотрев справочную информацию, вы обнаруживаете заметку о прыжках к тегам. В документации говорится о том, как это можно использовать для перехода к объявлениям функций. Именно то, что вы искали!
  3. Вы немного экспериментируете с созданием тегового файла используя программу ctags, распространяемую вместе с vim. Вы учитесь использовать команду CTRL-], и понимаете, что сберегаете за счёт этого много времени. Чтобы ещё больше облегчить себе жизнь вы добавляете несколько строк к Makefile для автоматической генерации тегового файла.

Несколько моментов, которых стоит остерегаться, применяя эти три шага:

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

2. Ничего не набирайте дважды

Множество набираемых нами слов ограничено. Ограничено даже количество фраз и предложений. Особенно при наборе компьютерных программ. Разумеется, никто не хочет набирать одно и то же несколько раз.

Очень часто требуется заменить одно слово на другое. Если это нужно сделать во всем файле, можно воспользоваться командой замены :s. Если нужно заменить только несколько вхождений, хорошим методом будет использование команды * для поиска следующего вхождения и команды cw для изменения слова, а затем переход командой n к следующему вхождению и применение команды . (точка) для повторения предыдущей команды редактирования (cw).

Команда . повторяет последнее изменение. Здесь под изменением понимается вставка, удаление или замена текста. Возможность повторения изменений является очень мощным механизмом. Если научиться пользоваться этой командой, множественные изменения текста станут осуществимы одним лишь нажатием этой (.) кнопки. Но будьте внимательны: если между применениями команды сделать ещё какие-то изменения, они заменят последовательность, которую вы повторяли. Поэтому лучше сначала пометить необходимое место с помощью команды m, закончить последовательность повторов, а потом вернуться к отмеченному месту и поработать с ним.

Имена некоторых функций и переменных могут быть весьма трудны для набора. Можете ли вы быстро напечатать "XpmCreatePixmapFromData" без опечаток и не глядя на образец? В Vim есть механизм завершения слов, который может очень помочь в подобных ситуациях. Он просматривает слова, набранные выше в редактируемом файле, а также во всех подключенных (#include) файлах. Можно набрать лишь часть слова "XpmCr", а затем нажать CTRL-N, и Vim допишет его до "XpmCreatePixmapFromData" за вас. Это не только облегчает набор, но и помогает избежать лишних опечаток и последующего их исправления после того, как компилятор выдаст сообщение об ошибке.

Если вам нужно набрать какую-то фразу или предложение несколько раз, существует даже ещё более эффективный подход. В Vim есть механизм записи макросов. Наберите команду qa, чтобы начать запись в регистр 'a'. Затем как обычно набирайте свои команды, а в конце снова введите команду 'q' для окончания записи макроса. Когда вам нужно будет повторить записанные команды, наберите @a. Для записи макросов доступно 26 регистров.

При помощи макросов можно повторять различные виды операций, а не только ввод текста. Помните об этой возможности, когда собираетесь что-нибудь повторять.

Есть один момент, о котором необходимо помнить во время записи макросов. Записанные команды будут повторяться в точности так, как вы их набирали. Во время перемещений по тексту необходимо понимать, что текст, к которому впоследствии будет применён макрос может отличаться от текущего. Перемещение на четыре символа влево подходит к тексту, на котором записывается макрос, но при повторе макроса может понадобиться переход не на четыре, а на пять символов. Часто предпочтительнее перемещаться по объектам текста (словам, предложениям) или непосредственно к определённому символу.

Если команды, которые необходимо повторять, становятся более сложными, набрать их правильно даже один раз тяжело. В таком случае, вместо записи макроса, следует написать скрипт или макрос. Этот подход очень полезен для шаблонных частей программного кода, например, заголовков функций. Если необходимо, скрипты могут быть достаточно сложными.

3. Работа над ошибками

Делать ошибки во время печати — совершенно естественно. Никто не может их избежать. Фокус в том, чтобы быстро их находить и исправлять. Редактор может вам в этом помочь. Но вы должны сказать ему, что правильно, а что нет.

Часто бывает так, что мы делаем одни и те же ошибки снова и снова. Пальцы просто отказываются делать то, что от них ожидается. В таких случаях могут помочь "аббревиатуры". Вот несколько примеров.

:abbr Lunix Linux
:abbr accross across
:abbr hte the
Слова будут исправляться сразу после того, как вы их наберёте.

Тот же механизм можно использовать для набора длинных слов по нескольким буквам. Особенно полезно его использовать для слов, которые вам кажутся затруднительными. Он поможет избежать ошибок при наборе таких слов. Примеры:

:abbr pn pinguin
:abbr MS Mandrake Software

Тем не менее, данный механизм всегда производит замену, если у него есть соответствие, а это затрудняет набор в тех случаях, когда вы хотите вставить в текст именно "MS". Лучше всего использовать сокращения, которые сами по себе не имеют смысла.

Для поиска ошибок в тексте в Vim есть серьёзный механизм подсветки. Он был задуман для подсвечивания синтаксиса программных текстов, но с таким же успехом его можно использовать для поиска и подсветки ошибок.

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

Подсветка синтаксиса может помочь отловить несбалансированные скобки. Скобка ")" без пары подсвечивается ярким красным фоном. Можно воспользоваться командой %, чтобы выяснить соответствие между скобками, и вставить "(" или ")" в нужное место.

Другие распространённые ошибки также легко обнаруживаются с подсветкой синтаксиса. Например, можно написать "#included <stdio.h>" вместо "#include <stdio.h>". Ошибку легко пропустить в чёрно-белом файле, а с подсветкой её сразу видно, т.к. "include" выделяется цветом, а "included" - нет.

Более сложный пример: для английских текстов есть большой список слов, которые могут быть использованы. Любое слово, не входящее в этот список, может быть ошибкой. С помощью подсветки можно выделить все слова, которые не входят в список. Несколько дополнительных макросов позволят добавлять новые слова в список, тогда они не будут больше выделяться в качестве ошибок. Это работает также, как и в текстовых процессорах. Но в Vim это осуществляется с помощью скриптов, и вы имеете возможность дальнейшей настройки этого механизма под свои нужды: например, в программных текстах проверять на ошибки только комментарии.

Часть 2: Редактирование нескольких файлов

4. Файл редко "приходит" один

Люди не работают только с одним файлом. Обычно есть множество связанных файлов, и вы редактируете их поочерёдно, или, даже, одновременно. В таких случаях нужно уметь использовать преимущества вашего редактора в части более эффективной работы с несколькими файлами.

Упомянутый выше механизм тегов работает также и для перемещения между файлами. Обычный подход — сгенерировать теговый файл для всего проекта, над которым вы работаете. После этого можно быстро перемещаться между всеми файлами проекта для поиска определений функций, структур, типов и т.д. Время, которое вы сохраните по сравнению с ручным поиском, просто огромно. Создание тегового файла — первое, что я делаю, приступая к работе с программой.

Другой мощный механизм — поиск всех вхождений имени в группе файлов с использованием команды :grep. Vim составляет список всех совпадений и переходит к первому. Команда :cn служит для перехода к каждому следующему вхождению. Это весьма полезно, когда нужно изменить количество аргументов в вызове функции.

Подключаемые файлы (include) содержат много полезной информации. Но поиск нужного файла, содержащего именно то объявление, которое необходимо увидеть, может занять много времени. Vim понимает подключаемые файлы и может просматривать их во время поиска нужного слова. Наиболее частое применение - поиск прототипа функции. Установите курсор на имя функции в вашем файле и наберите [I. Vim отобразит список всех вхождений имени функции в подключенных файлах. Если вам необходимо увидеть более широкий контекст, можно перейти непосредственно к объявлению. Подобную команду можно использовать для проверки, подключен ли нужный заголовочный файл.

В Vim можно разделить область текста на несколько частей и редактировать в них разные файлы. Таким образом, можно сравнивать содержимое двух или более файлов и копировать текст между ними. Существует множество команд для открытия и закрытия окон, перехода между ними, временного скрытия файлов и т.д. И снова придётся прибегнуть к использованию подхода трёх шагов, чтобы выбрать те команды, которые вы хотите изучить и использовать.

Есть много вариантов использования нескольких окон. Механизм предварительного просмотра тегов — очень хороший тому пример. Он позволяет открыть специальное окно предпросмотра, при этом курсор остаётся в редактируемом вами файле. Текст в окне предпросмотра показывает, например, объявление функции, соответствующее имени функции, находящемуся под курсором. Если переместить курсор к другому имени и подождать секунду, окно предварительного просмотра покажет объявление этого имени. То же самое работает и для имён структур, и для функций, которые объявлены в заголовочных файлах вашего проекта.

5. Давайте работать вместе

Редактор служит для редактирования текста. Почтовая программа — для отправки и получения сообщений электронной почты, операционная система — для выполнения программ. У каждой программы своя задача, с которой она должна хорошо справляться. Настоящая эффективность возникает, когда программы согласованно работают вместе.

Простой пример: Выделите участок структурированного текста в списке и отсортируйте: !sort. Будет применена внешняя команда "sort" для фильтрации этого текста. Просто, не правда ли? Конечно, функциональность сортировки могла бы быть включена в редактор. Но взгляните на справочное описание "man sort", у неё множество опций. А алгоритм, который осуществляет сортировку, наверняка не прост. Вы всё ещё хотите включить это в редактор? А другие команды фильтрации? Редактор станет очень толстым.

Это всегда было в духе Unix — использовать отдельные программы, которые хорошо умеют выполнять свою работу, совместно для выполнения больших задач. К сожалению, большинство редакторов не способны хорошо работать совместно с другими программами, и например, вы не можете заменить стандартный e-mail редактор в Netscape на другой. В таких случаях все заканчивается использованием "хромого" редактора. Другая тенденция заключается во включении широкого спектра функционала в сам редактор. Emacs — хороший пример того, чем это может обернуться. (Некоторые называют его операционной системой, которая может быть использована ещё и для редактирования текстов.)

Vim старается интегрироваться с другими программами, но пока это даётся не просто. В настоящий момент Vim можно использовать в качестве редактора для MS-Developer Studio и для Sniff. Некоторые почтовые программы, позволяющие вызывать внешний редактор, такие как Mutt, могут использовать Vim. Над интеграцией с Sun Workshop ведутся работы. В целом, это область, которую необходимо улучшить в Vim в ближайшем будущем. Только после этого мы сможем получить систему, которая в целом лучше, чем сумма её частей.

6. Текст структурирован

Часто приходится работать с текстами, которые имеют какое-то подобие структуры, но структура эта отличается от того, что поддерживается доступными командами. В таких случаях придётся спуститься на уровень строительных блоков редактора и создать свои собственные макросы и скрипты для работы с таким текстом. В этом разделе мы переходим к более сложному инструментарию.

Один из простых вопросов — ускорение цикла редактирование-компиляция-исправление. В Vim есть команда :make, которая запускает компиляцию, перехватывает ошибки и позволяет перемещаться к местам ошибок в тексте для исправления. Если у вас другой компилятор, сообщения об ошибках распознать не удастся. Вместо того, чтобы начать по старинке выписывать ошибки на бумажку, вам следует настроить параметр 'errorformat'. Этот параметр рассказывает Vim, как выглядят ваши сообщения об ошибках, и как извлечь из них имя файла и номер строки. Этот метод работает со сложными сообщениями об ошибках компилятора gcc, и вы наверняка сможете настроить его на работу практически с любым другим компилятором.

Чаще всего настройка под определённый тип файла — это вопрос установки нескольких опций или написания небольшого количества макросов. Например, для перехода по страницам руководства (man), можно написать макрос, который берёт слово под курсором, очищает буфер и, затем, открывает в этом буфере страницу руководства для данного слова.

Используя три простых шага, можно эффективно работать с любым видом структурированного файла. Просто обдумайте действия, которые необходимо выполнять с файлом, определите команды редактора, которые их осуществляют, и начните ими пользоваться. Это действительно настолько же просто, как звучит. Просто нужно это делать.

Часть 3: заточка пилы

7. Сделайте это привычкой

Обучение вождению автомобиля требует приложения усилий. Это причина продолжать ездить на велосипеде? Вы понимаете, что должны вложить время в получение дополнительных навыков. Редактирование текста не является, в данном смысле, исключением. Вы должны изучать новые команды и делать их использование привычкой.

С другой стороны, не нужно стараться выучить все команды, которые редактор может предложить. Это будет пустой тратой времени. Большинству людей для выполнения их работы нужно знать 10–20 % команд. Но набор необходимых команд у каждого свой. Его формирование требует от вас некоторого внимания, которое тратится, чтобы подумать, нет ли каких либо повторяющихся действий, поддающихся автоматизации. Если вам нужно выполнить действие только один раз, не стоит пытаться его автоматизировать. Но вы, вероятно, обнаружите, что выполняли какие-то действия повторно за последний час. В таком случае стоит поискать в документации описание команды, позволяющей сделать это быстрее. Или напишите макрос. Если написание скрипта требует большой работы как, например, автоматическая разметка определённого вида текста, то можно поискать в форумах или в Интернет: возможно кто-то уже эту задачу решил.

В "трёх простых шагах" самый главный — последний. Вы можете выбрать повторяющуюся операцию, подобрать хороший способ её выполнения, и через неделю его забыть. Нужно повторять выполнение команды до тех пор, пока ваши пальцы не будут делать это на автомате. Только тогда вы добьётесь необходимой эффективности. Не пытайтесь запомнить сразу много. Делайте каждый раз по немногу. Приёмы, к которым не удаётся прибегать достаточно часто, чтобы запомнить, можно записать, и подсматривать в эту шпаргалку, когда необходимо. В любом случае, если цель стоит у вас перед глазами, вы найдёте способы редактировать всё более эффективно.

И последнее замечание, чтобы напомнить, что случается с людьми, которые игнорируют изложенные советы: мне всё ещё встречаются люди, которые проводят полдня перед монитором, смотрят то на экран, то на свои два пальца, то снова на экран и т.д., и потом не могут понять, почему так устали... Печатайте десятью пальцами! Это не только быстрее, это ещё и намного менее утомительно. Если использовать компьютерную программу обучения печати один час каждый день, понадобится всего две недели, чтобы научиться быстро печатать.

Эпилог

Идея названия взята из удачной книги "7 привычек высоко эффективных людей" (автор Stephen R. Covey). Я рекомендую её всем, кто хочет решить свои профессиональные и личные проблемы (а кто не хочет?). Некоторые могут заявить, что она пришла из книги Дилберта "Семь лет высоко дефективных людей" (автор Scott Adams) (тоже рекомендую!). Нажмите http://iccf-holland.org/click1.html и перейдите к разделу "recommended books and CDs".

Об авторе

Bram Moolenaar — главный автор редактора Vim. Он разрабатывает основной функционал, и выбирает код, присылаемый многими другими разработчиками, который необходимо включить в программу. Он закончил Дельфтский технический университет по специальности компьютерный техник. Сейчас он в основном занимается программным обеспечением, но всё еще способен управляться с паяльником. Он основатель и казначей ICCF Holland, помогающего сиротам в Уганде. Он внештатно работает системным архитектором, но, в основном, всё свое время тратит на разработку Vim. Его электронный адрес: Bram AT Moolenaar.net.

Перевёл на русский язык Константин Бакарас, kbakaras at gmail.com.