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

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

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

23.1    Файлы DOS, Mac и Unix
23.2    Файлы в интернете
23.3    Шифрование
23.4    Бинарные файлы
23.5    Архивные файлы

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


23.1 Файлы DOS, Mac и Unix

Когда-то давным-давно старые телетайпы для того, чтобы начать новую строку, использовали два символа. Один символ переводил каретку в первую колонку ("carriage return", возврат каретки, <CR>), а другой символ перемещал бумагу на одну строку вверх ("line feed", протяжка на строку, <LF>).

Когда появились компьютеры, то память была поначалу дорогая. Некоторые инженеры решили, что нет смысла использовать для перевода строки два символа. Народ на UNIX решил, что для перевода строки можно вполне обойтись одним символом <LF>. Люди из Apple решили использовать <CR>. MS-DOS (и Microsoft Windows) остались приверженцами старого <CR><LF>.

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

Опция 'fileformats' содержит перечисление форматов файлов, которые будут использоваться при редактировании нового файла. Например, следующая команда указывает редактору, что сначала надо попробовать прочитать файл в формате UNIX, а затем, если это не получится, попробовать формат MS-DOS:

:set fileformats=unix,dos

Об изменение формата вам будет доложено перед тем, как вы приступите к редактированию файла. Если файл записан в родном формате вашей системы, то никаких сообщений не будет, например редактирование файла Unix на Unix не проявит себя каким-либо особым сообщением. Но при редактировании файла dos Vim честно напишет об этом:

"/tmp/test" [dos] 3L, 71C ~

Для файла с Макинтоша вы увидите "[mac]".

Обнаруженный формат файла хранится в опции 'fileformat'. Чтобы выяснить, в каком формате записан редактируемый файл, наберите:

:set fileformat?

Vim использует одно из трёх имён:

unix <LF>
dos <CR><LF>                                      
mac <CR>
ИСПОЛЬЗОВАНИЕ ФОРМАТА МАКИНТОША

Итак, на Unix для переноса строки используется <LF>. В появлении символа <CR> посередине строки на Unix нет ничего необычного. В действительности, в ряде сценариев для Vi (и Vim) это происходит довольно часто.

На Макинтоше, где символ <CR> является символом переноса строки, возможно появление в середине строки символа <LF>.

В результате нельзя быть на 100% уверенным, что файл, в котором содержатся оба символа, принадлежит той или иной платформе. Vim предполагает, что вы скорее всего не будете редактировать файлы Mac на Unix и не проверяет этот тип файла по умолчанию. Чтобы выполнять такую проверку, добавьте к опции 'fileformats' значение "mac":

:set fileformats+=mac

В этом случае Vim будет пытаться определить и этот тип файла. Будьте внимательны, Vim может и ошибаться в этой ситуации.

ПЕРЕОПРЕДЕЛЕНИЕ ФОРМАТА

Если вы пользуетесь старым добрым Vi и попытаетесь редактировать файл в формате MS-DOS, то заметите, что каждая строка заканчивается символом ^M (^M это <CR>). При автоматическом определении формата этот символ не показывается. А что если вы хотите редактировать файл в его родном виде? Тогда вам надо переопределить формат:

:edit ++ff=unix file.txt

Строка "++" указывает, что далее следует имя опции, которая переопределяется для данной команды. "++ff" используется для 'fileformat'. Аналогично, вы могли бы использовать "++ff=mac" или "++ff=dos", если возникнет такая необходимость.    Такой синтаксис работает не для всех опций. В данный момент это реализовано только для "++ff" и "++enc". Можно использовать и полные имена опций: "++fileformat" и "++encoding".

ПРЕОБРАЗОВАНИЕ

Опция 'fileformat' может использоваться для преобразования из одного формата файла в другой. Представьте себе, что у вас имеется файл MS-DOS с именем README.TXT, и вы хотели бы преобразовать его в формат UNIX. Начните редактировать этот файл:

vim README.TXT

Vim распознает, что это файл в формате dos. Теперь измените формат файла на UNIX:

:set fileformat=unix
:write

Файл будет записан в формате Unix.


23.2 Файлы в интернете

Кто-то прислал вам письмо, в котором содержится ссылка на файл. Например:

Вся информация находится здесь: ~
ftp://ftp.vim.org/pub/vim/README ~

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

Но существует гораздо более простой способ. Подведите курсор к URL и введите команду:

gf

Если всё пройдёт нормально, то Vim сам догадается какой программой надо пользоваться для загрузки файла, и после завершения загрузки откроет файл в редакторе. Для того, чтобы открыть файл в новом окне, пользуйтесь командой CTRL-W f.

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

Для доступа к файлам в интернете используется модуль netrw. На сегодня поддерживаются следующие протоколы:

ftp:// используется программа ftp
rcp:// используется программа rcp
scp:// используется программа scp
http:// используется программа wget (только для чтения)

