344 lines
12 KiB
Text
344 lines
12 KiB
Text
|
*usr_23.txt* For Vim version 7.4. Last change: 2006 Apr 24
|
||
|
|
||
|
VIM USER MANUAL - by Bram Moolenaar
|
||
|
|
||
|
Editing other files
|
||
|
|
||
|
|
||
|
This chapter is about editing files that are not ordinary files. With Vim you
|
||
|
can edit files that are compressed or encrypted. Some files need to be
|
||
|
accessed over the internet. With some restrictions, binary files can be
|
||
|
edited as well.
|
||
|
|
||
|
|23.1| DOS, Mac and Unix files
|
||
|
|23.2| Files on the internet
|
||
|
|23.3| Encryption
|
||
|
|23.4| Binary files
|
||
|
|23.5| Compressed files
|
||
|
|
||
|
Next chapter: |usr_24.txt| Inserting quickly
|
||
|
Previous chapter: |usr_22.txt| Finding the file to edit
|
||
|
Table of contents: |usr_toc.txt|
|
||
|
|
||
|
==============================================================================
|
||
|
*23.1* DOS, Mac and Unix files
|
||
|
|
||
|
Back in the early days, the old Teletype machines used two characters to
|
||
|
start a new line. One to move the carriage back to the first position
|
||
|
(carriage return, <CR>), another to move the paper up (line feed, <LF>).
|
||
|
When computers came out, storage was expensive. Some people decided that
|
||
|
they did not need two characters for end-of-line. The UNIX people decided
|
||
|
they could use <Line Feed> only for end-of-line. The Apple people
|
||
|
standardized on <CR>. The MS-DOS (and Microsoft Windows) folks decided to
|
||
|
keep the old <CR><LF>.
|
||
|
This means that if you try to move a file from one system to another, you
|
||
|
have line-break problems. The Vim editor automatically recognizes the
|
||
|
different file formats and handles things properly behind your back.
|
||
|
The option 'fileformats' contains the various formats that will be tried
|
||
|
when a new file is edited. The following command, for example, tells Vim to
|
||
|
try UNIX format first and MS-DOS format second: >
|
||
|
|
||
|
:set fileformats=unix,dos
|
||
|
|
||
|
You will notice the format in the message you get when editing a file. You
|
||
|
don't see anything if you edit a native file format. Thus editing a Unix file
|
||
|
on Unix won't result in a remark. But when you edit a dos file, Vim will
|
||
|
notify you of this:
|
||
|
|
||
|
"/tmp/test" [dos] 3L, 71C ~
|
||
|
|
||
|
For a Mac file you would see "[mac]".
|
||
|
The detected file format is stored in the 'fileformat' option. To see
|
||
|
which format you have, execute the following command: >
|
||
|
|
||
|
:set fileformat?
|
||
|
|
||
|
The three names that Vim uses are:
|
||
|
|
||
|
unix <LF>
|
||
|
dos <CR><LF>
|
||
|
mac <CR>
|
||
|
|
||
|
|
||
|
USING THE MAC FORMAT
|
||
|
|
||
|
On Unix, <LF> is used to break a line. It's not unusual to have a <CR>
|
||
|
character halfway a line. Incidentally, this happens quite often in Vi (and
|
||
|
Vim) scripts.
|
||
|
On the Macintosh, where <CR> is the line break character, it's possible to
|
||
|
have a <LF> character halfway a line.
|
||
|
The result is that it's not possible to be 100% sure whether a file
|
||
|
containing both <CR> and <LF> characters is a Mac or a Unix file. Therefore,
|
||
|
Vim assumes that on Unix you probably won't edit a Mac file, and doesn't check
|
||
|
for this type of file. To check for this format anyway, add "mac" to
|
||
|
'fileformats': >
|
||
|
|
||
|
:set fileformats+=mac
|
||
|
|
||
|
Then Vim will take a guess at the file format. Watch out for situations where
|
||
|
Vim guesses wrong.
|
||
|
|
||
|
|
||
|
OVERRULING THE FORMAT
|
||
|
|
||
|
If you use the good old Vi and try to edit an MS-DOS format file, you will
|
||
|
find that each line ends with a ^M character. (^M is <CR>). The automatic
|
||
|
detection avoids this. Suppose you do want to edit the file that way? Then
|
||
|
you need to overrule the format: >
|
||
|
|
||
|
:edit ++ff=unix file.txt
|
||
|
|
||
|
The "++" string is an item that tells Vim that an option name follows, which
|
||
|
overrules the default for this single command. "++ff" is used for
|
||
|
'fileformat'. You could also use "++ff=mac" or "++ff=dos".
|
||
|
This doesn't work for any option, only "++ff" and "++enc" are currently
|
||
|
implemented. The full names "++fileformat" and "++encoding" also work.
|
||
|
|
||
|
|
||
|
CONVERSION
|
||
|
|
||
|
You can use the 'fileformat' option to convert from one file format to
|
||
|
another. Suppose, for example, that you have an MS-DOS file named README.TXT
|
||
|
that you want to convert to UNIX format. Start by editing the MS-DOS format
|
||
|
file: >
|
||
|
vim README.TXT
|
||
|
|
||
|
Vim will recognize this as a dos format file. Now change the file format to
|
||
|
UNIX: >
|
||
|
|
||
|
:set fileformat=unix
|
||
|
:write
|
||
|
|
||
|
The file is written in Unix format.
|
||
|
|
||
|
==============================================================================
|
||
|
*23.2* Files on the internet
|
||
|
|
||
|
Someone sends you an e-mail message, which refers to a file by its URL. For
|
||
|
example:
|
||
|
|
||
|
You can find the information here: ~
|
||
|
ftp://ftp.vim.org/pub/vim/README ~
|
||
|
|
||
|
You could start a program to download the file, save it on your local disk and
|
||
|
then start Vim to edit it.
|
||
|
There is a much simpler way. Move the cursor to any character of the URL.
|
||
|
Then use this command: >
|
||
|
|
||
|
gf
|
||
|
|
||
|
With a bit of luck, Vim will figure out which program to use for downloading
|
||
|
the file, download it and edit the copy. To open the file in a new window use
|
||
|
CTRL-W f.
|
||
|
If something goes wrong you will get an error message. It's possible that
|
||
|
the URL is wrong, you don't have permission to read it, the network connection
|
||
|
is down, etc. Unfortunately, it's hard to tell the cause of the error. You
|
||
|
might want to try the manual way of downloading the file.
|
||
|
|
||
|
Accessing files over the internet works with the netrw plugin. Currently URLs
|
||
|
with these formats are recognized:
|
||
|
|
||
|
ftp:// uses ftp
|
||
|
rcp:// uses rcp
|
||
|
scp:// uses scp
|
||
|
http:// uses wget (reading only)
|
||
|
|
||
|
Vim doesn't do the communication itself, it relies on the mentioned programs
|
||
|
to be available on your computer. On most Unix systems "ftp" and "rcp" will
|
||
|
be present. "scp" and "wget" might need to be installed.
|
||
|
|
||
|
Vim detects these URLs for each command that starts editing a new file, also
|
||
|
with ":edit" and ":split", for example. Write commands also work, except for
|
||
|
http://.
|
||
|
|
||
|
For more information, also about passwords, see |netrw|.
|
||
|
|
||
|
==============================================================================
|
||
|
*23.3* Encryption
|
||
|
|
||
|
Some information you prefer to keep to yourself. For example, when writing
|
||
|
a test on a computer that students also use. You don't want clever students
|
||
|
to figure out a way to read the questions before the exam starts. Vim can
|
||
|
encrypt the file for you, which gives you some protection.
|
||
|
To start editing a new file with encryption, use the "-x" argument to start
|
||
|
Vim. Example: >
|
||
|
|
||
|
vim -x exam.txt
|
||
|
|
||
|
Vim prompts you for a key used for encrypting and decrypting the file:
|
||
|
|
||
|
Enter encryption key: ~
|
||
|
|
||
|
Carefully type the secret key now. You cannot see the characters you type,
|
||
|
they will be replaced by stars. To avoid the situation that a typing mistake
|
||
|
will cause trouble, Vim asks you to enter the key again:
|
||
|
|
||
|
Enter same key again: ~
|
||
|
|
||
|
You can now edit this file normally and put in all your secrets. When you
|
||
|
finish editing the file and tell Vim to exit, the file is encrypted and
|
||
|
written.
|
||
|
When you edit the file with Vim, it will ask you to enter the same key
|
||
|
again. You don't need to use the "-x" argument. You can also use the normal
|
||
|
":edit" command. Vim adds a magic string to the file by which it recognizes
|
||
|
that the file was encrypted.
|
||
|
If you try to view this file using another program, all you get is garbage.
|
||
|
Also, if you edit the file with Vim and enter the wrong key, you get garbage.
|
||
|
Vim does not have a mechanism to check if the key is the right one (this makes
|
||
|
it much harder to break the key).
|
||
|
|
||
|
|
||
|
SWITCHING ENCRYPTION ON AND OFF
|
||
|
|
||
|
To disable the encryption of a file, set the 'key' option to an empty string:
|
||
|
>
|
||
|
:set key=
|
||
|
|
||
|
The next time you write the file this will be done without encryption.
|
||
|
Setting the 'key' option to enable encryption is not a good idea, because
|
||
|
the password appears in the clear. Anyone shoulder-surfing can read your
|
||
|
password.
|
||
|
To avoid this problem, the ":X" command was created. It asks you for an
|
||
|
encryption key, just like the "-x" argument did: >
|
||
|
|
||
|
:X
|
||
|
Enter encryption key: ******
|
||
|
Enter same key again: ******
|
||
|
|
||
|
|
||
|
LIMITS ON ENCRYPTION
|
||
|
|
||
|
The encryption algorithm used by Vim is weak. It is good enough to keep out
|
||
|
the casual prowler, but not good enough to keep out a cryptology expert with
|
||
|
lots of time on his hands. Also you should be aware that the swap file is not
|
||
|
encrypted; so while you are editing, people with superuser privileges can read
|
||
|
the unencrypted text from this file.
|
||
|
One way to avoid letting people read your swap file is to avoid using one.
|
||
|
If the -n argument is supplied on the command line, no swap file is used
|
||
|
(instead, Vim puts everything in memory). For example, to edit the encrypted
|
||
|
file "file.txt" without a swap file use the following command: >
|
||
|
|
||
|
vim -x -n file.txt
|
||
|
|
||
|
When already editing a file, the swapfile can be disabled with: >
|
||
|
|
||
|
:setlocal noswapfile
|
||
|
|
||
|
Since there is no swapfile, recovery will be impossible. Save the file a bit
|
||
|
more often to avoid the risk of losing your changes.
|
||
|
|
||
|
While the file is in memory, it is in plain text. Anyone with privilege can
|
||
|
look in the editor's memory and discover the contents of the file.
|
||
|
If you use a viminfo file, be aware that the contents of text registers are
|
||
|
written out in the clear as well.
|
||
|
If you really want to secure the contents of a file, edit it only on a
|
||
|
portable computer not connected to a network, use good encryption tools, and
|
||
|
keep the computer locked up in a big safe when not in use.
|
||
|
|
||
|
==============================================================================
|
||
|
*23.4* Binary files
|
||
|
|
||
|
You can edit binary files with Vim. Vim wasn't really made for this, thus
|
||
|
there are a few restrictions. But you can read a file, change a character and
|
||
|
write it back, with the result that only that one character was changed and
|
||
|
the file is identical otherwise.
|
||
|
To make sure that Vim does not use its clever tricks in the wrong way, add
|
||
|
the "-b" argument when starting Vim: >
|
||
|
|
||
|
vim -b datafile
|
||
|
|
||
|
This sets the 'binary' option. The effect of this is that unexpected side
|
||
|
effects are turned off. For example, 'textwidth' is set to zero, to avoid
|
||
|
automatic formatting of lines. And files are always read in Unix file format.
|
||
|
|
||
|
Binary mode can be used to change a message in a program. Be careful not to
|
||
|
insert or delete any characters, it would stop the program from working. Use
|
||
|
"R" to enter replace mode.
|
||
|
|
||
|
Many characters in the file will be unprintable. To see them in Hex format: >
|
||
|
|
||
|
:set display=uhex
|
||
|
|
||
|
Otherwise, the "ga" command can be used to see the value of the character
|
||
|
under the cursor. The output, when the cursor is on an <Esc>, looks like
|
||
|
this:
|
||
|
|
||
|
<^[> 27, Hex 1b, Octal 033 ~
|
||
|
|
||
|
There might not be many line breaks in the file. To get some overview switch
|
||
|
the 'wrap' option off: >
|
||
|
|
||
|
:set nowrap
|
||
|
|
||
|
|
||
|
BYTE POSITION
|
||
|
|
||
|
To see on which byte you are in the file use this command: >
|
||
|
|
||
|
g CTRL-G
|
||
|
|
||
|
The output is verbose:
|
||
|
|
||
|
Col 9-16 of 9-16; Line 277 of 330; Word 1806 of 2058; Byte 10580 of 12206 ~
|
||
|
|
||
|
The last two numbers are the byte position in the file and the total number of
|
||
|
bytes. This takes into account how 'fileformat' changes the number of bytes
|
||
|
that a line break uses.
|
||
|
To move to a specific byte in the file, use the "go" command. For
|
||
|
example, to move to byte 2345: >
|
||
|
|
||
|
2345go
|
||
|
|
||
|
|
||
|
USING XXD
|
||
|
|
||
|
A real binary editor shows the text in two ways: as it is and in hex format.
|
||
|
You can do this in Vim by first converting the file with the "xxd" program.
|
||
|
This comes with Vim.
|
||
|
First edit the file in binary mode: >
|
||
|
|
||
|
vim -b datafile
|
||
|
|
||
|
Now convert the file to a hex dump with xxd: >
|
||
|
|
||
|
:%!xxd
|
||
|
|
||
|
The text will look like this:
|
||
|
|
||
|
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. ~
|
||
|
|
||
|
You can now view and edit the text as you like. Vim treats the information as
|
||
|
ordinary text. Changing the hex does not cause the printable character to be
|
||
|
changed, or the other way around.
|
||
|
Finally convert it back with:
|
||
|
>
|
||
|
:%!xxd -r
|
||
|
|
||
|
Only changes in the hex part are used. Changes in the printable text part on
|
||
|
the right are ignored.
|
||
|
|
||
|
See the manual page of xxd for more information.
|
||
|
|
||
|
==============================================================================
|
||
|
*23.5* Compressed files
|
||
|
|
||
|
This is easy: You can edit a compressed file just like any other file. The
|
||
|
"gzip" plugin takes care of decompressing the file when you edit it. And
|
||
|
compressing it again when you write it.
|
||
|
These compression methods are currently supported:
|
||
|
|
||
|
.Z compress
|
||
|
.gz gzip
|
||
|
.bz2 bzip2
|
||
|
|
||
|
Vim uses the mentioned programs to do the actual compression and
|
||
|
decompression. You might need to install the programs first.
|
||
|
|
||
|
==============================================================================
|
||
|
|
||
|
Next chapter: |usr_24.txt| Inserting quickly
|
||
|
|
||
|
Copyright: see |manual-copyright| vim:tw=78:ts=8:ft=help:norl:
|