Erhalten Sie Zugang zu diesem und mehr als 300000 Büchern ab EUR 5,99 monatlich.
Среди текстовых редакторов, используемых программистами, самыми важными является vi и его вариации. В обновленном издании пользователи Unix и Linux изучат основы редактирования текста как в vi, так и в Vim (vi improved), прежде чем перейти к более продвинутым инструментам в каждой из программ. Авторы Арнольд Роббинс и Элберт Ханна описывают основные новейшие версии Vim. Если вы программист или компьютерный аналитик, либо работаете с веб- или консольными интерфейсами, Vim упростит решение сложных задач. Вы освоите многооконное редактирование, глобальный поиск/замену и прочие мощные инструменты для программистов, а также научитесь писать интерактивные макросы и сценарии, расширяющие возможности программы.
Sie lesen das E-Book in den Legimi-Apps auf:
Seitenzahl: 638
Veröffentlichungsjahr: 2023
Das E-Book (TTS) können Sie hören im Abo „Legimi Premium” in Legimi-Apps auf:
Переводчик С. Черников
Арнольд Роббинс, Элберт Ханна
Изучаем vi и Vim. Не просто редакторы. 8-е изд.. — СПб.: Питер, 2023.
ISBN 978-5-4461-2019-2
© ООО Издательство "Питер", 2023
Все права защищены. Никакая часть данной книги не может быть воспроизведена в какой бы то ни было форме без письменного разрешения владельцев авторских прав.
Моей жене Мириам. Спасибо за твою любовь, терпение и поддержку.
Арнольд Роббинс, шестое, седьмое и восьмое издания
Моей жене Анне. Благодарю за любовь, моральную поддержку и вдохновение. Спасибо, что ты всегда рядом.
Элберт Ханна, седьмое и восьмое издания
Редактирование текста — одна из наиболее распространенных задач в любой компьютерной системе, а vi входит в число самых полезных стандартных текстовых редакторов. С помощью vi вы сможете создавать и редактировать текстовые файлы.
Редактор vi, как и многие классические утилиты, разработанные на заре Unix®, может показаться трудным в освоении. Vim (vi Improved) — улучшенная версия программы, разработанная Брэмом Моленаром, разрушает этот стереотип. Vim включает в себя множество удобных функций, наглядных руководств и справочников.
Сегодня Vim — самая популярная версия редактора vi, поэтому в восьмом издании мы сфокусируемся именно на ней.
• Часть I помогает освоить базовые навыки vi, применимые ко всем версиям редактора vi в контексте Vim.
• Часть II посвящена расширенным функциям Vim.
• Часть III позволяет взглянуть на Vim в более широкой среде.
• Часть IV содержит приложения.
Книга состоит из 17 глав и 4 приложений. Часть I предназначена для быстрого освоения первичных приемов работы с vi и Vim, а также для развития навыков, которые позволят вам более эффективно использовать эти редакторы.
В первых двух главах представлены некоторые простые команды редактирования, доступные в vi и Vim. Очень важно довести выполнение данных команд до автоматизма, поэтому практикуйте их как можно чаще. В главе 2 продемонстрированы элементарные операции редактирования. В целом для быстрого ознакомления с vi и Vim достаточно этих двух глав.
Однако описываемые программы предназначены для гораздо большего, чем элементарная обработка текста. Разнообразие команд и возможностей позволяет вам сократить количество рутинной работы по редактированию текста. Главы 3 и 4 сосредоточены на более простых способах выполнения тех же задач. Во время первого прочтения вы получите представление о том, что могут vi и Vim и какие команды лучше использовать под ваши конкретные нужды. Позже вы сможете вернуться к этим главам для более глубокого изучения.
В главах 5–7 представлены инструменты, способные переложить бо´льшую часть редактирования на сами программы. Вы познакомитесь со строковым редактором ex, лежащим в основе vi и Vim, и узнаете, как выполнять ex команды из vi и Vim.
В части II описывается редактор Vim — самый популярный клон vi в XXI веке. В ней подробно рассказывается о множестве функций Vim и его отличиях от оригинального vi.
Глава 8 содержит общее введение в Vim. Здесь приведен обзор основных улучшений Vim по сравнению с vi, таких как встроенная справка, расширенные возможности по настройке инициализации, дополнительные команды перемещения, расширенные регулярные выражения и многое другое.
В главе 9 рассматривается Vim в современных средах с графическим интерфейсом, ставших сегодня стандартами для коммерческих систем GNU/Linux и других Unix-подобных ОС, а также Windows.
В главе 10 вы познакомитесь с многооконным режимом, который является, пожалуй, наиболее важным дополнением, которого нет в стандартной программе vi. В этой главе подробно рассказывается о создании и использовании нескольких окон.
Глава 11 посвящена использованию Vim в качестве редактора программ, помимо его функционала по обработке текста. Особую ценность представляют средства сворачивания и выделения, смарт-отступы, подсветка синтаксиса и ускорение цикла редактирования-компиляции-отладки.
В главе 12 рассматривается командный язык Vim, на котором создаются сценарии (скрипты) для настройки и адаптации Vim в соответствии с вашими потребностями. В целом простота работы с Vim обусловлена большим количеством сценариев, написанных другими пользователями, внесшими свой вклад в дистрибутив Vim.
Глава 13 охватывает ряд интересных моментов, которые не вписываются в предыдущие главы.
В главе 14 разобраны некоторые полезные «мощные приемы». Основанная на идее персональных настроек назначения клавиш, данная глава поможет узнать больше о том, как быть продуктивным.
Часть III касается ролей vi и Vim в более широком мире разработки программного обеспечения (ПО) и работы с компьютерами.
Глава 15 затрагивает основы работы с плагинами в Vim, фокусируясь на том, как превратить Vim из «простого» редактора в полноценную интегрированную среду разработки (IDE).
В главе 16 рассматриваются другие важные программные среды, в которых редактирование в стиле vi повлияет на рост производительности в целом.
В главе 17 подводятся краткие итоги всей книги.
Часть IV содержит полезные справочные материалы.
В приложении A перечислены все стандартные команды vi и ex, отсортированные по предназначению. Представлен алфавитный список команд ex. Также представлены избранные команды vi и ex из Vim.
В приложении Б перечислены параметры команды set в программах vi и Vim.
Приложение В содержит юмористические материалы, связанные с vi.
Приложение Г описывает, как установить программы vi и Vim в системах Unix, GNU/Linux, Windows и macOS.
Наша цель — помочь новым пользователям vi и Vim без особого труда освоить эти программы. Изучение нового редактора, особенно такого мощного, как Vim, с виду кажется непосильной задачей. Мы представили основные концепции и команды в понятной и логичной форме.
После рассмотрения основ vi и Vim мы погружаемся в более подробное изучение Vim. Далее описаны условные обозначения, используемые в книге.
Каждую клавишу или сочетание клавиш, а также группу связанных команд мы сопровождаем кратким описанием, прежде чем ориентироваться на конкретные задачи. Затем мы приводим соответствующие команды для каждого конкретного случая, а также их описание и корректный синтаксис.
Синтаксис и примеры выделены таким шрифтом, а все имена файлов, команд и параметры программы — такиммоношириннымшрифтом. Переменные (которые заменяем конкретным для той или иной ситуации значением) оформлены курсивныммоношириннымшрифтом. В скобках они указаны как необязательные. Например, в строке ниже параметр имя_файла нужно заменить фактическим именем файла:
vi [имя_файла]
Квадратные скобки говорят о том, что команду vi можно вызвать без указания имени файла. Скобки вводить не нужно. В некоторых примерах показан результат выполнения команд, введенных в командной строке. В таких листингах то, что вам нужно ввести, отформатировано полужирнымшрифтом, чтобы вы не спутали его с ответом системы.
Например:
$ ls
ch01.xml ch02.xml ch03.xml ch04.xml
В примерах кода обыкновеннымкурсивом обозначен комментарий, который вводить не нужно, а в тексте — специальные термины и все, на что следует обратить внимание.
Следуя традиционному соглашению о документации Unix, ссылки вида printf(3) относятся к онлайн-руководству (доступ осуществляется с помощью команды man). Этот пример относится к записи о функции printf() в разделе 3 руководства. Введите команду man-s3printf (в большинстве систем эта команда сработает), чтобы открыть руководство.
Здесь приводится информация, на которую нужно обратить пристальное внимание.
Указывает на неочевидные вещи, которые могут представлять интерес.
Здесь описываются полезные сочетания клавиш или действия, экономящие время.
Особые клавиши или их сочетания обозначаются шрифтом на сером фоне: «Нажмите клавишу Esc, чтобы перевести редактор в командный режим».
В книге вам будут встречаться таблицы с командами vi/Vim и результатами их действия.
Команда
Результат
ZZ
"practice" [New] 6L, 104C written
Команда записи и сохранения, ZZ. Ваш файл сохранится как обычный файл на диске
В предыдущем примере команда ZZ приведена в левом столбце. В правом находится строка (или несколько строк) экрана, которая показывает результат выполнения команды. Положение курсора в таких примерах обозначено прямоугольником. В этом случае, поскольку команда ZZ сохраняет и записывает файл, вы видите строку состояния, отображаемую при записи файла; положение курсора не отображается. Под командой (результатом) приводится объяснение ее и того, что она делает.
В некоторых таблицах отражены команды оболочки и результат их выполнения. В таких случаях командам предшествует стандартное приглашение $, а сама команда выделена жирным шрифтом.
Команда
Результат
$ls
ch01.asciidoc ch02.asciidoc ch03.asciidoc
Иногда команды vi можно вызвать, одновременно нажав Ctrl и дополнительную клавишу (например, Ctrl+G). В примерах кода перед именем ключа ставится символ ^. То есть ^G означает, что нужно удерживать нажатой клавишу Ctrl при нажатии клавиши G. Принято обозначать управляющие символы прописными буквами (^G, а не ^g), даже если при их наборе вы не удерживаете нажатой клавишу Shift1.
Кроме того, заглавные буквы отображаются с использованием обозначения сочетаний клавиш, например Shift+X для некоего символа X. Таким образом, a представляется как клавиша A, а буква A представляется как Shift+A.
Список проблем приведен в тех разделах, где это наиболее актуально. Вы можете быстро просмотреть эти списки и вернуться к ним, если возникнут вопросы.
Материал книги подходит тем, кто обладает базовыми знаниями на уровне пользователя Unix. В частности, вы уже должны уметь:
• открывать окно терминала, чтобы перейти к командной строке;
• входить в систему и выходить из нее, обычно через ssh, если используется удаленная система;
• вводить команды в командную строку;
• изменять каталоги;
• выводить содержимое папок;
• создавать, копировать и удалять файлы.
Полезно также знать команду grep (программа глобального поиска) и уметь работать с регулярными выражениями.
Хотя современные системы позволяют запускать Vim из меню с графическим интерфейсом, вы теряете доступ к гибкости, которую обеспечивают опции командной строки Vim. На протяжении всей книги в наших примерах запуск vi и Vim происходит именно из командной строки.
Дополнительные материалы (примеры кода, упражнения и т.д.) можно загрузить по адресу www.github.com/learning-vi/vi-files.
В общем случае все примеры кода из книги вы можете использовать в своих программах и в документации. Вам не нужно обращаться в издательство за разрешением, если вы не собираетесь воспроизводить существенные части программного кода. Если вы разрабатываете программу и используете в ней несколько фрагментов кода из книги, вам не нужно обращаться за разрешением. Но для продажи или распространения примеров из книги вам потребуется разрешение от издательства O’Reilly. Вы можете отвечать на вопросы, цитируя данную книгу или примеры из нее, но для включения существенных объемов программного кода из книги в документацию вашего продукта потребуется разрешение.
Мы рекомендуем, но не требуем добавлять ссылку на первоисточник при цитировании. Под ссылкой на первоисточник мы подразумеваем указание авторов, издательства и ISBN.
За получением разрешения на использование значительных объемов программного кода из книги обращайтесь по адресу [email protected].
В пятом издании впервые были подробно рассмотрены команды редактора ex. В главах 5, 6 и 7 сложные функции ex и vi были разъяснены путем добавления дополнительных примеров, охватывающих такие темы, как синтаксис регулярных выражений, глобальная замена, файлы .exrc, аббревиатуры, сочетания клавиш и сценарии (скрипты). Несколько примеров были взяты из статей журнала UnixWorld. Уолтер Зинц написал руководство2 по vi, состоящее из двух частей, которое учит новым функциям, а также содержит множество интересных примеров, иллюстрирующих ранее рассмотренные возможности. Также Рэй Шварц в одной из своих статей давал немало полезных советов, за которые мы ему благодарны3.
В шестом издании рассмотрено четыре свободно доступных «клона» редактора vi. Многие из них функциональнее vi. Таким образом, существует семейство редакторов vi, и цель книги состояла в том, чтобы научить читателя основам использования каждого. В том издании на одинаковом уровне рассматривались nvi, Vim, elvis и vile. В приложении описывалась роль vi в культуре Unix и Интернета.
Седьмое издание взяло все лучшее из шестого. Время показало, что Vim остается самым популярным аналогом vi, поэтому седьмое издание значительно расширило охват функций этого редактора (также мы добавили слово Vim в название книги). Однако, чтобы сохранить актуальность материала для как можно большего числа пользователей, были сохранены и обновлены сведения о программах nvi, elvis и vile.
В восьмом издании мы сохранили всю полезную информацию из седьмого. В наши дни Vim правит бал, поэтому мы расширили информацию о нем и удалили разделы, посвященные программам nvi, elvis и vile. В части I Vim теперь играет роль программы для выполнения инструкций и примеров. Кроме того, была удалена информация о проблемах со старыми версиями оригинальной программы vi, которые уже неактуальны. Мы попытались упорядочить материал и сделать книгу как можно более актуальной и полезной.
Перечислим, что мы изменили в этом издании.
• Исправили ошибки в основном тексте.
• Тщательно пересмотрели и обновили материал в частях I и II.
• В части I перенесли акцент с оригинальной версии vi для Unix на vi в контексте Vim.
• Добавили оригинальную главу в часть II, а также дополнили часть III совершенно новыми главами.
• Переработали приложение В.
• Перенесли материал о загрузке и установке Vim из основного текста в приложение Г.
• Другие приложения также были обновлены.
Для тестирования различных функций vi использовались следующие программы:
• vi Heirloom со страницы https://github.com/n-t-roff/heirloom-ex-vi. Эта версия служит эталонной для оригинальной Unix-программы vi;
• Solaris 11 /usr/xpg7/bin/vi (в Solaris 11 по адресу /usr/bin/vi на самом деле расположена программа Vim! Версии vi в /usr/xpg4/bin, /usr/xpg6/bin и /usr/xpg7/bin, по-видимому, являются производными от оригинальной Unix-программы vi);
• версии Vim 8.0, 8.1 и 8.2 Брэма Моленара.
Прежде всего, спасибо моей жене Мириам за заботу о детях, пока я работал над книгой, особенно в «ведьмин час» перед едой. Спасибо ей за тишину в доме и мороженое.
Пол Манно из Технологического колледжа компьютерных наук Джорджии оказал неоценимую помощь в настройке печатного ПО. Сотрудники издательства O’Reilly & Associates Лен Мюллнер и Эрик Рэй помогли с программным обеспечением SGML, а макросы vi Джерри Пика для данного ПО оказались просто бесценны.
Хотя при подготовке нового и переработанного материала использовались различные программы, бо´льшая часть работы была выполнена с помощью Vim версий 4.5 и 5.0 под управлением GNU/Linux (Red Hat 4.2).
Спасибо Киту Бостику, Стиву Киркендаллу, Брэму Моленару, Полу Фоксу, Тому Дики и Кевину Бюттнеру, которые рецензировали книгу. Стив Киркендалл, Брэм Моленар, Пол Фокс, Том Дики и Кевин Бюттнер также предоставили важный материал для глав 8–12 (эти номера глав относятся к шестому изданию).
Без электричества, поставляемого энергетической компанией, невозможно пользоваться компьютером. Но, когда электричество есть, вы воспринимаете это как должное. То же самое касается написания книги — без редактора сделать это невозможно, но, когда редактор хорошо справляется со своей работой, о его вкладе в процесс очень легко забыть. Джиджи Эстабрук из O’Reilly — настоящая жемчужина. Мне было приятно работать с ней, и я ценю все, что она сделала и продолжает делать для меня. Наконец, большое спасибо технической группе O’Reilly & Associates.
Арнольд Роббинс, Раанана, Израиль. Июнь 1998 года
И вновь Арнольд благодарит свою жену Мириам за ее любовь и поддержку. Его долг за спокойные часы работы и мороженое растет с каждым днем. Кроме того, большая признательность Джей Ди «Иллиада» Фрейзеру за отличные комиксы User friendly4.
Элберт хотел бы поблагодарить Анну, Калли, Бобби и своих родителей за то, что они не переставали восхищаться его работой в трудные времена, и за их заразительный энтузиазм.
Спасибо Киту Бостику и Стиву Киркендаллу за редактуру глав. Том Дики внес значительный вклад в переработку главы о vile и таблицы параметров команды set в приложении Б. Брэм Моленаар (разработчик Vim) также пересмотрел нашу книгу. Роберт П. Джей Дэй, Мэтт Фрай, Джудит Майерсон и Стивен Фиггинс оставили важные комментарии по всему тексту.
Арнольд и Элберт хотели бы поблагодарить Энди Орама и Изабель Кункл за редактуру текста, а также всех сотрудников издательства O'Reilly Media.
Арнольд Роббинс, Ноф-Аялон, Израиль. Апрель 2008 года
Элберт Ханна, Килдир, Иллинойс, США. Апрель 2008 года
Мы хотели бы поблагодарить Кришнана Равикумара, чье электронное письмо Арнольду с просьбой о новом издании положило начало обновлению книги.
Мы также хотели бы поблагодарить технических рецензентов — Йехезкеля Берната, Роберта Пи Джей Дэя, Уилла Гальего, Хесуса Малса, Офру Мойал-Коэн, Пола Померло и Мириам Роббинс.
Арнольд вновь благодарит свою жену Мириам за то, что она справлялась без него, пока продолжалась работа над книгой.
Он также благодарит своих детей, Хану, Ривку, Нахума и Малку, а также собаку Софи.
Элберт хотел бы поблагодарить:
• свою жену Анну, которая вновь терпела его жуткий график и выкрутасы, пока писалась эта книга. Он также благодарит Бобби и Калли за их поддержку и ободрение по мере продвижения работы. Их перманентное жизнерадостное отношение каждый раз поднимало настроение. И он выражает особую благодарность внуку Дину. Одним из первых слов Дина было «книга», и Элберт надеется, что Дин имеет в виду именно эту;
• своего вест-хайленд-уайт-терьера Пончо, который крутился под ногами, пока Элберт писал седьмое издание. Пончо все еще жив, здоров и с нетерпением ждет выхода восьмого издания. Он не умеет читать, но задорно тявкает при виде Vim. (Так держать, Пончо! Лапы только на клавиатуре, никакой мыши!);
• коллег из CME group, с которыми на протяжении прекрасных 13 лет он оттачивал свои навыки и обучал других работе в Vim; особая благодарность:
• Скотту Финку за его заслуги как коллеги, начальника, сотрудника и друга, который всегда пытался разузнать как можно больше не только о редакторе, а обо всей вселенной Vim. В работе со Скоттом Элберт использовал Vim как «дзен» для совместного создания отличных приложений;
• Полу Помероло за техническую редактуру книги и за честность при сравнении Vim и Emacs. И хотя Пол фанатеет от Emacs — он один из лучших сотрудников и друзей Элберта за эти 13 лет;
• Майклу Шакко за демонстрацию программы Microsoft Visual Studio Code. Благодаря Майклу старый пес Элберт научился множеству новых трюков. (Майкл, ты сам как IDE!);
• наконец, Тони Ферраро, под напутствием которого он работал последние дни профессиональной деятельности. Тони всегда поощрял Элберта творить (техническую документацию), а Элберт старался. (Эта книга для тебя, Тони!)
Мы оба хотели бы поблагодарить Гэри О’Брайена и Ширу Эванс за терпеливую редактуру. Говорят, что руководить программистами сложнее, чем согнать кошек в стадо; без сомнения, то же самое относится и к работе с писателями. И снова мы благодарим производственный отдел издательства O’Reilly Media.
Арнольд Роббинс, Ноф-Аялон, Израиль. Сентябрь 2021 года
Элберт Ханна, Килдир, Иллинойс, США. Сентябрь 2021 года
Ваши замечания, предложения, вопросы отправляйте по адресу [email protected] (издательство «Питер», компьютерная редакция).
Мы будем рады узнать ваше мнение!
На веб-сайте издательства www.piter.com вы найдете подробную информацию о наших книгах.
1Возможно, это связано с тем, что на самих клавишах нанесены прописные буквы, а не строчные.
2Статьи vi Tips for Power Users и Using vi to Automate Complex Edits написаны Уолтером Зинцем для журнала UnixWorld в апреле и мае 1990 года соответственно.
3Swartz R. Answers to Unix // UnixWorld, 1990. — August.
4Посетите страницу www.userfriendly.org, если никогда не слышали о комиксах User friendly.
В части I рассматриваются основы работы с редакторами vi и Vim. Вы узнаете о продвинутых приемах, позволяющих использовать данные программы максимально эффективно. Эти главы охватывают функциональные возможности оригинального приложения vi, а также команды, которые можно использовать в любой версии редактора. В последующих главах обсуждаются расширенные функции Vim. В данной части мы затронем следующие темы.
• Глава 1 «Знакомство с vi и Vim».
• Глава 2 «Основы редактирования».
• Глава 3 «Эффективная навигация».
• Глава 4 «За пределами основ».
• Глава 5 «Знакомство с редактором ex».
• Глава 6 «Глобальная замена».
• Глава 7 «Продвинутое редактирование».
Одна из наиболее важных повседневных задач на компьютере — работа с текстом: составление нового текста, редактирование и компоновка имеющегося текста, удаление или изменение неправильного и устаревшего текста. Все это выполняется в специальных текстовых процессорах, например в Microsoft Word. Будучи программистом, вы тоже работаете с текстом: с файлами исходного кода программ и вспомогательными файлами, необходимыми для разработки. Текстовые редакторы обрабатывают содержимое любых подобных файлов, независимо от того, содержат ли они данные, исходный код или естественный текст.
Книга посвящена обработке текста с помощью двух связанных редакторов: vi и Vim. Первый традиционно используется в качестве стандартного текстового редактора Unix5. Второй же основан на консольном режиме vi и командном языке, благодаря чему обладает бо´льшим количеством полезных возможностей, чем исходная программа.
С течением времени текстовые редакторы Unix улучшались и эволюционировали. Первоначально существовали линейные редакторы, такие как ed и ex, предназначенные для использования на последовательных терминалах, которые печатали на бумаге с непрерывной подачей (да, люди действительно программировали такие вещи, включая одного из авторов данной книги!). Линейные редакторы были так названы, потому что работали над программой по одной или нескольким строкам за раз.
С появлением электронно-лучевых терминалов (ЭЛТ) с адресацией курсора линейные редакторы превратились в экранные редакторы, такие как vi и Emacs. Экранные редакторы позволяют работать с несколькими файлами одновременно и легко перемещаться по строкам текста на экране.
С появлением сред графического пользовательского интерфейса (GUI) экранные редакторы превратились в графические текстовые редакторы, в которых используется мышь для прокрутки видимой части файла, перехода к определенной точке и выделения текста. Примерами таких текстовых редакторов, основанных на X Window System, являются gedit в системах на базе Gnome и Notepad++ в Windows. Но существуют и другие.
Особый интерес для нас представляет то, что популярные экранные редакторы эволюционировали в графические: GNU Emacs предоставляет несколько окон X, как и Vim через свою версию gvim. Графические редакторы работают идентично своим оригинальным экранным версиям, что сглаживает переход к программам с GUI.
Из всех стандартных редакторов в системе Unix vi наиболее полезен6. По сравнению с Emacs он доступен в практически идентичной форме на всех современных Unix-системах, обеспечивая, таким образом, своего рода общее средство редактирования текста7. То же самое можно сказать и о редакторах ed и ex, но GUI-редакторы намного удобнее в использовании (настолько, что линейные редакторы больше не используются).
vi — сокращение от visual editor и произносится как «ви». Это наглядно показано на рис. 1.1.
Для большинства новичков интерфейс vi выглядит громоздким и непонятным: вместо того чтобы позволить вам просто печатать текст, здесь почти все клавиши клавиатуры используются для выполнения каких-либо команд. Чтобы набирать текст на экране, вы должны перейти из командного режима, в котором каждая клавиша отвечает за определенное действие, в специальный режим ввода. Кроме того, на первый взгляд кажется, что команд в этой программе огромное множество.
Рис. 1.1. Как правильно произносить vi
Однако, как только вы начнете осваивать редактор, вы поймете, что он неплохо продуман. Вам понадобится лишь несколько нажатий клавиш, чтобы программа начала решать сложные задачи. По мере изучения vi вы узнаете сочетания клавиш, которые позволят компьютеру брать на себя большую часть работы.
vi и Vim (как и любые другие текстовые редакторы) не являются текстовыми процессорами класса «что видите, то и получаете». Если вы хотите создавать форматированные документы, вы должны ввести специальные инструкции (иногда называемые кодамиформатирования), которые считываются отдельной программой форматирования для управления внешним видом выводимого документа. Например, если вы захотите сделать отступ в тексте абзаца, то потребуется ввести код с указанием, где начинается и заканчивается отступ. Коды форматирования позволяют экспериментировать с образом выводимого файла, и во многих отношениях они дают вам гораздо больше контроля над оформлением ваших документов, чем обычный текстовый процессор.
Коды форматирования — это специфические методы в так называемых языках разметки8. В последние годы популярность языков разметки резко возросла, а особую известность приобрели Markdown и AsciiDoc9. Возможно, наиболее популярным языком разметки сегодня является HTML, используемый при создании веб-страниц Интернета.
Помимо вышеупомянутых языков разметки, Unix поддерживает пакет форматирования troff10. Популярны и широко распространены программы форматирования TeX (www.ctan.org) и LaTeX (www.latex-project.org). Чтобы использовать любой из этих языков, достаточно открыть текстовый редактор.
Редактор vi поддерживает некоторые простые механизмы форматирования. Например, вы можете дать ему команду автоматически переносить слова при переходе к концу строки или автоматически делать отступы в новых строках. Кроме того, Vim способен проверять орфографию.
Как и любой навык, редактирование в vi требует практики, и чем больше, тем лучше. Привыкнув ко всем возможностям программы, вы, возможно, не захотите возвращаться к какому-либо «более простому» редактору.
Что такое редактирование? Во-первых, ввод (если, например, забыли какое-то слово или пропустили целое предложение) и удаление текста (случайный символ или целый абзац). Также изменение букв и слов (исправление орфографических ошибок, опечаток). Возможно, вам понадобится переместить текст из одной части документа в другую. И иногда может потребоваться скопировать текст, чтобы продублировать его.
В отличие от многих текстовых процессоров в vi командный режим является режимом по умолчанию. Сложные интерактивные изменения могут быть выполнены всего несколькими нажатиями клавиш. Чтобы ввести текст, сначала необходимо задать любую команду ввода.
Для основных команд используются один или два символа. Например:
• i — ввод;
• cw — изменить слово.
Используя буквы в качестве команд, вы можете очень быстро редактировать файл. Не нужно запоминать сотни горячих клавиш или тянуться пальцами до клавиш в неудобных комбинациях. Вам не придется убирать руки с клавиатуры или возиться с многоуровневыми меню! Большинство команд можно запомнить по первым буквам, отражающим их названия на английском языке. Почти все команды следуют этому принципу и связаны друг с другом.
В целом команды vi и Vim:
• чувствительны к регистру (клавиши в верхнем и нижнем регистре означают разные действия; I отличается от i);
• не отображаются (не выводятся) на экране при вводе;
• не требуют нажатия Enter после ввода команды.
Существует также группа команд, которые отображаются в нижней строке экрана. Им предшествуют разные символы. Слеш (/) и знак вопроса (?) отвечают за команды поиска и обсуждаются в главе 3. Двоеточие (:) предваряет все команды ex. Команды ex — это те, которые используются линейным редактором ex. Редактор ex доступен вместе с любой версией vi, потому что ex — это базовый редактор, а vi — просто его «визуальный» режим. Бо´льшая часть команд и концепций ex обсуждается в главе 5, а в этой мы познакомимся с командами ex для закрытия файла без сохранения изменений.
Прежде чем погрузиться во все тонкости vi и Vim, важно понять роль vi в вашей рабочей среде. В частности, мы разберемся во множестве обескураживающих сообщений об ошибках vi, а также выясним, как Vim эволюционировал по сравнению с оригинальным vi.
Редактор vi появился, когда в ходу были ЭЛТ-терминалы, подключенные через последовательные интерфейсы к центральным миникомпьютерам. Сотни различных моделей терминалов разрабатывались и использовались по всему миру. Каждый из них выполнял одни и те же действия (очищал экран, перемещал курсор и т.д.), но команды, необходимые для реализации этих действий, были разными. Кроме того, система Unix позволяла выбирать символы, которые будут использоваться для возврата, генерации сигнала прерывания и других задач, таких как приостановка и возобновление вывода, выполняемых в последовательных терминалах. Эти действия управлялись (и до сих пор управляются) с помощью команды stty.
В оригинальной версии vi для Berkeley Unix информация об управлении терминалом была отделена от кода (который сложно изменять) и помещена в текстовую базу данных свойств терминала (легко поддающуюся изменениям), управляемую библиотекой termcap. В начале 1980-х годов System V представила двоичную базу данных информации терминала и библиотеку terminfo. Эти две библиотеки в целом были эквивалентны по своему функционалу. Чтобы определить, какой у вас терминал, требовалось установить переменную окружения TERM. Обычно это выполнялось в файле запуска оболочки .profile или .login.
Библиотека termcap больше не используется. Системы GNU/Linux и BSD работают с библиотекой ncurses, которая предоставляет совместимое надмножество базы данных и возможностей библиотеки System Vterminfo.
Сегодня популярны эмуляторы терминалов в графической среде (например, Gnome Terminal). Система почти всегда самостоятельно настраивает значение переменной TERM.
Конечно, вы также можете использовать в Windows консольную программу Vim без GUI. Это пригодится, к примеру, при восстановлении системы в однопользовательском режиме. Однако сейчас мало кто пользуется данным приложением на постоянной основе.
Для повседневного использования лучше всего подойдет версия vi с графическим интерфейсом, например gvim. В системе Microsoft Windows и macOS она, вероятно, будет приложением по умолчанию. Однако при запуске vi (или какого-либо другого экранного редактора того же типа) внутри эмулятора терминала редактор по-прежнему будет обращаться к значению переменной TERM, библиотеке terminfo и к параметрам команды stty. Использование редактора vi внутри эмулятора терминала — простой способ изучить vi и Vim.
Следует также знать, что программа vi была разработана во времена, когда системы Unix были значительно менее стабильными, чем сегодня. Пользователь vi тех лет должен был быть готов к сбою системы в любой момент, и поэтому в vi реализована функция восстановления файлов, которые редактировались в момент выхода системы из строя11. Итак, при изучении программ vi и Vim и при чтении описаний различных вероятных проблем учитывайте эти исторические события.
Редактор vi можно использовать для редактирования любых текстовых файлов. Программа копирует файл в буфер (область памяти, выделяемая временно), отображает содержимое буфера (за раз вы видите только то, что помещается на вашем экране) и позволяет добавлять, удалять и изменять текст. Когда вы сохраняете внесенные изменения, программа копирует отредактированное содержимое буфера обратно в существующий файл, заменяя его под тем же именем. Помните, что вы всегда работаете с копией вашего файла в буфере и что вносимые изменения не влияют на исходный файл, пока вы не примените их, перезаписав содержимым из буфера. Сохранение изменений также называется записью буфера или чаще всего записью файла.
vim — это команда Unix, которая вызывает редактор Vim для обработки имеющегося или совершенно нового файла. Синтаксис команды vim выглядит так:
$ vim [имя_файла]
или
$ vi [имя_файла]
Чаще всего в современных системах команда vi — это просто ссылка на Vim. Квадратные скобки в приведенных выше командах указывают, что имя файла является необязательным. Скобки вводить не нужно. Знак $ — это приглашение командной строки.
Если имя файла опущено, редактор открывает безымянный буфер. Вы можете назначить имя при записи содержимого буфера в файл. На данный момент давайте придерживаться именования файла в командной строке.
Имя файла внутри каталога должно быть уникальным (в некоторых операционных системах каталоги называют папками; по сути, это одно и то же).
В системах Unix имя файла может состоять из любых восьмибитных символов, за исключением слеша (/), который считается разделителем между файлами и каталогами в пути, и ASCII NUL — символа со всеми нулевыми битами. Чтобы использовать пробелы в имени файла, потребуется ввести обратный слеш (\) перед самим пробелом (в системах Windows запрещено использовать в именах файлов обратный слеш (\) и двоеточие (:)). Однако на практике имена файлов обычно состоят из любой комбинации прописных и строчных букв, цифр и символов точки (.) и подчеркивания (_). Помните, что Unix чувствителен к регистру: строчные буквы отличаются от прописных. Также имейте в виду, что вы должны нажать клавишу Enter, чтобы сообщить командной оболочке о завершении выполнения команды.
Если вы хотите создать и тут же открыть новый файл, придумайте ему имя и введите его с помощью команды vi. Например, если требуется создать и открыть новый файл с именем practice в текущем каталоге, наберите:
$ vi practice
Поскольку это новый файл, буфер пуст, и экран выглядит следующим образом:
~
~
~
"practice" [New file]
Тильды (~) в левом столбце экрана указывают, что в файле нет текста, даже пустых строк. Строка запроса (также называемая строкой состояния) в нижней части экрана отображает имя и статус файла.
Вы также можете отредактировать любой существующий текстовый файл в каталоге, указав его имя. Предположим, что существует Unix-файл по адресу /home/john/letter. Если вы уже находитесь в каталоге /home/john, используйте относительный путь. Например, команда ниже выводит на экран копию файла letter:
$ vi letter
Если вы находитесь в другом каталоге, укажите полный путь, чтобы начать редактировать файл:
$ vi /home/john/letter
Хотя мы (настоятельно) рекомендуем научиться работать в командной строке, вы можете запустить Vim и открыть файл непосредственно из графического интерфейса. Как правило, необходимо щелкнуть правой кнопкой мыши на файле, а затем выбрать команду типа Открыть с помощью в контекстном меню. Если редактор Vim установлен правильно, это будет одним из доступных вариантов открытия файла.
Чтобы запустить Vim непосредственно из меню, необходимо с помощьюex-команды :eимя_файлауказать редактору, какой файл редактировать.
Конкретную команду сложно привести, так как в настоящее время существует и используется множество различных графических сред.
• Появляется одно из следующих сообщений:
Visual needs addressable cursor or upline capability
терминал: Unknown terminal type
Block device required
Not a typewriter
Это значит, что ваш тип терминала не определен или что-то не так с записями terminfo. Введите :q для выхода. Чтобы исправить проблему и начать работу в упрощенном режиме, чаще всего достаточно присвоить параметру $TERM значение vt100. Дополнительная информация есть в Интернете или на популярном форуме по техническим вопросам, таком как StackOverflow (https://stackoverflow.com).
• Вы предполагаете, что файл существует, но появляется сообщение[newfile].
Убедитесь, что вы использовали правильный регистр букв в имени файла (системы Unix чувствительны к регистру в именах файлов). Если да, то вы, вероятно, находитесь не в том каталоге. Введите команду :q для выхода. Затем убедитесь, что вы открыли корректный каталог для этого файла (введите pwd в командной строке). Если путь верен, проверьте список файлов в каталоге (с помощью команды ls). Вероятно, файл записан под немного другим именем.
• Вы запускаете vi, но получаете приглашение с двоеточием (указывающее, что вы находитесь в режиме строкового редактирования ex).
Вероятно, вы ввели команду прерывания (обычно это сочетание клавиш Ctrl+C), прежде чем программа vi отрисовала экран. Запустите vi, введя в приглашении ex (:) команду vi.
• Появляется одно из следующих сообщений:
[Read only]
File is read only
Permission denied
Read only (только для чтения) означает, что вы не можете сохранять внесенные изменения, только просматривать файл. Возможно, вы запустили vi в режиме просмотра (с помощью команды view или vi-R) или у вас нет разрешения на перезапись файла (см. подраздел «Открытие файла из командной строки» ранее в этой главе).
• Появляется одно из следующих сообщений:
Bad file number
Block special file
Character special file
Directory
Executable
Non-ascii file
имя_файла non-ASCII
Файл, который вы хотите отредактировать, не является допустимым текстовым файлом. Введите :q!, чтобы завершить работу, а затем проверьте этот файл с помощью команды file.
• При попытке ввести команду :q из-за одной из ранее упомянутых проблем появляется сообщение:
E37: No write since last change (add ! to override)
Вы случайно изменили файл. Введите команду :q!, чтобы закрыть редактор. Ваши изменения, внесенные в ходе этого сеанса, не будут сохранены.
Как упоминалось ранее, концепция текущего режима имеет основополагающее значение для способа работы vi. Существует два режима: командный режим и режим ввода текста (режим команды ex можно считать третьим по счету, но пока мы не будем его рассматривать). При запуске активизируется командный режим, где каждое нажатие клавиши представляет собой команду12. В режиме ввода все, что вы набираете, преобразовывается в текст.
Иногда можно случайно перейти в режим ввода или, наоборот, выйти из него. Так или иначе любые нажатия на клавиши, скорее всего, повлияют на содержимое ваших файлов непредвиденным образом.
Нажмите клавишу Esc, чтобы перевести редактор в командный режим. Если вы уже в нем, программа подаст звуковой сигнал (поэтому командный режим иногда называют сигнальным режимом).
Перейдя в командный режим, вы сможете приступить к исправлению любых случайных изменений, а затем продолжить редактирование текста (см. подразделы «Проблемы при удалении» и «Откат изменений» в главе 2).
Чтобы в любой момент прекратить работу с файлом, сохранить внесенные изменения и вернуться в командную строку (если вы работаете в окне терминала), используйте команду ZZ. Обратите внимание, что ZZ пишется прописными буквами.
Предположим, что вы создали файл с именем practice, чтобы попрактиковаться с командами vi, и ввели шесть строк текста. Чтобы сохранить файл, сначала убедитесь, что вы находитесь в командном режиме, нажав клавишу Esc, а затем наберите ZZ.
Команда
Результат
ZZ
"practice" [New] 6L, 104C written
При вводе команды записи ZZ ваш файл сохранится на диске как обычный файл
$ls
ch01.asciidoc ch02.asciidoc ch03.asciidoc
В списке файлов в каталоге будет файл с именем practice, который вы только что создали
Внесенные изменения можно сохранить и с помощью команд ex. Введите :w, чтобы сохранить (записать) ваш файл, не закрывая его. Если вы не вносили никаких изменений, просто введите :q, чтобы выйти. А чтобы сохранить ваши изменения и закрыть текущий файл, введите :wq (команда :wq эквивалентна ZZ). Мы подробно объясним, как использовать команды ex, в главе 5. Сейчас просто запомните эти несколько команд для записи и сохранения файлов.
Если вы только начали изучать Vim, особенно будучи бесстрашным экспериментатором, вам пригодятся две другие команды ex, которые позволят избавиться от созданной вами путаницы.
Если вы хотите стереть все изменения, внесенные вами во время сеанса работы, а затем снова открыть исходный файл, то команда:
:e! Enter
откроет последнюю сохраненную версию файла, тем самым позволив вам начать заново.
Если вы не хотите сохранять свои изменения, а затем планируете выйти из редактора, то используйте следующую команду, которая немедленно завершит работу с редактируемым файлом и вернет вас в командную строку:
:q! Enter
Данные команды откатывают назад все изменения, внесенные в буфер с момента последнего сохранения файла. Редактор обычно не позволяет удалять изменения. Восклицательный знак, добавленный к команде :e или :q, снимает этот запрет, и программа выполняет операцию, даже если содержимое буфера было изменено.
Далее мы не будем напоминать о необходимости нажимать клавишу Enter для команд в режиме ex, однако это требуется, чтобы редактор их выполнял.
• Вы пытаетесь записать файл, но получаете одно из следующих сообщений:
File exists
File имя_файла exists - use w!
[Existing file]
File is read only
Введите :w!имя_файла, чтобы перезаписать существующий файл, или :wимя_нового_файла, чтобы сохранить отредактированную версию в новом файле.
• Вы хотите записать файл, но у вас нет для этого разрешения. Выводится сообщение Permission denied (Отказано в доступе).
Используйте команду :wимя_нового_файла для записи содержимого буфера в новый файл. Если у вас есть разрешение на запись в каталог, вы можете использовать команду mv, чтобы заменить исходную версию своей копией. Если у вас нет разрешения на запись в каталог, введите команду :wпуть/имя_файла, чтобы записать содержимое буфера в файл в каталоге, для которого у вас есть разрешение (например, ваш домашний каталог или /tmp). Будьте осторожны, чтобы не перезаписать какие-либо существующие файлы в данной директории.
• Вы пытаетесь записать свой файл, но получаете сообщение, что хранилище заполнено.
Сегодня, когда 500-гигабайтный накопитель считается небольшим по емкости, подобные ошибки, как правило, встречаются редко. Тем не менее, если что-то подобное произойдет, у вас есть несколько вариантов решения такой проблемы. Во-первых, попробуйте записать свой файл на другой диск или в другой каталог (например, в /tmp), чтобы ваши данные были сохранены. Затем попробуйте сохранить содержимое буфера с помощью команды ex:pre (сокращенно от :preserve). Если и это не сработает, освободите пространство одним из следующих способов.
• Откройте файловый менеджер с графическим интерфейсом (например, Nautilus в GNU/Linux) и поищите старые ненужные файлы, которые можно удалить.
• Нажмите Ctrl+Z, чтобы приостановить работу vi и вернуться к командной строке. Затем стоит использовать команды Unix, чтобы найти большие файлы, которые являются кандидатами на удаление:
— команда df показывает, сколько свободного места доступно на диске в данной файловой системе или в системе в целом;
— команда du указывает, какой объем диска используется для данных файлов и каталогов. Команда du-s*|sort-nr выводит список файлов и каталогов, отсортированных по занимаемому ими пространству в порядке убывания.
Когда закончите удалять файлы, используйте команду fg, чтобы вернуться к программе vi; затем вы можете сохранить свою работу в обычном режиме.
Помимо нажатия Ctrl+Z и управления задачами, допускается ввести :sh, чтобы запустить новую оболочку. Нажмите Ctrl+D или введите команду exit, чтобы завершить работу в оболочке и вернуться к программе vi (это работает и с gvim!).
Вы также можете ввести что-то вроде :!du-s*, чтобы запустить консольную команду из vi, а затем вернуться к редактированию, когда команда будет выполнена.
Единственный способ изучить программы vi и Vim — практиковаться. Теперь вы знаете достаточно, чтобы создать новый файл и вернуться в командную строку. Создайте файл с именем practice, введите текст, а затем сохраните и закройте файл.
1. Откройте файл с именем practice в текущем каталоге:
$vipractice
2. Перейдите в режим ввода:
i
3. Введите текст:
любойтекст
4. Вернитесь в командный режим:
Esc
5. Выйдите из vi, сохранив изменения:
ZZ
5Сегодня термин Unix включает в себя как коммерческие системы, производные от оригинальной кодовой базы Unix (например, Solaris, AIX и HP-UX), так и системы Unix с открытым исходным кодом (например, GNU/Linux и производные от BSD системы). Под это понятие подпадает терминальная среда macOS, подсистема Windows для Linux (WSL) в MS-Windows, а также Cygwin и другие аналогичные среды для Windows. Если не указано иное, то описанное в книге применимо ко всем этим системам.
6Если у вас не установлен ни vi, ни Vim, см. приложение Г.
7GNU Emacs стала универсальной версией Emacs. Единственная проблема заключается в том, что она не входит в стандартную комплектацию большинства систем, ее нужно установить самостоятельно, в том числе в некоторых системах GNU/Linux.
8От выделений красным маркером до «пометки» изменений в наборных гранках или пробах.
9Дополнительную информацию об этих языках можно найти на сайтах https://en.wikipedia.org/wiki/Markdown и https://asciidoc.org соответственно. Эта книга написана с помощью языка AsciiDoc.
10troff используется в ПО для лазерных принтеров и наборных устройств. Его брат-близнец nroff предназначен для линейных принтеров и терминалов. Оба понимают один и тот же язык ввода. Следуя общепринятому соглашению Unix, под названием troff мы ссылаемся на оба пакета. В настоящее время все, кто использует troff, работают в GNU-версии под названием groff (https://www.gnu.org/software/groff).
11К счастью, сейчас такого рода проблемы встречаются гораздо реже, хотя системы все еще могут выходить из строя из-за внешних обстоятельств, таких как отключение электроэнергии. Чтобы решить и эту проблему, обзаведитесь источником бесперебойного питания для настольной системы или емким аккумулятором на ноутбуке.
12Обратите внимание, что программы vi и Vim имеют команды не для всех возможных клавиш. В командном режиме редактор ожидает нажатий кнопок, представляющих команды, а не текст в качестве содержимого файла. Мы воспользуемся преимуществами неиспользуемых клавиш позже, в разделе «Команда map» главы 7.
Прочитав эту главу, вы научитесь редактировать текст с помощью vi и Vim. Вы узнаете, как перемещать курсор и вносить простые правки. Если вы никогда не работали с редакторами vi и Vim, прочтите главу целиком.
Последующие главы помогут вам работать быстрее и эффективнее. Одно из самых главных преимуществ для опытного пользователя — огромный выбор инструментов, а явный недостаток для новичка в vi и Vim — множество различных команд редактора.
Поначалу нет необходимости запоминать каждую описанную команду vi. Начните с изучения основных команд, представленных в текущей главе, и обратите внимание на их общий синтаксис (не переживайте, мы укажем на эти места).
По мере обучения следите за дополнительными задачами, которые может выполнить редактор, а затем найдите команду, которая их выполняет. В последующих главах вы узнаете о более продвинутых функциях vi и Vim, но прежде, чем двигаться дальше, важно освоить основные.
В этой главе мы рассмотрим:
• перемещение курсора;
• базовые операции: добавление, изменение, удаление, перемещение и копирование текста;
• несколько вариантов перехода в режим ввода;
• объединение строк;
• индикаторы режимов.
Как упоминалось ранее, редакторы vi и Vim имеют два основных режима: командный и режим ввода. Командную строку (приглашение с двоеточием), в которой вы вводите команды ex, можно считать третьим режимом. Это более продвинутый режим, и его мы рассмотрим позже.
Впервые открывая файл, вы попадаете в командный режим, где редактор ожидает вашей команды. Команды позволяют перемещаться по содержимому файла, вносить правки или переключаться в режим ввода для добавления нового текста. Команды также позволяют закрыть файл (с сохранением изменений или без), чтобы вернуться к командной строке.
Эти режимы можно воспринимать как две разные клавиатуры: в режиме ввода клавиатура работает как обычно, в командном — каждая клавиша имеет новое значение или инициирует какую-либо инструкцию.
Существует несколько способов сообщить Vim, что вы хотите перейти в режим ввода. Самый простой — нажать клавишу i. При этом буква i не отобразится на экране, однако все, что вы напечатаете после, возникнет на дисплее и будет передаваться в буфер. Курсор отмечает текущую точку ввода13. Чтобы программа Vim вышла из режима ввода, нажмите клавишу Esc. Это действие переместит курсор назад на один пробел (он встанет на последний введенный вами символ) и вернет вас в командный режим.
Предположим, что вы открыли новый файл и хотите вставить слово introduction. Если вы введете iintroduction, на экране появится:
introduction
Когда вы открываете новый файл, Vim запускается в командном режиме и интерпретирует первое нажатие клавиши I как команду ввода. С этого момента вы можете печатать текст, а чтобы вернуться в командный режим, необходимо нажать клавишу Esc. Если вам нужно исправить ошибку в режиме ввода, расположите курсор на месте ошибки и введите текст. В зависимости от вашего терминала и его настроек в процессе исправления программа может стереть ранее введенное или создать резервную копию поверх текста. В любом случае все резервные копии удалятся. Обратите внимание, что вы не можете вернуться назад ранее позиции, в которой вы вошли в режим ввода. Если вы отключили совместимость с vi, Vim позволяет вам обойти данное ограничение. В большинстве дистрибутивов GNU/Linux Vim настроен с отключенной совместимостью с vi, так что прием может сработать.
В Vim есть параметр, позволяющий определять правое поле и автоматически возвращать курсор в начало. Попробуйте во время вставки текста нажать клавишу Enter, чтобы прервать строку.
Не всегда очевидно, какой режим активирован в текущий момент. Всякий раз, когда Vim действует не так, как ожидается, нажмите клавишу Esc один или два раза. Если воспроизводится звуковой сигнал, значит, вы находитесь в командном режиме14.
Обычно на добавление нового текста в режиме ввода тратится немного времени. Бо´льшую его часть вы будете вносить изменения в существующий текст, перемещаясь по файлу и выполняя различные операции.
В командном режиме вы можете поместить курсор в любое место файла. Поскольку все основные правки (изменение, удаление и копирование текста) начинаются с позиционирования курсора в тексте, важно научиться перемещать его по тексту как можно быстрее.
Существует несколько команд vi для перемещения курсора:
• вверх, вниз, влево или вправо — по одному символу за раз;
• вперед или назад по фрагментам текста, таким как слова, предложения или абзацы;
• вперед или назад по файлу на один экран.
На рис. 2.1 выделенная буква sв третьей строке обозначает текущее положение курсора. Круги показывают перемещение курсора из его текущего положения в положение после выполнения различных команд.
Рис. 2.1. Пример перемещения курсора из центрального s с помощью команд
Клавиши h, j, k и l, находящиеся прямо под рукой, позволяют перемещать курсор следующим образом:
• h — влево на один символ;
• j — вниз на одну строку;
• k — вверх на одну строку;
• l — вправо на один символ.
Вы также можете использовать клавиши со стрелками (←, ↓, ↑, →), + и – или сочетания клавиш Ctrl+P и Ctrl+N для перемещения вверх и вниз, а также клавиши Enter и Backspace, но они находятся далеко от центра клавиатуры.
Поначалу может показаться неудобным использовать буквенные клавиши вместо стрелок для перемещения курсора. Однако через некоторое время вы обнаружите, что возможность перемещаться по тексту, не отрывая пальцев от центра клавиатуры, — это невероятно удобно.
Перед тем как изменить положение курсора, нажмите клавишу Esc, чтобы активировать командный режим. Используйте клавиши h, j, k и l для перемещения вперед или назад по файлу от текущей позиции курсора. Передвинувшись до конца в одном направлении, вы услышите звуковой сигнал, а курсор остановится. Например, когда вы находитесь в начале или в конце строки, то для перехода к предыдущей или следующей строке вы не можете использовать клавиши h или l соответственно — для этого необходимы клавиши j или k15. Аналогично у вас не получится переместить курсор мимо тильды (~), представляющей строку без текста, а также не выйдет расположить курсор в позиции над первой строкой текста.
Почему именно клавиши h, j, k и l
Мэри Энн Хортон, работавшая в компании Berkeley Unix почти с самого ее основания, рассказывает такую историю.
Программа vi обладала очень мощными возможностями, хотя ее интерфейс во многом был схож с интерфейсом приложения Блокнот (Notepad). Студенты и преподаватели активно использовали все доступные инструменты, в том числе и «глобальную» команду, которая вносила одинаковые изменения во все строки, соответствующие определенному шаблону, или команды типа «удалить 13 абзацев» или «скопировать текст в соответствующих круглых скобках». Но освоить программу vi было не так-то просто, и начинающие пользователи для перемещения по содержимому файлов по привычке использовали клавиши со стрелками, как делали это в Блокноте (Notepad).
Однако клавиши со стрелками в vi не всегда корректно срабатывали, на что была своя причина. У пользователей было множество терминалов различных производителей, которые обрабатывали разные коды при нажатии данных клавиш.
Биллу не нужны были такие клавиши. Он нашел способ работать из дома, установив в своей квартире терминал Lear-Siegler ADM-3A. ADM-3A преподносился как «неинтеллектуальный терминал», потому что у него не было некоторых особенностей, например отдельных клавиш со стрелками, что позволяло продавать его по низкой на тот момент цене 995 долларов. Стрелки были нарисованы на клавишах h, j, k и l16. Билл настроил команды vi следующим образом: нажатие клавиши h перемещало курсор влево, j — вниз, k — вверх и l — вправо. Всем пользователям нужно было нажимать буквы h, j, k и l, чтобы перемещаться по файлу.
Но что делать, если вы хотите ввести слово с буквой h? Редактор vi, как и ed, — это «режимный» редактор. То есть вы находитесь либо в командном режиме, когда нажимаемые клавиши обрабатываются как команды, либо в режиме ввода, где нажатия клавиш становятся содержимым, добавляемым в файл. Команда, подобная i (insert), переводит приложение в режим ввода, а клавиша Escape (Esc) возвращает в командный режим.
Как сделать так, чтобы клавиши со стрелками в vi работали? Эти специальные клавиши посылают две или три последовательности символов, обычно начинающиеся с Escape. Мы назвали их escape-последовательностями. Однако команда Escape уже имела свое назначение в vi. Она выводила редактор из режима ввода и, если вы уже были вне его, воспроизводила звуковой сигнал. Одна из первых важных функций, с которой пользователь сталкивается в vi, заключалась в том, что, если вы забыли, в каком режиме находитесь, вы нажимали клавишу Esc до тех пор, пока она не подаст звуковой сигнал, и тогда вы понимали, что находитесь в командном режиме.
Редактор vi использовал файл базы данных функций терминала под названием termcap, в котором указывалось, какие коды для конкретной модели терминала отправляются для перемещения курсора, очистки экрана и т.п. Осталось добавить последовательности клавиш ←, →, ↑, ↓ в termcap.
Компьютер получил команду Escape — значит ли это, что пользователь нажал клавишу Esc или клавишу со стрелкой? Должен ли редактор выйти из режима ввода или ему следует подождать, пока добавится текст, чтобы интерпретировать клавишу со стрелкой? Как только редактор пытался считать больше данных, программа зависала до тех пор, пока не поступала новая информация.
К счастью, новая возможность Unix позволила редактору ожидать введения еще одного символа. Если этот символ является частью допустимой escape-последовательности, vi продолжает считывание, ожидая, какую следующую клавишу нажмет пользователь. Если за этот короткий промежуток времени больше не было введено никаких символов, программа считала, что пользователь, должно быть, нажал клавишу Esc. Проблема решена!
Весной 1979 года я добавила команды code и termcap для клавиш ←, →, ↑, ↓, Home, Page Up и других, которыми были оборудованы некоторые терминалы. Я настроила termcap так, как если бы у ADM-3a были клавиши со стрелками, которые посылали команды h, j, k и l; а затем я удалила привязанные команды для h, j,k и l. Мне казалось, все работало прекрасно.
Через день перед дверью моего кабинета собралась толпа разгневанных аспирантов с Питером во главе. Он хотел знать, зачем я изменила настройки его терминала. Я объяснила ему, что теперь клавиши со стрелками работают нормально и больше нет необходимости использовать буквенные символы.
Питер закатил глаза: «Ты не понимаешь, — сказал он, — нам нравится использовать клавиши h, j, k и l! Мы набираем команды вслепую, и наши пальцы находятся прямо над этими клавишами. Мы не хотим тянуться к краю клавиатуры и нажимать клавиши со стрелками. Верни все как было!» Все студенты поддержали Питера.
Они были правы. Я вернула настройки по умолчанию и оставила функционал клавиш со стрелками. И поняла, насколько важны позиции клавиш для ключевых команд vi. Почти любая часто применяемая команда — это строчная буква. Я очень быстро освоила vi и по сей день предпочитаю vi для редактирования текстовых файлов. Я обучила несколько групп ИТ-специалистов максимально эффективному использованию мощных инструментов vi и Unix.
Вам может потребоваться повторить команду несколько раз. Вместо того чтобы вводить ее снова и снова, допускается добавить к ней число — количество повторений, или коэффициент повторения.
На рис. 2.2 показано, как команда 4l перемещает курсор на четыре позиции вправо, как если бы вы нажали l четыре раза подряд (llll).
Рис. 2.2. Повторение команды с помощью чисел
Счетчик повторений указывается перед командой, потому что, если указать его после, программа vi не поймет, когда необходимо остановиться.
Способность редактора повторять операции открывает больше возможностей для каждой изучаемой вами команды. Имейте это в виду, когда мы будем изучать дополнительные команды.
После сохранения файла practice программа Vim отобразит сообщение о том, сколько строк в этом файле. Текстовые строки не обязательно имеют ту же длину, что и строка, видимая на экране. Строка — это текст, введенный между новыми строками (чтобы добавить в файл символ новой строки, необходимо нажать клавишу Enter в режиме ввода). Программа Vim интерпретирует все введенные символы как одну строку до тех пор, пока вы не нажмете Enter (даже если они явно занимают несколько строк на экране).
В главе 1 мы упоминали, что в vi и Vim есть параметр, который позволяет устанавливать расстояние от правого края (конца строки), на котором автоматически вставляется символ новой строки. Этот параметр называется wrapmargin (коротко — wm). Вы можете установить wrapmargin в размере десяти символов:
:set wm=10
Данная команда не влияет на уже добавленные строки. Как только вы зададите параметр, попробуйте ввести несколько новых строк и увидите, что программа Vim автоматически переносит их. Подробнее о настройках мы поговорим в главе 7, потерпите немного!
Если поместить эту команду в файл с именем .exrc в домашнем каталоге, редактор будет автоматически выполнять ее при каждом запуске. Далее в книге мы рассмотрим загрузочные файлы vi и Vim.
Если вы не используете автоматический параметр wrapmargin, следует прерывать строки с помощью клавиши Enter, чтобы они были приемлемой длины.
Две полезные команды, которые связаны с перемещениями внутри строки, — это:
• 0 (цифра ноль) — переход в начало строки;
• $ — переход в конец строки.
Нумерация строк продемонстрирована в следующем примере (номера строк можно отобразить с помощью параметра number, который включается вводом команды :setnu в командном режиме. См. главу 5). Обратите внимание, что номера строк не относятся к содержимому файла, программа отображает их для вашего удобства:
1 With a screen editor you can scroll the page,
2 move the cursor, delete lines, insert characters,
and more, while seeing the results of your edits
as you make them.
3 Screen editors are very popular.
Количество логических строк (три) не соответствует количеству видимых (пять) на экране. Если бы курсор был установлен на букву d в слове delete и вы ввели символ $, курсор переместился бы в позицию, следующую за словом them. Если вы введете 0, курсор переместится в обратном направлении, на букву m в слове move — в начало второй строки.
Вы можете перемещать курсор по фрагментам текста, таким как слова, предложения, абзацы и т.д.:
• w — переход вперед на одно слово (слова — это буквенно-цифровые символы);
• W — переход вперед на одно слово (слова разделяются пробелом);
• b — переход назад на одно слово (слова — это буквенно-цифровые символы);
• B — переход назад на одно слово (слова разделяются пробелом);
• G — переход к определенной строке.
Команда w перемещает курсор вперед на одно слово, считая символы и знаки препинания за слова. В примере ниже показано перемещение курсора с помощью w:
cursor,delete lines,insert characters,
Двигаться вперед по слову без учета символов и знаков препинания можно, используя команду W. Перемещение курсора с помощью прописной W выглядит следующим образом:
cursor, delete lines, insert characters,
Чтобы перейти назад на слово, используйте команду b. Заглавная буква B позволяет перемещаться назад по слову, не считая знаков препинания (на одно слово). Как упоминалось ранее, команды перемещения принимают числовые аргументы. Таким образом, вы можете повторять команды w или b с помощью чисел. Команда 2w перемещает курсор вперед на два слова, 5B перемещает курсор назад на пять слов, не считая знаков препинания.
Чтобы перейти к определенной строке, вы можете использовать команду G.
Команда G позволяет перейти в конец файла, 1G — в его начало, а 42G — на строку 42. Подробнее об этом читайте в подразделе «Команда G (перейти к)» следующей главы. Мы обсудим перемещение по предложениям и абзацам в главе 3. А пока попрактикуйтесь с уже известными вам командами с курсором, комбинируя их с числовыми множителями.
Ввести текст в файл идеально с первого раза получается не всегда. Возникают опечатки, бывает, что хочется перефразировать предложение, или же программа аварийно завершает работу. При вводе текста важно уметь производить над ним базовые операции: изменение, удаление, перемещение и копирование. На рис. 2.3 показаны виды изменений, которые можно вносить в файл. Правки обозначены корректорскими знаками.
Рис. 2.3. Исправление текста
В программе vi вы можете выполнить любое из показанных изменений с помощью следующих клавиш: i для ввода текста (упоминалась ранее), a для добавления (присоединения), c для изменения и d для удаления. Чтобы переместить или скопировать текст, используется пара команд. Переместить текст можно с помощью клавиш d (удалить) и p (вставить), скопировать — y (поместить в буфер) и p (вставить). Вы также можете использовать клавиши x и r для удаления и замены одного символа соответственно. Некоторые команды при двойном вводе, такие как dd, означают «применить команду ко всей строке». Другие, написанные с заглавной буквы, например P, означают «применить операцию к тексту перед текущей строкой, а не после». Каждый тип редактирования описан в данном разделе. На рис. 2.4 показаны команды vi, которые используются для внесения изменений, отмеченных на рис. 2.3.
Текст этого файла можно использовать для практики; он находится в репозитории GitHub (https://www.github.com/learning-vi/vi-files). Дополнительные сведения см. в подразделе «Доступ к нескольким файлам» в приложении А.
Рис. 2.4. Редактирование с помощью команд
Мы уже сталкивались с командой i (insert), используемой для ввода текста в новый файл. Ее также можно применять при редактировании существующего текста, чтобы добавить недостающие символы, слова и предложения. Предположим, что в файле practice у вас есть такое предложение (обратите внимание на положение курсора):
you can scroll
the page, move the cursor, delete
lines, and insert characters.
Чтобы вставить фразу With a screen editor в начало предложения, введите следующее.
Команда
Результат
2k
you can scroll
the page, move the cursor, delete
lines, and insert characters.
Переместите курсор на две строки вверх, к строке, куда нужно вставить текст, с помощью команды k
iWith□a□
With a you can scroll
the page, move the cursor, delete
lines, and insert characters.
Нажмите i, чтобы перейти в режим ввода и вставить текст. Символ □ — это пробел
screen□editor□Esc
With a screen editoryou can scroll
the page, move the cursor, delete
lines, and insert characters.
Нажмите клавишу Esc, чтобы завершить добавление текста и вернуться в командный режим
Вы можете добавить текст в любую позицию файла с помощью команды добавления (присоединения) a (append). Она работает почти так же, как i, за исключением того, что текст вставляется после курсора, а не перед ним. Возможно, вы заметили, что для перехода в режим ввода при нажатии клавиши I курсор не перемещается до тех пор, пока вы не начнете печатать. Напротив, когда вы нажимаете клавишу a, чтобы перейти в режим ввода, курсор перемещается на одну позицию вправо, а текст появляется за исходным положением курсора.
Вы можете заменить любой текст в вашем файле с помощью команды c (change). Чтобы совершить данную операцию, объедините команду c с командой перемещения, которая при этом служит текстовым объектом для работы команды c. Например, команду c допускается использовать для замены текста от позиции курсора:
• cw — до конца слова;
• c2b — вернуться на два слова назад;
• c$ — в конец строки;
• c0 — в начало строки.
После выдачи команды c вы можете заменить выделенный текст новым текстом любого размера, пустой строкой, одним словом или сотнями строк. Команда c, как и i и a, не выводит программу из режима ввода, пока вы не нажмете клавишу Esc.
Когда изменение затрагивает только текущую строку, vi помечает конец текста, подлежащего преобразованию, символом $, чтобы вы могли видеть, какая часть строки была затронута. Если Vim не находится в режиме совместимости, он ведет себя по-другому: просто удаляет текст, который нужно изменить, и переводит вас в режим ввода.
Чтобы изменить слово, объедините команды c и w (word). С помощью команды cw можно заменить слово более длинным или коротким (или любым фрагментом текста). Команда cw рассматривается как «удаление отмеченного слова и вставка нового текста до тех пор, пока не будет нажата клавиша Esc».
Предположим, у вас есть следующая строка в вашем файле practice, где нужно изменить an на a screen:
With an editor you can scroll the page,
Вам нужно изменить только одно слово.
Команда
Результат
w
With an editor you can scroll the page,
Переместите курсор с помощью w в позицию, где вы хотите начать редактирование
cw
With editor you can scroll the page,
Дайте команду изменить слово. Vim удалит элемент an и перейдет в режим ввода
ascreenEsc
With a screen editor you can scroll the page,
Введите новый текст, а затем нажмите Esc, чтобы вернуться в командный режим
Команда cw также работает с частью слова. Например, чтобы изменить слово spelling на spelled, необходимо поместить курсор на i, ввести cw, затем напечатать ed и завершить действие с помощью клавиши Esc.
Синтаксис команд vi
В командах изменения, которые мы упоминали ранее, вы, возможно, заметили следующую закономерность синтаксиса:
(команда)(текстовый объект)
Команда — это команда изменения c, а текстовый объект — это команда перемещения (круглые скобки вводить не нужно). Однако c — не единственная команда, для которой требуется текстовый объект. Команды d (delete) и y (yank) действуют по тому же принципу.
Помните, что команды перемещения принимают числовые аргументы, поэтому к текстовым объектам команд c, d и y можно добавлять числа. Например, команды d2w и 2dw используются для удаления двух слов. Из этого следует, что большинство команд vi строятся согласно одному общему синтаксису:
(команда)(число)(текстовый объект)
или
(число)(команда)(текстовый объект)
Вот как это работает: число и команда не обязательны. Вы можете использовать лишь одну команду перемещения. Если вы добавляете число, действие команды повторяется.
С другой стороны, можно объединить команду (c, d или y) с текстовым объектом, чтобы получить команду редактирования. Поняв, какое множество комбинаций возможно, вы осознаете, насколько мощный редактор Vim!
Чтобы заменить текущую строку, используйте специальную команду cc. Не имеет значения, где находится курсор в строке — cc заменяет ее всю любым количеством текста, введенного до нажатия клавиши Esc.
В vi команда, подобная cw, работает иначе, чем cc. При использовании cw старый текст остается до тех пор, пока вы не введете поверх него другой, а любой оставшийся старый текст (вплоть до символа $) исчезнет, когда вы нажмете клавишу Esc. Однако при использовании команды cc сначала стирается старый текст, оставляя пустую строку для ввода нового.
Подход «ввода текста поверх» применяется к любой команде изменения, которая затрагивает менее целой строки, в то время как подход «пустая строка» применяется к любой команде изменения, которая затрагивает одну или несколько строк.
В редакторе Vim (если он не находится в режиме совместимости) обе команды просто удаляют указанный текст, а затем переходят в режим ввода.
Команда C заменяет символы от текущего положения курсора до конца строки. Эта операция похожа на действие объединения со специальным индикатором конца строки $ (c$).
На самом деле команды cc и C являются сочетаниями для других команд, поэтому они не соответствуют общей форме команд vi, поскольку не позволяют указать текстовый объект в качестве конечной точки команды. Мы обсудим и другие сочетания, когда будем изучать команды delete и yank.
Еще один вариант замены задается командой r (replace). Она заменяет один символ другим. При этом не нужно нажимать клавишу Esc, чтобы вернуться в командный режим после внесения изменений. В следующем примере в строке допущена орфографическая ошибка:
Pith a screen editor you can scroll the page,
Необходимо исправить только одну букву. Здесь нет нужды использовать команду cw, иначе придется перепечатывать все слово. Вместо этого используйте r для замены символа, на котором расположен курсор:
Команда
Результат
rW
With a screen editor you can scroll the page,
Команда rW выдает команду r и заменяет символ P на W
Предположим, вы хотите изменить слово не целиком, а только несколько символов в нем. Команда (s