Новости

19.09.2023

Книга «Изучаем vi и Vim. Не просто редакторы. 8-е изд.»

Эффективная навигация


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

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

Здесь мы изучим:

  • перемещение по экранам;
  • перемещение по текстовым фрагментам;
  • перемещение путем поиска;
  • перемещение по номерам строк.

 

Перемещение по экранам


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

Представьте, что файл — это текст на длинном рулоне бумаги. Экран представляет собой окно из 24 (чаще всего) строк текста на этом рулоне.

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

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

Прокрутка экрана


В vi доступно несколько команд для прокрутки вперед и назад по файлу на полном и половинном экранах:

  • ^F — прокрутка вперед на один экран;
  • ^B — прокрутка назад на один экран;
  • ^D — прокрутка вперед на половину экрана (вниз);
  • ^U — прокрутка назад на половину экрана (вверх).

 

В этом списке команд символ ^ представляет клавишу Ctrl. То есть команда ^F подразумевает, что нужно удерживать нажатой клавишу Ctrl и одновременно нажимать сочетание клавиш Shift+F.


Существуют также команды для прокрутки экрана вверх на одну строку (^E) и вниз на одну строку (^Y). Однако эти две команды не затрагивают курсор. Он остается в той же точке строки, в которой он находился в момент выполнения команды.

Изменение положения экрана с помощью команды z


Если вы хотите прокрутить экран вверх или вниз, но чтобы курсор оставался в той строке, на которой вы его оставили, используйте команду z:

  • z Enter и z+ Enter — переместить текущую строку в верхнюю часть экрана и прокрутить;
  • z. — переместить текущую строку в центр экрана и прокрутить;
  • z- — переместить текущую строку в нижнюю часть экрана и прокрутить.


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

Некоторые дистрибутивы GNU/Linux поставляются с файлом /etc/vimrc, который устанавливает для Vim параметр scrolloff (смещение прокрутки) с ненулевым значением (обычно пять). Другие используют файл /usr/share/vim/vimXX/defaults.vim, где XX — версия Vim. Параметр scrolloff в ненулевом значении приводит к тому, что Vim всегда предоставляет соответствующее количество строк контекста выше и ниже курсора. Таким образом, вы поймете, почему при вводе команды z Enter, чтобы поместить текущую строку в верхнюю часть экрана, она помещается всего на несколько строк ниже верха экрана.

Этот параметр также влияет на команды H и L (см. подраздел «Перемещение по видимой части экрана» далее в данной главе) и, возможно, на другие.

Вы можете отменить действие такого параметра по умолчанию, присвоив параметру scrolloff значение ноль в файле .vimrc на вашем компьютере (для получения дополнительной информации об этом файле см. разделы «Настройка vi и Vim» в главе 7 и «Системные и пользовательские конфигурационные файлы» в главе 8).

 

Перерисовка экрана


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

Всякий раз при прокрутке вы обновляете часть (или весь) экрана, поэтому от нежелательных сообщений можно избавиться, прокрутив экран, а затем вернувшись в предыдущее положение. Вы также можете перерисовать экран без прокрутки, нажав Ctrl+L.

Перемещение по видимой части экрана


Перемещаться по экрану можно, используя следующие команды:

  • H — команда «домой» — перейти к первому символу в начале верхней строки экрана;
  • M — перейти к первому символу в начале средней строки экрана;
  • L — перейти к первому символу в начале последней строки экрана;
  • nH — перейти к первому символу в начале n-й строки, считая от верхней;
  • nL — перейти к первому символу в начале n-й строки, считая от нижней.


Команда H перемещает курсор из любого места на экране на первую или «начальную» строку. Команда M перемещает курсор к средней строке, а L — к последней. Чтобы перейти к строке под первой, используйте команду 2H.

image

 

Перемещение по строкам


На текущем экране также есть команды для перемещения по строкам.

Вы уже знакомы с командами j и k. Кроме того, вы можете использовать:

  • Enter — переход к первому непустому символу следующей строки;
  • + — переход к первому непустому символу следующей строки (то же, что и Enter);
  • – — переход к первому непустому символу предыдущей строки.


Эти три команды перемещают курсор вниз или вверх до первого символа строки, игнорируя любые пробелы или табуляции. Команды j и k, напротив, перемещают курсор вниз или вверх до первой позиции строки, даже если эта позиция пуста (и предполагается, что курсор начался с первой позиции).

Перемещение по строке


