РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ VIM - Брам Мооленаар

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

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

07.1    Редактирование другого файла
07.2    Список файлов
07.3    Перемещение между файлами
07.4    Резервные копии файлов
07.5    Копирование текста между файлами
07.6    Просмотр файла
07.7    Изменение имени файла

Следующая глава: Разделение экрана
Предыдущая глава: Использование подсветки синтаксиса
Содержание: Руководство пользователя Vim


07.1 Редактирование другого файла

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

:edit foo.txt

Вместо "foo.txt" можно написать любое необходимое имя файла. Vim закроет текущий файл и откроет новый. Если в текущем файле есть несохранённые изменения, то Vim выдаст сообщение об ошибке и не будет открывать новый файл:

E37: Изменения не сохранены (добавьте !, чтобы обойти проверку) ~

Замечание:
В начале каждого сообщения об ошибке Vim помещает номер ошибки. Если вам не совсем понятен смысл сообщения, или причины, которые привели к выдаче сообщения, то ищите в справочной системе по этому номеру. Например, в данном случае: :help E37

В таком случае, у вас есть альтернативы.  Можно, например, сохранить файл при помощи команды

:write

Кроме того, можно также заставить Vim проигнорировать внесённые изменения, используя символ обхода проверок (!):

:edit! foo.txt

Если вы хотите редактировать другой файл, не хотите пока сохранять изменения в текущем файле, то можно "спрятать" текущий файл:

:hide edit foo.txt

Текст с изменениями будет по прежнему загружен в редактор, но вы не сможете его видеть. Подробнее читайте в разделе |22.4|: Список буферов.


07.2 Список файлов

Vim можно запустить с указанием списка файлов для редактирования. Например:

vim one.c two.c three.c

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

:next

Если в текущем файле есть несохранённые изменения, то Vim выдаст сообщение об ошибке и откажется выполнять команду ":next", как и в предыдущем случае с командой ":edit". Чтобы отменить внесённые изменения, в этом случае придётся использовать команду

:next!

Чаще всего вам всё-таки потребуется сохранить изменения и затем перейти к следующему файлу. Для этого существует специальная команда:

:wnext

Эта команда делает то же самое, что две последовательных команды

:write
:next
ГДЕ Я?

Чтобы посмотреть какой файл в списке аргументов вы редактируете, взгляните на заголовок окна. В нём должно быть показано что-то вроде "(2 of 3)". Это означает, что вы редактируете второй файл из трёх.

Чтобы посмотреть список файлов, используйте команду:

:args

Это сокращение от английского слова "arguments" (аргументы). Вывод команды может выглядеть, например, так:

one.c [two.c] three.c ~

Это список файлов, с которым вы запустили Vim. Файл, который вы редактируете в данный момент, показан в квадратных скобках.

ПЕРЕМЕЩЕНИЕ ПО СПИСКУ АРГУМЕНТОВ

Для возврата к предыдущему файлу пользуйтесь командой

:previous

Эта команда работает точно так же, как и команда ":next", но в обратном направлении. Есть и краткая команда для записи изменений перед тем, как
перейти к предыдущему файлу:

:wprevious

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

:last

а для переходу к первому файлу -- команду

:first

Между тем, команды ":wlast" и ":wfirst" не предусмотрены.

С командами ":next" и ":previous" можно использовать числовую приставку. Например, чтобы перейти на два файла вперёд, используйте

:2next
АВТОМАТИЧЕСКАЯ ЗАПИСЬ ИЗМЕНЕНИЙ

Чтобы не получать сообщений об ошибках, при перемещении между файлами нужно помнить о сохранении изменений командой ":write". Если вы уверены, что всегда хотите сохранять изменённые файлы, то можете включить опцию 'autowrite', которая позволяет сохранять все изменения автоматически:

:set autowrite

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

:set noautowrite
РЕДАКТИРОВАНИЕ ДРУГОГО СПИСКА ФАЙЛОВ

Список файлов можно переопределить без необходимости выхода из редактора и повторного запуска. Например, для редактирования трёх других файлов, пользуйтесь такой командой:

:args five.c six.c seven.h

Можно также использовать символы подстановки, как в оболочке. Например:

:args *.txt

Vim снова перейдет к редактированию первого файла из списка. Если текущий файл был изменён, то перед этим потребуется либо сохранить изменения в файле, или использовать обходную команду ":args!" с добавлением ! для отмены всех несохранённых изменений.

ВСЕ ЛИ ФАЙЛЫ ОТРЕДАКТИРОВАНЫ?

Если вы используете список файлов, то Vim считает, что у вас есть желание редактировать каждый файл в списке. Если вы не будете редактировать все файлы, то при выходе Vim выдаст сообщение

E173: Есть неотредактированные файлы (46). ~

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


07.3 Перемещение между файлами

Для быстрого перемещения между двумя файлами используйте CTRL-^ (на американской клавиатуре это символ, расположенный над символом 6). Например:

:args one.c two.c three.c

Предположим, что вы находитесь в файле one.c.

:next