Vim не осуществляет сетевых соединений самостоятельно, но пользуется указанными выше программами, которые должны быть установлены на вашем компьютере. На большинстве систем Unix программы "ftp" и "rcp" устанавливаются по умолчанию. Программы "scp" и "wget", возможно, потребуется установить отдельно.

Vim узнаёт эти протоколы для каждой команды, которая начинает редактирование нового файла, в том числе для ":edit" и ":split". Команды записи также работают, за исключением протокола http://.

Подробнее об этой возможности, в том числе о паролях для доступа, см. |netrw|.


23.3 Шифрование

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

Чтобы начать редактирование нового файла с использованием шифрования, добавьте ключ "-x" к командной строке при запуске редактора. Например:

vim -x exam.txt

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

Введите пароль для шифрования: ~

Наберите любой пароль, который сочтёте нужным. Символы, которые вы набираете, будут заменяться на звёздочки. Чтобы избежать проблем с ошибочным набором пароля, Vim попросит ввести пароль ещё раз:

Введите этот же пароль ещё раз: ~

Теперь вы можете спокойно редактировать файл. При записи на диск его содержимое будет зашифровано.

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

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

ОТКЛЮЧЕНИЕ И ВКЛЮЧЕНИЕ ШИФРОВАНИЯ

Чтобы отключить шифрование файла, установите значение опции 'key' равным пустой строке:

:set key=

Теперь при записи файла на диск шифрование не будет применяться.

Установка значения опции 'key' для включения шифрования не самая лучшая идея, поскольку пароль может подглядеть кто-нибудь из-за спины, а команда (с паролем в явном виде) может попасть в историю командной строки.

Вместо этого следует пользоваться командой ":X", которая запрашивает пароль для шифрования способом, аналогичным тому, который используется при запуске редактора с ключом "-x":

:X
Введите пароль для шифрования: ******
Введите этот же пароль ещё раз: ******
ОГРАНИЧЕНИЯ ШИФРОВАНИЯ

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

Один из способов защиты информации в своп-файле от посторонних глаз заключается в отказе от использования своп-файла. Если в командной строке указан ключ "-n", то своп-файл создаваться не будет (вместо этого, Vim будет хранить всю требуемую информацию в памяти). Например, для редактирования зашифрованного файла "file.txt" без использования своп-файла, запустим редактор при помощи следующей команды: >

vim -x -n file.txt

Отключить использование своп-файла в процессе редактирования можно командой:

:setlocal noswapfile

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

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

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

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


23.4 Бинарные файлы

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

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

vim -b datafile

При этом будет включена опция 'binary' и все неожиданные последствия форматирования текста будут отключены. Например, опция 'textwidth' будет установлена равной 0, чтобы избежать автоматического переноса строк.

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

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

:set display=uhex

Можно также использовать команду "ga" для просмотра значения символа, находящегося под курсором. Например, если курсор расположен над символом <Esc>, то вывод команды будет следующим:

<^[>  27,  Hex 1b,  Octal 033 ~

Для отключения переноса длинных строк, отключите опцию 'wrap':

:set nowrap
ПОЗИЦИЯ БАЙТА

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

g CTRL-G

Вывод этой команды довольно многословен:

Кол 9-16 из 9-16; стр. 277 из 330; слово 1806 из 2058; байт 10580 из 12206 ~

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

Для перемещения к определённому байту в файле, используйте команду "go". Например, для перемещения к байту 2345:

2345go
ИСПОЛЬЗОВАНИЕ XXD

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

Прежде всего, откройте файл в бинарном режиме:

vim -b datafile

Теперь, превратите файл в шестнадцатеричный дамп с помощью xxd:

:%!xxd

Текст будет выглядеть примерно так:

0000000: 1f8b 0808 39d7 173b 0203 7474 002b 4e49  ....9..;..tt.+NI ~
0000010: 4b2c 8660 eb9c ecac c462 eb94 345e 2e30  K,.`.....b..4^.0 ~
0000020: 373b 2731 0b22 0ca6 c1a2 d669 1035 39d9  7;'1.".....i.59. ~

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

Когда придёт время, вы сможете выполнить обратное преобразование при помощи команды:

:%!xxd -r

Будут использованы только изменения, сделанные в шестнадцатеричных кодах. Изменения в печатных символах с правой стороны не принимаются во внимание.

Подробнее смотрите страницу справочника man для программы xxd.


23.5 Архивные файлы

Архивный файл можно редактировать как любой обычный текстовый файл. Модуль "gzip" автоматически выполняет требуемые преобразования для распаковки файла при редактировании и упаковки при записи на диск.
В данный момент поддерживаются следующие архивные форматы:

.Z compress                    
.gz gzip
.bz2 bzip2

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


Следующая глава: Быстрая вставка
Авторские права: см. Авторские права