Не забывайте, что команды h и l перемещают курсор влево и вправо, а команды 0 (ноль) и $ — в начало и конец строки соответственно. Также можно использовать следующие команды:

  • ^ — переход к первому непустому символу текущей строки;
  • n| — переход к символу в столбце n текущей строки или в конец строки, если значение n больше количества символов в строке.


Как и в случае с командами перемещения строки, показанными ранее, ^ перемещает к первому символу строки, игнорируя любые пробелы и отступы; 0, напротив, перемещает в первую позицию строки, даже если эта позиция пуста.

Перемещение по текстовым фрагментам


Перемещаться в файле vi также можно по текстовым фрагментам — словам, предложениям, абзацам или разделам. Вы уже научились перемещаться вперед и назад по слову (w, W, b или B). Кроме того, вы можете использовать следующие команды:

  • e — перейти в конец текущего слова (слова, разделяемые знаками препинания и пробелами);
  • E — перейти в конец текущего слова (слова, разделяемые пробелом);
  • ( — перейти к началу текущего предложения;
  • ) — перейти к началу следующего предложения;
  • { — перейти к началу текущего абзаца;
  • } — перейти к началу следующего абзаца;
  • [[ — перейти к началу текущего раздела;
  • ]] — перейти к началу следующего раздела.


Чтобы найти конец предложения, vi и Vim ищут один из этих знаков препинания: ?,. или!.. vi определяет конец предложения, когда за знаком препинания следует по крайней мере два пробела или когда он появляется как последний непустой символ в строке. Если вы оставили только один пробел после точки или если предложение заканчивается кавычками, то vi не распознает предложение. Программа Vim не настолько старомодна и требует только один пробел после завершающего знака препинания.

Абзац определяется как текст до следующей пустой строки или до одного из макросов абзаца по умолчанию (.IP, .PP, .LP или .QP) из пакета макросов troff. Аналогично раздел определяется как текст вплоть до следующего макроса раздела по умолчанию (.NH, .SH, .H1 или .HU). Макросы, которые распознаются как разделители абзацев или разделов, можно настроить с помощью команды :set, как описано в главе 7.

Напомним, что вы можете комбинировать числа с командами перемещения. Например, 3) перемещает вперед на три предложения. Также вы можете редактировать текст с помощью команд перемещения: d) удаляет текст до конца текущего предложения, 2y} копирует (помещает в буфер) два абзаца впереди.

Помните также, что вы можете использовать команды движения с командами редактирования, такими как cw и ce. Роберт П. Дж. Дэй с интересом отмечает, что «команды w и e — это немного разные команды перемещения, в то время как команды изменения cw и ce делают одно и то же».

Перемещение путем поиска


Одним из наиболее полезных способов быстрого перемещения по большому файлу является поиск фрагмента текста или, точнее, символов по шаблону (pattern). Иногда поиск используется, чтобы найти слово с ошибкой или переменную в программе.
Команда поиска — это специальный символ / (слеш). При вводе слеша он появляется в нижней строке экрана. Затем наберите текст, который хотите найти: /шаблон.

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

Программы vi и Vim, как и все другие редакторы Unix, имеют специальный язык сопоставления шаблонов, который позволяет выполнять сложные текстовые запросы: например, любое слово, начинающееся с заглавной буквы, или слово The в начале строки. Мы поговорим об этом мощном синтаксисе в главе 6. На данный момент считайте шаблон словом или фразой.
Редактор начинает поиск с позиции курсора и движется вперед, а по достижении конца документа переходит к его началу. Курсор при этом переместится к первому совпадению с шаблоном поиска. Если таковое отсутствует, в строке состояния отобразится сообщение Pattern not found.

На примере файла practice посмотрим, как перемещать курсор с помощью поиска.

image


Обратите внимание, что вы можете ввести любую комбинацию символов, а не только слово целиком.
Чтобы искать в обратном направлении, введите? вместо /:

?шаблон


В обоих случаях при необходимости поиск охватывает начало или конец файла.

Повторный поиск


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

  • n — повторить поиск в том же направлении;
  • N — повторить поиск в противоположном направлении;
  • /Enter — повторить поиск вперед;
  • ?Enter — повторить поиск назад.