Теперь вы в файле two.c. При нажатии CTRL-^ вы перейдёте назад к one.c. Повторное нажатие CTRL-^ перенесёт вас обратно к two.c. Последующее нажатие вернёт в файл one.c. Если вы теперь введёте команду

:next

то окажетесь в файле three.c. Обратите внимание, что команда CTRL-^ не изменяет вашего положения в списке аргументов, это делается только командами вроде ":next" или ":previous".

Файл, который вы редактировали перед этим, называется "соседний". Если вы только что запустили Vim, то CTRL-^ не сработает, поскольку соседний файл не определен.

ПРЕДОПРЕДЕЛЁННЫЕ ОТМЕТКИ

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

`"

переносит вас к той позиции, в которой находился курсор, когда вы оставили этот файл. Другая отметка, которая также запоминается, отмечает позицию последнего внесённого вами изменения:

`.

Предположим, что вы редактируете файл "one.txt". Где-то посередине файла вы использовали команду "x", чтобы удалить символ. Затем вы переходите к концу файла при помощи команды "G" и сохраняете изменения командой ":w". Затем вы редактируете несколько других файлов, а потом возвращаетесь к файлу "one.txt" при помощи команды ":edit one.txt". Если вы теперь воспользуетесь командой `", то Vim перенесёт вас в конец файла, а `. перенесёт к позиции, где вы удалили символ. Даже после нескольких перемещений `" и `. всегда будут возвращать вас к этим запомненным положениям, до тех пор, пока вы не внесёте новые изменения или не оставите данный файл.

ГЛОБАЛЬНЫЕ ОТМЕТКИ

В главе 4 мы рассказали как вы можете поместить в файле отметку "x" при помощи команды "mx", чтобы затем переместиться к этой отметке при помощи
команды "`x". Эта система работает в пределах одного файла. Если вы будете редактировать другой файл, и поместите там свою отметку "x", то она будет иметь значение только в пределах этого файла. Таким образом, каждый файл может иметь свой набор отметок, имеющих местный контекст.

До сих пор мы пользовались отметками, имена которых начинаются со строчной буквы. Но что если в качестве имени использовать прописную букву? Такие отметки так же существуют, но они имеют глобальный контекст, и перейти к такой отметке можно из любого файла. Предположим, вы редактируете файл "foo.txt". Перейдите к середине файла ("50%") и поместите там отметку F:

50%mF

Теперь, перейдите к редактированию файла "bar.txt" и поместите в нём отметку B на последней строке:

    GmB

Теперь можно пользоваться командой "'F" для прыжка к середине файла foo.txt и командой "'B" для прыжка в конец файла bar.txt из любого файла.

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

Часто бывает полезно придумать простое соответствие между буквой, выбранной для отметки и файлом, в котором она используется. Например, ставьте отметку H в файле заголовка, M в Makefile и C в исходном коде.

Чтобы посмотреть, где находится та или иная отметка, задайте её имя в качестве аргумента команде ":marks":

:marks M

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

:marks MCP

Не забывайте, что для перехода между старыми и новыми позициями, можно также пользоваться командами CTRL-O и CTRL-I без необходимости размещения отметок.


07.4 Резервные копии файлов

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

:set backup

Имя файла резервной копии представляет собой имя оригинального файла с добавлением ~. Например, если ваш файл называется data.txt, то имя резервной копии файла будет data.txt~.

Если вас не устраивает, что резервные копии заканчиваются на ~, то вы можете изменить окончание при помощи опции 'backupext':

:set backupext=.bak

В этом случае вместо имени data.txt~ для резервной копии файла будет использоваться имя data.txt.bak.

Другая важная опция называется 'backupdir'. Она определяет каталог, в котором будет сохранена резервная копия. Значение по умолчанию, текущий
каталог, обычно является самым подходящим решением.

Замечание:
Если опция 'backup' выключена, но опция 'writebackup' включена, то резервная копия будет всё равно сохраняться. Тем не менее, она будет удаляться как только запись файла успешно завершится. Этот механизм используется в качестве меры предосторожности, чтобы не потерять оригинальный файл, если запись будет неудачной по той или иной причине (например, нехватка места на диске, удар молнии, или что угодно ещё).

Замечание переводчика: Брам пишет, что нехватка места на диске может быть причиной, по которой запись файла может завершиться неудачей. Странно, в данном контексте, если учесть, что для записи резервной копии также требуется место на диске.

СОХРАНЕНИЕ ОРИГИНАЛА ФАЙЛА

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

Чтобы Vim сохранял оригинал файла, установите опцию 'patchmode'. Для этого необходимо указать расширение, используемое для первоначальной резервной копии оригинального файла. Например:

:set patchmode=.orig

Теперь, когда вы начнёте редактировать файл data.txt и запишите первую порцию изменений, Vim сохранит первоначальный вариант с именем "data.txt.orig".
Если вы продолжите вносить изменения в файл, то Vim заметит, что файл "data.txt.orig" уже существует и оставит его в покое. Дальнейшие резервные
копии файла будут называться "data.txt~" (или в соответствии с вашими установками 'backupext').

Если же вы оставите значение опции 'patchmode' пустым (по умолчанию), то первоначальный файл не будет сохраняться.


