Christian Brabandt | b4ddc6c | 2024-01-02 16:51:11 +0100 | [diff] [blame] | 1 | *usr_23.txt* For Vim version 9.1. Last change: 2020 Dec 19 |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 2 | |
| 3 | VIM USER MANUAL - by Bram Moolenaar |
| 4 | |
| 5 | Editing other files |
| 6 | |
| 7 | |
| 8 | This chapter is about editing files that are not ordinary files. With Vim you |
| 9 | can edit files that are compressed or encrypted. Some files need to be |
| 10 | accessed over the internet. With some restrictions, binary files can be |
| 11 | edited as well. |
| 12 | |
| 13 | |23.1| DOS, Mac and Unix files |
| 14 | |23.2| Files on the internet |
| 15 | |23.3| Encryption |
| 16 | |23.4| Binary files |
| 17 | |23.5| Compressed files |
| 18 | |
| 19 | Next chapter: |usr_24.txt| Inserting quickly |
| 20 | Previous chapter: |usr_22.txt| Finding the file to edit |
| 21 | Table of contents: |usr_toc.txt| |
| 22 | |
| 23 | ============================================================================== |
| 24 | *23.1* DOS, Mac and Unix files |
| 25 | |
| 26 | Back in the early days, the old Teletype machines used two characters to |
| 27 | start a new line. One to move the carriage back to the first position |
| 28 | (carriage return, <CR>), another to move the paper up (line feed, <LF>). |
| 29 | When computers came out, storage was expensive. Some people decided that |
| 30 | they did not need two characters for end-of-line. The UNIX people decided |
Bram Moolenaar | 4072ba5 | 2020-12-23 13:56:35 +0100 | [diff] [blame] | 31 | they could use <New Line> or <NL> only for end-of-line. The Apple people |
| 32 | standardized on <CR>. The Microsoft Windows folks decided to keep the old |
| 33 | <CR><NL> (we use <NL> for line feed in the help text). |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 34 | This means that if you try to move a file from one system to another, you |
| 35 | have line-break problems. The Vim editor automatically recognizes the |
| 36 | different file formats and handles things properly behind your back. |
| 37 | The option 'fileformats' contains the various formats that will be tried |
| 38 | when a new file is edited. The following command, for example, tells Vim to |
| 39 | try UNIX format first and MS-DOS format second: > |
| 40 | |
| 41 | :set fileformats=unix,dos |
| 42 | |
| 43 | You will notice the format in the message you get when editing a file. You |
| 44 | don't see anything if you edit a native file format. Thus editing a Unix file |
| 45 | on Unix won't result in a remark. But when you edit a dos file, Vim will |
| 46 | notify you of this: |
| 47 | |
| 48 | "/tmp/test" [dos] 3L, 71C ~ |
| 49 | |
| 50 | For a Mac file you would see "[mac]". |
| 51 | The detected file format is stored in the 'fileformat' option. To see |
| 52 | which format you have, execute the following command: > |
| 53 | |
| 54 | :set fileformat? |
| 55 | |
| 56 | The three names that Vim uses are: |
| 57 | |
Bram Moolenaar | 4072ba5 | 2020-12-23 13:56:35 +0100 | [diff] [blame] | 58 | unix <NL> |
| 59 | dos <CR><NL> |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 60 | mac <CR> |
| 61 | |
| 62 | |
| 63 | USING THE MAC FORMAT |
| 64 | |
Bram Moolenaar | 4072ba5 | 2020-12-23 13:56:35 +0100 | [diff] [blame] | 65 | On Unix, <NL> is used to break a line. It's not unusual to have a <CR> |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 66 | character halfway a line. Incidentally, this happens quite often in Vi (and |
| 67 | Vim) scripts. |
| 68 | On the Macintosh, where <CR> is the line break character, it's possible to |
Bram Moolenaar | 4072ba5 | 2020-12-23 13:56:35 +0100 | [diff] [blame] | 69 | have a <NL> character halfway a line. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 70 | The result is that it's not possible to be 100% sure whether a file |
Bram Moolenaar | 4072ba5 | 2020-12-23 13:56:35 +0100 | [diff] [blame] | 71 | containing both <CR> and <NL> characters is a Mac or a Unix file. Therefore, |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 72 | Vim assumes that on Unix you probably won't edit a Mac file, and doesn't check |
| 73 | for this type of file. To check for this format anyway, add "mac" to |
| 74 | 'fileformats': > |
| 75 | |
| 76 | :set fileformats+=mac |
| 77 | |
| 78 | Then Vim will take a guess at the file format. Watch out for situations where |
| 79 | Vim guesses wrong. |
| 80 | |
| 81 | |
| 82 | OVERRULING THE FORMAT |
| 83 | |
| 84 | If you use the good old Vi and try to edit an MS-DOS format file, you will |
Bram Moolenaar | 13fcaaf | 2005-04-15 21:13:42 +0000 | [diff] [blame] | 85 | find that each line ends with a ^M character. (^M is <CR>). The automatic |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 86 | detection avoids this. Suppose you do want to edit the file that way? Then |
| 87 | you need to overrule the format: > |
| 88 | |
| 89 | :edit ++ff=unix file.txt |
| 90 | |
| 91 | The "++" string is an item that tells Vim that an option name follows, which |
| 92 | overrules the default for this single command. "++ff" is used for |
| 93 | 'fileformat'. You could also use "++ff=mac" or "++ff=dos". |
| 94 | This doesn't work for any option, only "++ff" and "++enc" are currently |
| 95 | implemented. The full names "++fileformat" and "++encoding" also work. |
| 96 | |
| 97 | |
| 98 | CONVERSION |
| 99 | |
| 100 | You can use the 'fileformat' option to convert from one file format to |
| 101 | another. Suppose, for example, that you have an MS-DOS file named README.TXT |
| 102 | that you want to convert to UNIX format. Start by editing the MS-DOS format |
| 103 | file: > |
| 104 | vim README.TXT |
| 105 | |
| 106 | Vim will recognize this as a dos format file. Now change the file format to |
| 107 | UNIX: > |
| 108 | |
| 109 | :set fileformat=unix |
| 110 | :write |
| 111 | |
| 112 | The file is written in Unix format. |
| 113 | |
| 114 | ============================================================================== |
| 115 | *23.2* Files on the internet |
| 116 | |
| 117 | Someone sends you an e-mail message, which refers to a file by its URL. For |
| 118 | example: |
| 119 | |
| 120 | You can find the information here: ~ |
| 121 | ftp://ftp.vim.org/pub/vim/README ~ |
| 122 | |
| 123 | You could start a program to download the file, save it on your local disk and |
| 124 | then start Vim to edit it. |
| 125 | There is a much simpler way. Move the cursor to any character of the URL. |
| 126 | Then use this command: > |
| 127 | |
| 128 | gf |
| 129 | |
| 130 | With a bit of luck, Vim will figure out which program to use for downloading |
| 131 | the file, download it and edit the copy. To open the file in a new window use |
| 132 | CTRL-W f. |
| 133 | If something goes wrong you will get an error message. It's possible that |
| 134 | the URL is wrong, you don't have permission to read it, the network connection |
| 135 | is down, etc. Unfortunately, it's hard to tell the cause of the error. You |
| 136 | might want to try the manual way of downloading the file. |
| 137 | |
| 138 | Accessing files over the internet works with the netrw plugin. Currently URLs |
| 139 | with these formats are recognized: |
| 140 | |
| 141 | ftp:// uses ftp |
| 142 | rcp:// uses rcp |
| 143 | scp:// uses scp |
| 144 | http:// uses wget (reading only) |
| 145 | |
| 146 | Vim doesn't do the communication itself, it relies on the mentioned programs |
| 147 | to be available on your computer. On most Unix systems "ftp" and "rcp" will |
| 148 | be present. "scp" and "wget" might need to be installed. |
| 149 | |
| 150 | Vim detects these URLs for each command that starts editing a new file, also |
| 151 | with ":edit" and ":split", for example. Write commands also work, except for |
| 152 | http://. |
| 153 | |
| 154 | For more information, also about passwords, see |netrw|. |
| 155 | |
| 156 | ============================================================================== |
| 157 | *23.3* Encryption |
| 158 | |
| 159 | Some information you prefer to keep to yourself. For example, when writing |
| 160 | a test on a computer that students also use. You don't want clever students |
| 161 | to figure out a way to read the questions before the exam starts. Vim can |
| 162 | encrypt the file for you, which gives you some protection. |
| 163 | To start editing a new file with encryption, use the "-x" argument to start |
| 164 | Vim. Example: > |
| 165 | |
| 166 | vim -x exam.txt |
| 167 | |
| 168 | Vim prompts you for a key used for encrypting and decrypting the file: |
| 169 | |
| 170 | Enter encryption key: ~ |
| 171 | |
| 172 | Carefully type the secret key now. You cannot see the characters you type, |
| 173 | they will be replaced by stars. To avoid the situation that a typing mistake |
| 174 | will cause trouble, Vim asks you to enter the key again: |
| 175 | |
| 176 | Enter same key again: ~ |
| 177 | |
| 178 | You can now edit this file normally and put in all your secrets. When you |
| 179 | finish editing the file and tell Vim to exit, the file is encrypted and |
| 180 | written. |
| 181 | When you edit the file with Vim, it will ask you to enter the same key |
| 182 | again. You don't need to use the "-x" argument. You can also use the normal |
| 183 | ":edit" command. Vim adds a magic string to the file by which it recognizes |
| 184 | that the file was encrypted. |
| 185 | If you try to view this file using another program, all you get is garbage. |
| 186 | Also, if you edit the file with Vim and enter the wrong key, you get garbage. |
| 187 | Vim does not have a mechanism to check if the key is the right one (this makes |
| 188 | it much harder to break the key). |
| 189 | |
| 190 | |
| 191 | SWITCHING ENCRYPTION ON AND OFF |
| 192 | |
| 193 | To disable the encryption of a file, set the 'key' option to an empty string: |
| 194 | > |
| 195 | :set key= |
| 196 | |
| 197 | The next time you write the file this will be done without encryption. |
| 198 | Setting the 'key' option to enable encryption is not a good idea, because |
| 199 | the password appears in the clear. Anyone shoulder-surfing can read your |
| 200 | password. |
| 201 | To avoid this problem, the ":X" command was created. It asks you for an |
| 202 | encryption key, just like the "-x" argument did: > |
| 203 | |
| 204 | :X |
| 205 | Enter encryption key: ****** |
| 206 | Enter same key again: ****** |
| 207 | |
| 208 | |
| 209 | LIMITS ON ENCRYPTION |
| 210 | |
Bram Moolenaar | ba3ff53 | 2018-11-04 14:45:49 +0100 | [diff] [blame] | 211 | The encryption algorithm used by Vim is not very strong. It is good enough to |
| 212 | keep out the casual prowler, but not good enough to keep out a cryptology |
| 213 | expert with lots of time on his hands. The text in the swap file and the undo |
| 214 | file is also encrypted. However, this is done block-by-block and may reduce |
| 215 | the time needed to crack a password. You can disable the swap file, but then |
| 216 | a crash will cause you to lose your work, since Vim keeps all the text in |
| 217 | memory only. The undo file can be disabled with the only disadvantage that |
| 218 | you can't undo after unloading the buffer. |
| 219 | To avoid using a swap file, supply the -n argument on the command line. |
| 220 | For example, to edit the encrypted file "file.txt" without a swap file use the |
| 221 | following command: > |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 222 | |
| 223 | vim -x -n file.txt |
| 224 | |
| 225 | When already editing a file, the swapfile can be disabled with: > |
| 226 | |
| 227 | :setlocal noswapfile |
| 228 | |
| 229 | Since there is no swapfile, recovery will be impossible. Save the file a bit |
| 230 | more often to avoid the risk of losing your changes. |
| 231 | |
| 232 | While the file is in memory, it is in plain text. Anyone with privilege can |
| 233 | look in the editor's memory and discover the contents of the file. |
| 234 | If you use a viminfo file, be aware that the contents of text registers are |
| 235 | written out in the clear as well. |
| 236 | If you really want to secure the contents of a file, edit it only on a |
| 237 | portable computer not connected to a network, use good encryption tools, and |
| 238 | keep the computer locked up in a big safe when not in use. |
| 239 | |
| 240 | ============================================================================== |
| 241 | *23.4* Binary files |
| 242 | |
| 243 | You can edit binary files with Vim. Vim wasn't really made for this, thus |
| 244 | there are a few restrictions. But you can read a file, change a character and |
| 245 | write it back, with the result that only that one character was changed and |
| 246 | the file is identical otherwise. |
| 247 | To make sure that Vim does not use its clever tricks in the wrong way, add |
| 248 | the "-b" argument when starting Vim: > |
| 249 | |
| 250 | vim -b datafile |
| 251 | |
| 252 | This sets the 'binary' option. The effect of this is that unexpected side |
| 253 | effects are turned off. For example, 'textwidth' is set to zero, to avoid |
| 254 | automatic formatting of lines. And files are always read in Unix file format. |
| 255 | |
| 256 | Binary mode can be used to change a message in a program. Be careful not to |
| 257 | insert or delete any characters, it would stop the program from working. Use |
| 258 | "R" to enter replace mode. |
| 259 | |
| 260 | Many characters in the file will be unprintable. To see them in Hex format: > |
| 261 | |
| 262 | :set display=uhex |
| 263 | |
| 264 | Otherwise, the "ga" command can be used to see the value of the character |
| 265 | under the cursor. The output, when the cursor is on an <Esc>, looks like |
| 266 | this: |
| 267 | |
| 268 | <^[> 27, Hex 1b, Octal 033 ~ |
| 269 | |
| 270 | There might not be many line breaks in the file. To get some overview switch |
| 271 | the 'wrap' option off: > |
| 272 | |
| 273 | :set nowrap |
| 274 | |
| 275 | |
| 276 | BYTE POSITION |
| 277 | |
| 278 | To see on which byte you are in the file use this command: > |
| 279 | |
| 280 | g CTRL-G |
| 281 | |
| 282 | The output is verbose: |
| 283 | |
| 284 | Col 9-16 of 9-16; Line 277 of 330; Word 1806 of 2058; Byte 10580 of 12206 ~ |
| 285 | |
| 286 | The last two numbers are the byte position in the file and the total number of |
| 287 | bytes. This takes into account how 'fileformat' changes the number of bytes |
| 288 | that a line break uses. |
| 289 | To move to a specific byte in the file, use the "go" command. For |
| 290 | example, to move to byte 2345: > |
| 291 | |
| 292 | 2345go |
| 293 | |
| 294 | |
| 295 | USING XXD |
| 296 | |
| 297 | A real binary editor shows the text in two ways: as it is and in hex format. |
| 298 | You can do this in Vim by first converting the file with the "xxd" program. |
| 299 | This comes with Vim. |
| 300 | First edit the file in binary mode: > |
| 301 | |
| 302 | vim -b datafile |
| 303 | |
| 304 | Now convert the file to a hex dump with xxd: > |
| 305 | |
| 306 | :%!xxd |
| 307 | |
| 308 | The text will look like this: |
| 309 | |
| 310 | 0000000: 1f8b 0808 39d7 173b 0203 7474 002b 4e49 ....9..;..tt.+NI ~ |
| 311 | 0000010: 4b2c 8660 eb9c ecac c462 eb94 345e 2e30 K,.`.....b..4^.0 ~ |
| 312 | 0000020: 373b 2731 0b22 0ca6 c1a2 d669 1035 39d9 7;'1.".....i.59. ~ |
| 313 | |
| 314 | You can now view and edit the text as you like. Vim treats the information as |
| 315 | ordinary text. Changing the hex does not cause the printable character to be |
| 316 | changed, or the other way around. |
| 317 | Finally convert it back with: |
| 318 | > |
| 319 | :%!xxd -r |
| 320 | |
| 321 | Only changes in the hex part are used. Changes in the printable text part on |
| 322 | the right are ignored. |
| 323 | |
| 324 | See the manual page of xxd for more information. |
| 325 | |
| 326 | ============================================================================== |
| 327 | *23.5* Compressed files |
| 328 | |
| 329 | This is easy: You can edit a compressed file just like any other file. The |
| 330 | "gzip" plugin takes care of decompressing the file when you edit it. And |
| 331 | compressing it again when you write it. |
| 332 | These compression methods are currently supported: |
| 333 | |
| 334 | .Z compress |
| 335 | .gz gzip |
| 336 | .bz2 bzip2 |
| 337 | |
| 338 | Vim uses the mentioned programs to do the actual compression and |
| 339 | decompression. You might need to install the programs first. |
| 340 | |
| 341 | ============================================================================== |
| 342 | |
| 343 | Next chapter: |usr_24.txt| Inserting quickly |
| 344 | |
Bram Moolenaar | d473c8c | 2018-08-11 18:00:22 +0200 | [diff] [blame] | 345 | Copyright: see |manual-copyright| vim:tw=78:ts=8:noet:ft=help:norl: |