Поскольку последний шаблон остается доступным, вы можете найти совпадения, поработать с ними, а затем снова осуществить поиск по тому же шаблону, используя команды n, N, / или?.. Направление поиска (/ — вперед,? — назад) отображается в левом нижнем углу экрана. Программа Vim предоставляет более широкие возможности, чем vi. Она помещает текст поиска в командную строку и позволяет прокручивать сохраненную историю команд поиска с помощью клавиш со стрелками ↑, ↓. В пункте «Знакомство с окнами истории» подраздела «Удвойте удовольствие» в главе 14 обсуждается, как в полной мере использовать сохраненную историю поисковых запросов.

Чтобы продолжить работу с предыдущим примером, когда шаблон scr еще доступен для поиска, вы можете проделать следующее.

image


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

:set nowrapscan


Когда задан параметр nowrapscan и прямой поиск завершается неудачей, в строке состояния vi отображается следующее сообщение:

Address search hit BOTTOM without matching pattern


В Vim оно выглядит так:

E385: search hit BOTTOM without match for: foo


Когда параметр nowrapscan установлен и обратный поиск завершается неудачей, в сообщениях отображается слово TOP вместо BOTTOM.

Редактирование с помощью функции поиска


Вы можете комбинировать символы / и? с командами, которые изменяют текст, такими как c и d. В продолжение к предыдущему примеру…

image


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

Поиск в текущей строке


Существуют также сокращенные версии команд поиска, выполняемых в пределах текущей строки. Команда fx перемещает курсор к следующему экземпляру символа x (где x — это любой символ). Команда tx перемещает курсор на символ перед следующим экземпляром x. (f — сокращенно от find; t — сокращенно от to, что означает в данном случае «до».) Затем можно повторить поиск, нажав клавишу; (точка с запятой).

Команды поиска внутри строки кратко описаны ниже. Ни одна из них не перемещает курсор на следующую строку:

  • fx — найти (переместить курсор к) следующее вхождение x в строке, где x — любой символ;
  • Fx — найти (переместить курсор к) предыдущее вхождение x в строке;
  • tx — найти (переместить курсор к) символ перед следующим вхождением x в строке;
  • Tx — найти (переместить курсор к) символ после предыдущего вхождения x в строке;
  • ; — повторить предыдущую команду поиска в том же направлении;
  • , (запятая) — повторить предыдущую команду поиска в противоположном направлении.


Добавив к любой из этих команд числовой параметр n, вы сможете определить местонахождение n-го символа. Предположим, вы редактируете файл practice в этой строке:

With a screen editor you can scroll the


Есть несколько вариантов найти вхождения буквы o.

image


Команда dfx удаляет все символы до именованного символа x включительно. Эта команда полезна при удалении или копировании фрагментов строк. Возможно, вам придется использовать команду dfx вместо dw, если в строке есть символы или знаки препинания, которые затрудняют подсчет слов. Команда t работает так же, как и f, за исключением того, что она помещает курсор перед искомым символом. Например, команда ct. может использоваться для изменения текста до конца предложения, оставляя точку.

Перемещение по номерам строк


Строки в файле нумеруются последовательно, и вы можете перемещаться по файлу, указывая их номера.

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

Если вы собираетесь перемещаться по номерам строк, у вас должен быть способ их идентификации. Они отображаются на экране с помощью параметра :set nu, описанного в главе 5. Вы также можете отобразить номер текущей строки внизу экрана.

Команда Ctrl+G в программе vi отображает в нижней части экрана текущий номер строки, общее количество строк в файле и какой процент от общего числа представляет текущий номер строки. Например, для файла practice команда Ctrl+G выдает следующее:

"practice" line 3 of 6 --50%--


Результат этой команды в Vim выглядит так:

"practice" 4 lines --75%-- 3,23 All


Предпоследнее поле — это позиция курсора (строка 3, символ 23). В больших файлах последнее поле указывает, насколько далеко вы продвинулись в файле в процентном соотношении.

Комбинация Ctrl+G поможет найти номер строки, необходимый для выполнения команды, а также сориентироваться в тексте, если вы отвлеклись от редактирования.

Если вы изменили файл, но еще не упели записать его, в строке состояния после имени файла можете увидеть надпись [Modified].

Команда G (перейти к)


Номера строк могут использоваться для перемещения курсора по файлу. Команда G (перейти к) принимает номер строки в качестве числового аргумента и переходит непосредственно к этой строке. Например, команда 44G перемещает курсор в начало строки 44. А G без номера строки переместит курсор на последнюю строку файла.