07.5 Копирование текста между файлами

Объясним теперь как копировать текст из одного файла в другой. Для примера, начните редактировать текст, содержащий фрагмент, который требуется скопировать. Подведите курсор к началу текста и нажмите "v". Теперь, находясь в Визуальном режиме, переместите курсор к концу фрагмента и нажмите "y". Эта операция копирует выделенный фрагмент текста.

Чтобы скопировать вышеприведённый абзац, введите команды:

:edit этот_файл
/Объясним
vjjjj$y

Теперь откройте файл, в который вы хотите вклеить скопированный текст. Подведите курсор к символу, после которого вы хотите видеть фрагмент текста и воспользуйтесь командой "p" для вклейки.

:edit другой_файл
/найдите место где нужно вставить фрагмент
p

Конечно, для копирования текста можно использовать разные команды. Например, для выделения целых строк текста перейдите в Визуальный режим командой "V". Или используйте команду CTRL-V для выделения прямоугольного блока. Команда "Y" позволяет скопировать текущую строку, "yaw" копирует слово под курсором, и т.д.

Команда "p" вклеивает текст под курсором. Для вклейки текста перед курсором пользуйтесь командой "P". Обратите внимание, что Vim запоминает, что именно вы копируете -- строку целиком или блок -- и вклеивает текст тем же способом, которым пользовались при копировании.

ИСПОЛЬЗОВАНИЕ РЕГИСТРОВ

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

Регистр это то место, где Vim хранит текст. Сейчас мы будем пользоваться регистрами с именами от a до z, а позднее вы узнаете и о других регистрах. Давайте скопируем предложение в регистр f:

"fyas

Команда "yas", как и раннее, копирует целое предложение. "f указывает редактору, что текст следует поместить в регистр f. Указание на регистр должно следовать непосредственно перед командой копирования.

Теперь скопируем три целых строки в регистр l:

"l3Y

Число 3 можно было бы так же указать и перед "l. Чтобы скопировать блок текста в регистр b, воспользуемся следующей командой: >

CTRL-Vjjww"by

Обратите внимание, что указание на регистр "b находится непосредственно перед командой "y". Это необходимое требование. Если бы вы поместили указание на регистр перед командой "w", то это бы не сработало.

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

Вы также можете указать регистр и при удалении текста. Это свойство можно использовать при перемещении текста с одного места на другое. Например, для удаления слова в регистр w:

"wdaw

Обратите еще раз внимание, что указание на регистр идёт непосредственно перед командой удаления "d".

ДОБАВЛЕНИЕ В ФАЙЛ

Для добавления текста в файл можно использовать команду:

:write >> logfile

Это позволит дописать текст в текущем файле в конец файла "logfile" без необходимости копировать текст в файле, открывать файл "logfile" и вклеивать скопированный текст. Но при этом дописывать можно только в конец файла.

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


07.6 Просмотр файла

Иногда вам необходимо только взглянуть на содержимое файла, без намерения вносить в него изменения. Чтобы избежать случайного набора команды ":w", которая перезапишет файл, можно открыть файл в режиме только для чтения.

Чтобы запустить Vim в режиме только для чтения, используйте команду

vim -R файл

На Unix того же самого можно добиться командой

view файл

Теперь вы сможете просматривать файл в режиме только для чтения. Если вы попробуете использовать команду ":w", то получите сообщение об ошибке и файл записан не будет.

Если вы попытаетесь внести изменения в файл, открытый только для чтения, Vim выведет предупреждение:

W10: Предупреждение: Изменение файла, открытого только для чтения ~

Тем не менее, Vim позволит выполнить необходимые изменения. Например, для лёгкости чтения вы можете переформатировать текст.

Если вы захотите сохранить изменения в файле, открытом только для чтения, то вам придётся добавить к команде записи !, чтобы заставить Vim записать такой файл.

Если вам требуется полностью запретить внесение изменений в файл, то открывайте его при помощи команды

vim -M файл

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

E21: Файл не подлежит изменению ~

Аргумент командной строки -M можно использовать для запуска Vim в режиме просмотра файла. Имейте, однако, в виду, что такая защита легко отключается при помощи двух команд:

:set modifiable
:set write

07.7 Изменение имени файла

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

:edit copy.c

Теперь, после внесения необходимых изменений , вам требуется сохранить этот файл с новым именем. Для этого можно использовать команду ":saveas":

:saveas move.c

Vim запишет файл с этим именем и продолжит редактирование. Теперь, для записи последующих изменений можно пользоваться командой ":write", и они будут сохраняться в файле "move.c", а файл "copy.c" останется неизменённым.

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

:file move.c

Vim пометит этот файл как "Не редактировался". Иными словами, Vim знает о том, что это не тот файл, с которого вы начали редактирование. Когда вы попытаетесь записать файл, то, возможно, увидите сообщение об ошибке:

E13: Файл уже существует (добавьте !, чтобы обойти проверку) ~

Это предохраняет вас от случайной перезаписи существующего файла.


Следующая глава: Разделение экрана
Авторские права: см. Авторские права