Vim documentation: usr_23

*usr_23.txt* For Vim version 8.0. 最近更新: 2005年3月 VIM 用户手册 - by Bram Moolenaar 译者: Chimin Yen http://vimcdoc.sf.net 编辑特殊文件 本章讨论特殊文件的编辑。利用 Vim 你可以编辑经过压缩或加密的文件。有些文件需要 在互联网上存取。二进制文件也能有限度地编辑。 |23.1| DOS、Mac 和 Unix 文件 |23.2| 互联网上的文件 |23.3| 加密 |23.4| 二进制文件 |23.5| 压缩文件 下一章: |usr_24.txt| 快速插入 前一章: |usr_22.txt| 寻找要编辑的文件 目录: |usr_toc.txt| ============================================================================== *23.1* DOS、Mac 和 Unix 文件 很久以前,老式的电传打字机使用两个字符来另起新行。一个字符把滑动架移回首位 (称 为回车,<CR>),另一个字符把纸上移一行 (称为换行,<LF>)。 当计算机问世以后,存储器曾经非常昂贵。有些人就认定没必要用两个字符来表示行 尾。UNIX 开发者决定他们可以用 <Line Feed> 一个字符来表示行尾。Apple 开发者规定 了用 <CR>。开发 MS-DOS (以及微软视窗) 的那些家伙则决定沿用老式的 <CR><LF>。 那意味着,如果你试图把一个文件从一种系统移到另一种系统,那么你就有换行符方 面的麻烦。Vim 编辑器自动识别不同文件格式,并且不劳你操心就把事情给办妥了。 选项 'fileformats' 包含各种各样的格式,Vim 会在编辑一个新文件之初尝试该选项 定义的各种格式。例如,下面这个命令告诉 Vim 先尝试用 UNIX 格式,其次,尝试 MS-DOS 格式: > :set fileformats=unix,dos 编辑一个文件时,你将注意到 Vim 给出的信息消息报中包括文件所用的格式。如果你编 辑的是本地格式文件 (你编辑的文件格式和所用系统一致),你就不会看到任何格式名。 因此在 Unix 系统上编辑一个 Unix 格式文件不会产生任何关于格式的信息。但你若编辑 一个 dos 文件,Vim 将这样通知你: "/tmp/test" [dos] 3L,71C ~ 如果是 Mac 文件,你会看到 "[mac]"。 探测到的文件格式会被存入 'fileformat' 选项。执行下面这个命令可以显示你当前 使用的文件格式: > :set fileformat? Vim 能使用的三种格式如下: unix <LF> dos <CR><LF> mac <CR> 使 用 MAC 格 式 在 Unix 上,<LF> 用于分行。但 <CR> 字符混在文本行中间也非罕见。这种情况碰巧经 常发生在 Vi (和 Vim) 脚本内。 在采用 <CR> 作为换行符的 Macintosh 上,<LF> 字符也有可能混在文本行中间。 结果,很难 100% 肯定一个同时包含 <CR><LF> 的文件究竟是 Mac 还是 Unix 格 式。所以,Vim 假设你一般不会在 Unix 上编辑一个 Mac 文件,所以干脆对这种文件格 式不作检查。果真要检查此种格式,就把 "mac" 加入 'fileformats': > :set fileformats+=mac 然后 Vim 就会猜测文件格式。要当心, Vim 可能会猜错的。 强 制 格 式 如果你用往日美好的 Vi 来尝试编辑一个采用 MS-DOS 格式的文件,你将会发现每一行的 末尾有个 ^M 字符。(^M 就是 <CR>)。而 Vim 的自动探测功能就避免了这个问题。莫非 你确实要按那个样子来编辑这个文件吗?那么你需要强制 Vim 忽略文件格式而使用你指 定的格式: > :edit ++ff=unix file.txt 字符串 "++" 告诉 Vim 后面跟的是选项名,以取代其默认值。但仅作用于这一个命令。 "++ff" 用于 'fileformat' 选项。你也可以用 "++ff=mac" 或 "++ff=dos"。 这样用法并非适用于任意选项,目前 Vim 仅仅实现了 "++ff" 和 "++enc"。用全称 "++fileformat" 和 "++encoding" 也行。 转 换 你可以用 'fileformat' 选项把文件从一种格式转换为另一种。例如,假定你有个名为 README.TXT 的 MS-DOS 文件,你要把它转换成 UNIX 格式。首先编辑这个采用 MS-DOS 格式的文件: > vim README.TXT Vim 将识别出那是一个 dos 格式文件。现在把这个文件的格式改为 UNIX: > :set fileformat=unix :write 这个文件就以 Unix 格式存盘了。 ============================================================================== *23.2* 互联网上的文件 有人给你传送了一封电子邮件,其中引用了一个以超链接 URL 表示的文件。例如: You can find the information here: ~ ftp://ftp.vim.org/pub/vim/README ~ 你当然可以启动一个程序来下载这个文件,把它存入你本地磁盘,然后启动 Vim 来编辑 它。 但有一个简单得多的方法。把光标移到那个超链接里任何一个字符上,然后使用这个 命令: > gf 运气好的话,Vim 将确定用哪个程序来下载这个文件,并把文件下载下来让你编辑该副 本。在另一个新窗口打开这个文件,则用 CTRL-W f。 如果事情不顺利的话,你会得到出错信息。可能那个链接有错,也可能你没有阅读它 的权限,还可能网络连接中断了,等等。不幸的是,很难讲搞清除出错的原因。你也许得 尝试以手工方法来下载这个文件。 访问因特网上的文件要安装插件 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。例如: > vim -x exam.txt Vim 提示你确定一个密码,用于为文件加密和解密: Enter encryption key: ~ (译者注: 中文是 输入密码: ~ ) 现在仔细键入那个密码。你所键入的字符将为星号代替,因此你看不到。为了避免由于打 字错误引起麻烦,Vim 要求你再输入一次密码: Enter same key again: ~ (译者注: 中文是 请再输入一次: ~ ) 现在你可以像平时一样编辑这个文件并把你所有的秘密放进去。当你编完文件要退出 Vim 时,这个文件就被加密存盘了。 当你用 Vim 编辑这个文件时,它就会要求你再输入那同一个密码。你不需要用 "-x" 参数。你也可以用普通的 ":edit" 命令编辑加密的文件。Vim 给这个文件加上特定的 magic 字符串,据以识别那是经过加密的文件。 如果你试图用另一个程序来阅读这个文件,你将读到一堆垃圾。如果你用 Vim 来编辑 这个文件,但输入了错误的密码,你也只能得到垃圾。Vim 并不具备检验密码正确性的机 理 (这一点使得破译密码更为困难)。 开 / 关 加 密 要给一个文件撤除加密,设定 'key' 选项为空字符串: > :set key= 你下次把这个文件存盘时,存盘的文件就是未经加密的。 设定 'key' 选项来启用加密是个坏主意。因为密码会被清清楚楚地显示在屏幕上。任 何人都可以偷看到你的密码。 为了避免这样的问题,创造了 ":X" 命令。它会像 "-x" 参数向你索取一个密码: > :X Enter encryption key: ****** Enter same key again: ****** 加 密 的 局 限 性 Vim 采用的加密算法有弱点的。它对于防止那种偷窥者是绰绰有余了,但不足以防止一个 手上有大量时间的密码专家。而且,你应该知道交换文件是不加密的;所以当你在编辑文 件时,拥有超级用户权限的人能够读取未经加密的文件文本。 不让人们读到你的交换文件的一个方法就是不使用交换文件。如果在命令行上用了 -n 参数,交换文件就不会被创建了 (Vim 把所有的东西都存放在内存里)。例如,要编辑经 过加密的文件 "file.txt",但不用交换文件,请用下面的命令: > vim -x -n file.txt 如果你已经在编辑这个文件了,那么交换文件 swapfile 可以用下面的命令禁止: > :setlocal noswapfile 由于没了交换文件,文件复原就不可能了。为了避免失去编辑的成果,要比平时更勤快地 存盘你的文件。 文件在内存中以明文形式存在。因此任何具备权限的人都能进入编辑者的内存浏览,从 而,发现这个文件的内容。 如果你使用信息文件 viminfo,别忘了文本寄存器的内容也是明明白白写在其中的。 如果你真的要保证一个文件内容的安全,那么,你必须永远只在一个不联网的可携式 计算机上编辑这个文件,使用优良的加密工具,并且在不用时,把你的计算机锁进一个大 保险箱。 ============================================================================== *23.4* 二进制文件 你可以用 Vim 来编辑二进制文件。Vim 本非为此而设计的,因而有若干局限。但你能读 取一个文件,改动一个字符,然后把它存盘。结果是你的文件就只有那一个字符给改了, 其它的就跟原来那个一模一样。 要保证 Vim 别把它那些聪明的窍门用错地方,启动 Vim 时加上 "-b" 参数: > vim -b datafile 这个参数设定了 'binary' 选项。其作用是排除所有的意外副作用。例如,'textwidth' 设为零,免得文本行给擅自排版了。并且,文件一律以 Unix 文件格式读取。 二进制模式可以用来修改某程序的消息报文。小心别插入或删除任何字符,那会让程序运 行出问题。用 "R" 命令进入替换模式。 文件里的很多字符都是不可显示的。用 Hex 格式来显示它们的值: > :set display=uhex 另外,也可以用命令 "ga" 来显示光标下的字符值。当光标位于一个 <Esc> 字符上时, 该命令的输出看起来就像这样: <^[> 27, Hex 1b, Octal 033 ~ 文件中也许没那么多换行符。你可以关闭 'wrap' 选项来获得总览的效果: > :set nowrap 字 节 位 置 要发现你在文件中的当前字节位置,请用这个命令: > g CTRL-G 其输出十分冗长: Col 9-16 of 9-16; Line 277 of 330; Word 1806 of 2058; Byte 10580 of 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 只有十六进制部分的修改才会被采用。右边可显示文本部分的修改忽略不计。 欲知更多详情,参见 xxd 手册。 ============================================================================== *23.5* 压缩文件 这很容易: 你可以像编辑任何其它文件一样,来编辑一个经过压缩的文件。插件 "gzip" 负责在你编辑这个文件时把它解压缩,以及在你存盘时再把它压缩起来。 目前支持的压缩方法有下面这些: .Z compress .gz gzip .bz2 bzip2 Vim 调用上面提到的程序来实际完成压缩和解压缩。你也许需要先安装这些程序。 ============================================================================== 下一章: |usr_24.txt| 快速插入