Две обратные кавычки (``) возвратят вас в исходное положение (в котором была выполнена последняя команда G), если вы не внесли каких-либо изменений за это время. Если же правки были осуществлены, а курсор перемещен с помощью какой-либо команды, отличной от G, то команда `` вернет курсор в позицию последнего редактирования. Если вы ввели команду поиска (/ или ?), то `` вернет курсор туда, откуда вы начали операцию поиска. Два апострофа ('') работают так же, как две обратные кавычки, за исключением того, что они возвращают курсор в начало строки, а не точно туда, где он находился.

Общее количество строк, отображаемых с помощью сочетания клавиш Ctrl+G, может дать вам приблизительное представление о том, сколько строк нужно переместить. Если вы находитесь на десятой строке 1000-строчного файла:

"practice" 1000 lines --1%-- 10,1 1%


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

Перемещение по номерам строк — это инструмент, который поможет быстро перемещаться по большому файлу.

Перечень команд перемещения в vi


В табл. 3.1 приведены все команды, описанные в этой главе.

image



Об авторах
Арнольд Роббинс — профессиональный программист и технический писатель родом из Атланты. Женат. Арнольд — счастливый отец четырех замечательных детей и любитель Талмуда (Вавилонского и Иерусалимского). С конца 1997 года он и его семья проживают в Израиле.
Арнольд работал с системами Unix с 1980 года, когда его познакомили с PDP-11 на шестой версии Unix. Он имеет опыт работы с различными коммерческими Unix-системами от Sun, IBM, HP и DEC. Он также использует GNU/Linux с 1996 года.

С 1987-го Арнольд активно использует awk и принимал участие в работе над gawk, версией awk проекта GNU. Будучи членом группы по голосованию POSIX 1003.2, он помог сформировать стандарт POSIX для awk. На протяжении долгого времени осуществляет поддержку gawk и его документации.

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

Некоторое время Арнольд работал в ведущей израильской компании, где занимался написанием высококлассного ПО для управления и контроля. Затем он устроился инженером-программистом в Intel, а позднее в McAfee. В настоящее время занят в менее крупной компании, которая занимается мониторингом сетевой безопасности для промышленности и в сфере управления зданиями. Его личный веб-сайт — www.skeeve.com.

Издательство O’Reilly не дает Арнольду отдохнуть: он является автором или соавтором бестселлеров «UNIX. Справочник», Effective awk Programming (четвертое издание), sed & awk (второе издание) с Дейлом Догерти, Classic Shell Scripting с Нельсоном Х. Ф. Бибом и некоторых карманных справочников.

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

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

Элберт познакомился с Unix во время работы в телекоммуникационной отрасли, где использовали дистанционный ввод заданий (RJE), связанный с мейнфреймом IBM. Он обнаружил, что многие процессы протекали проще, когда они перенаправлялись на компьютер компании AT&T, который работал на системе V Unix с использованием множества «специализированных» команд для преобразований и отчетов, а затем вновь возвращались обратно на мейнфрейм.

В работе с Unix Элберту требовалось глубокое понимание ed, что стало отправной точкой для его долгого пути изучения, обожания и евангелизации vi и в конечном итоге Vim. Седьмое и восьмое издания книги дают возможность Элберту выразить свою признательность и уважение к влиянию Vim на вселенную программирования.

Элберт специализировался на интеграции разрозненных систем. Многие пользователи используют его приложения, не осознавая, что внутри объединено несколько отдельных приложений. Если копнуть достаточно глубоко, можно найти его фотографию на обложке CEO Magazine (примерно в середине 90-х годов), где он был отмечен за свою работу по интеграции телекоммуникационных услуг и распределительных приложений.

Он разработал внешний веб-инструмент, предоставляющий быстрые, простые и эффективные способы поиска информации от стороннего продукта. Данный инструмент быстро зарекомендовал себя как популярный метод устранения неполадок для групп поддержки и сотрудников отдела разработки. Элберт также провел презентацию в Лас-Вегасе в 2018-м, продемонстрировав веб-инструмент.

Элберт внес свой вклад в написание более одной сотни технических публикаций (под псевдонимом) и был упомянут в двухчастной статье The Great FOSS Debates: Kernel Truths и FOSS Debates, Part 2: Standard Deviations вместе с Линусом Торвальдсом.


Более подробно с книгой можно ознакомиться на сайте издательства.


Комментарии: 0

Пока нет комментариев


Оставить комментарий






CAPTCHAОбновить изображение

Наберите текст, изображённый на картинке

Все поля обязательны к заполнению.

Перед публикацией комментарии проходят модерацию.