USR_21

*usr_21.txt*    For Vim version 7.0.    最近更新:2006年5月

                     VIM 用户手册 - Bram Moolenaar 著
                  译者: Chimin Yen http://vimcdoc.sf.net

                           离开和回来


本章深入讨论如何让其它程序跟 Vim 混用。 或者从 Vim 内部执行别的程序,或者暂时
先离开 Vim 而于执行了那个程序后再回来。 而且,本章将进一步介绍如何记住 Vim 的
当前状态,并在以后把它还原回来。

|21.1|  挂起和继续
|21.2|  执行 shell 命令
|21.3|  记忆有关信息: viminfo
|21.4|  会话
|21.5|  视图
|21.6|  模式行

       下一章: |usr_22.txt|  寻找要编辑的文件
       前一章: |usr_20.txt|  快速键入命令行
         目录: |usr_toc.txt|


*21.1* 挂起和继续

像多数 Unix 程序一样,Vim 可以按 CTRL-Z 挂起。这个动作把 Vim 停下来, 并让你回 到那个你起动 Vim 的命令 shell 里。接着,你可以执行任何别的命令直到你觉得无聊 为止。然后再用 "fg" 命令回到 Vim。 CTRL-Z {any sequence of shell commands} fg 你正好回到那个当初你离开 Vim 的地方,什么也没改变。 当你按 CTRL-Z 行不通时,你还可以用命令 ":suspend"。别忘了把 Vim 引导回前台, 否则你会失去你所有的修改! 只有 Unix 支持这个功能。在其它系统上 Vim 将为你起动一个 shell. 这也让你得以执 行 shell 命令。可那是一个新 shell,而非那个你在其中起动 Vim 的那个. 当你运行图像用户介面时,你无法返回那个 Vim 从其中起动的 shell。CTRL-Z 的作 用只是把 Vim 窗口最小化.

*21.2* 执行 shell 命令

从 Vim 内部执行单个 shell 命令,用 ":!{command}"。例如, 要显示目录表: :!ls :!dir 第一行用在 Unix 上,第二行用于微软视窗. Vim 将执行该程序。当它结束时,你会得到提示, 让你击打 <Enter>. 这提示允许你 在回去编辑你的文本之前看一看该命令的输出. 字符 "!" 也用在其它有个程序被调用运行的场合。让我们看一看共有哪些: :!{program} 执行 {program} :r !{program} 执行 {program} 并读取其输出 :w !{program} 执行 {program} 传送文本至其输入 :[range]!{program} 经由 {program} 过滤文本 注意 "!{program}" 前面那个作用区产生的区别可大了。不附带作用区,这个程序就跟 通常一样被执行,而加了这个作用区, 作用区内的文本行就经由该程序过滤而出. 用这种方法执行一系列命令也是可以的。但 shell 在此却更胜一筹. 你可以用这种方法 起动一个新 shell: :shell 这有点类似于用 CTRL-Z 来挂起 Vim。不同之处在于这种方法起动的是一个新 shell。 使用图像用户介面时,这个 shell 利用 Vim 的窗口作为其输入和输出端口。既然 Vim 并非终端仿真器,所以使用中未必尽善近美。要是你遇到麻烦, 试试切换 'guipty' 选 项。如果这方法仍不奏效,那就只好起动一个新的终端来运行 shell. 例如: :!xterm&

*21.3* 记忆有关信息: viminfo

在你编辑了一会儿文件以后,你就会有些文本储存在寄存器内, 有些标记指向各种各样 文件,还有一些精妙的命令保存在命令行历史记录内。当你退出 Vim, 所有这些就全没 了。但你能够把它们找回来! 信息文件 viminfo 被设计为储存状态信息: 命令行和模式搜索的历史记录 寄存器内文本 各种文件的标记 缓存器列表 全局变量 你每次退出 Vim,它就把此种信息存放在一个文件内。即 viminfo 信息文件。当 Vim 重新起动时,就读取这个信息文件, 而那些信息就被还原了。 选项 'viminfo' 的默认设定是还原有限的几种信息。你也许希望设定它记住更多的信息. 下面这个命令可以办到: :set viminfo=string 其中字符串 "string" 规定了什么要储存。该字符串的语法为一个选项字符跟一个参数. 选项和参数组成的对子之间由逗号分隔. 来看一下你可以怎样构建你自己的 viminfo 字符串。首先,选项 ' 用于规定你为多 少个文件保存标记 (a-z)。为此选项挑一个美妙的偶数 (比如 1000). 你的命令现在看 起来像这样: :set viminfo='1000 选项 f 控制是否要储存全局标记 (A-Z 和 0-9)。如果这个选项设为 0,那么什么也不 存储。如果设为 1 ,或你对 f 选项不作规定, 那么标记就被存储. 你要这个功能, 现 在你有了: :set viminfo='1000,f1 选项 < 控制着每个寄存器内保存几行文本。默认情况下,所有的文本行都被保存. 如果 设为 0,则什么也不保存。为了避免成千上万行文本被加入你的信息文件 (那些文本可能 永远也没用,徒然使 Vim 起动得更慢), 你采用 500 行的上限: :set viminfo='1000,f1,<500 你也许用得着的其它选项: : 保存命令行历史记录内的行数 @ 保存输入行历史记录内的行数 / 保存搜索历史记录内的行数 r 可移介质,其中没有任何标记存入 (可用多次) ! 以大写字母开头的全局变数,并且不含有小写字母 h 起动时解除选项 'hlsearch' 的高亮度显示 % 缓冲列表 (只有当不带参数起动 Vim 时才还原) c 用编码 'encoding' 转换文本 n 用于 viminfo 文件的名称 (必须为最后一项选项) 欲知更多详情,参见 'viminfo' 选项以及 |viminfo-file| . 当你多次运行 Vim,最后退出的那个就把信息储存起来。这可能导致以前退出的那些 Vim 所存放的信息流失,因为每个条目只能被记住一次. 重 返 原 处 你编辑一个文件到一半,但你得下班去渡假了。你退出 Vim 就去享受你的人生, 把你那 些工作忘得干干净净。两个星期以后你起动 Vim,键入: '0 你正好回到当初离开 Vim 的地方。所以你就把你的工作接着做下去。 你每次退出 Vim,它都创建一个标记。最后那个是 '0. 原来那个 '0 所指的位置就 成了 '1。而原来那个 '1 就成了 '2,依此类推. 而原来的标记 '9 就没了。 要发现标记 '0 至 '9 指向何处,|:marks| 命令很有用。 Vim 间 信 息 移 动 在 Vim 仍然运行的情况下,你可以用命令 ":wviminfo" 和 ":rviminfo" 来保存和还原 信息。这很方便,比如在两个同时运行的 Vim 之间交换寄存器内容。在第一个 Vim 里 执行: :wviminfo! ~/tmp/viminfo 而在第二个 Vim 里执行: :rviminfo! ~/tmp/viminfo 很明显,字符 "w" 指 "写" 而字符 "r" 指 "读"。 ":wviminfo" 用字符 ! 来强制重写一个已存在文件。当它省略时,而文件却存在, 那 么这些信息就跟那个文件合并到一起. 用于 ":rviminfo" 的 ! 字符意味着所有的信息都被采用,这可能会重写一些已存在 信息。 若不用 ! 字符,则只有那些尚未设定的信息才会被采用. 这些命令也可以用来储存信息为将来所用。你可以让一个目录专门存放信息文件,而 每一个所包含的信息各有其特殊的目的.

*21.4* 会话

假定你编着编着,编到那一天要结束了。你想放下手上的工作, 而于第二天再从你停下来 的那地方继续编下去。你可以做到这一点,只要把你的编辑会话保存起来, 第二天再把它 还原回来. Vim 会话存放着所有跟你的编辑相关的信息。这包括诸如文件列表,窗口布局, 全局 变数,选项, 以及其它信息。(究竟什么信息被记住, 则由选项 'sessionoptions' 控制, 稍后叙述.) 下面这个命令创建一个会话文件: :mksession vimbook.vim 如果你以后要还原这个会话,你可以用这个命令: :source vimbook.vim 如果你要起动 Vim 并还原某个特别的会话,你可以用下面这个命令: vim -S vimbook.vim 这命令告诉 Vim 在起动时读取一个特定的会话文件。参数 'S' 指会话 (实际上,你可以 用 -S 运行任何 Vim 脚本,因而, 你也不妨指其为运行脚本, "source"). 那个曾经打开的窗口就还原了,跟以前一样的位置和大小。映射和选项值也像以前一样. 究竟还原了什么取决于 'sessionoptions' 选项。默认值为 "blank,buffers,curdir, folds,help,options,winsize". blank 保留空窗口 buffers 所有缓冲,而非仅仅一个窗口内的 curdir 当前目录 folds 折叠,包括人工创建的 help 帮助窗口 options 所有选项和映射 winsize 窗口大小 你爱怎么改就怎么改。例如,除了上述项目以外, 你还要还原 Vim 窗口大小: :set sessionoptions+=resize 会 话 用 法 最显而易见的会话用法,是在编辑属于不同项目的文件时。假定你把会话文件都储存在 目录 "~/.vim" 下。你正编辑着项目 "secret" 的文件,而你必须切换到项目 "boring" 的文件上: :wall :mksession! ~/.vim/secret.vim :source ~/.vim/boring.vim 首先用命令 ":wall" 把所有修改过的文件存盘。然后用命令 ":mksession!" 保存当前会 话。它重写了前一次会话文件. 下一次载入 "secret" 会话时,你便可以在原来那一点上 接着编辑下去。最后,你载入新的 "boring" 会话. 如果你打开帮助窗口,分裂和关闭各种各样窗口, 并把窗口布局全搞砸了, 此时你可以恢 复上次保存的会话: :source ~/.vim/boring.vim 你因而享有充分的控制权,要么把当前会话中的设置保存起来, 以便下一次编辑时从现在 这个位置接着编下去,要么保留会话文件不变, 一切都从那儿开始. 另一种会话用法是你创建了一种你喜欢的窗口布局,并把它保存在一个会话文件中。 然后你可以在任何时候恢复这种窗口布局. 例如,这是一个使用起来很不错的布局: +----------------------------------------+ | VIM - main help file | | | |Move around: Use the cursor keys,or "h| |help.txt================================| |explorer | | |dir |~ | |dir |~ | |file |~ | |file |~ | |file |~ | |file |~ | |~/=========|[No File]===================| | | +----------------------------------------+ 其顶部有个帮助窗口,使你能够阅读本文。左边那个狭长窗口相当于一个文件浏览器. 这 是一个 Vim 插件,用来表列一个目录的内容。你可以在那儿挑选文件来编辑. 有关这一 点,下一章有更多叙述. 从一个刚刚起动的 Vim 创建这样一个布局,请用: :help CTRL-W w :vertical split ~/ 你可以根据你的喜好稍稍改动一点那些窗口的大小。然后保存会话记录: :mksession ~/.vim/mine.vim 现在你可以用这个布局起动 Vim: vim -S ~/.vim/mine.vim 提示: 要在一个空窗口中打开一个表列在浏览器窗口中的文件,请把光标移到文件名上 并按 "O"。用鼠标双击也行. UNIX 和 微 软 视 窗 有些人不得不今天在微软视窗上工作,而明天则在 Unix 上。如果你是其中之一, 请考 虑把 "slash" 和 "unix" 加入选项 'sessionoptions'。此后存盘的会话文件的格式在 两种系统上都适用。请把以下命令加进你的 vimrc 文件内: :set sessionoptions+=unix,slash Vim 将因而使用 Unix 格式,因为微软视窗上的 Vim 能读写 Unix 文件, 但 Unix 上的 Vim 却不能读取微软视窗格式的会话文件。类似地,微软视窗上的 Vim 懂得文件路径名 称里用以分隔名字的 / ,但 Unix 上的 Vim 却不懂微软视窗上的 \. 会 话 记 录 和 信 息 文 件 会话记录储存了不少东西,但不储存标记位置, 寄存器内容以及命令行历史记录。你需 要利用 Vim 信息文件 viminfo 储存这些信息. 在大多数情况下,你将需要利用会话记录而非全部信息文件内的信息。这么做可以让 你切换到另一个会话记录,但却保留着命令行历史记录。并得以在一个会话期内把文本抄 进寄存器,而于另一个会话期把它粘贴出来. 你也许宁可用会话记录保存信息。那么,你必须亲自动手. 例如: :mksession! ~/.vim/secret.vim :wviminfo! ~/.vim/secret.viminfo 而再次把它还原: :source ~/.vim/secret.vim :rviminfo! ~/.vim/secret.viminfo

*21.5* 视图

一个会话记录储存着整个 Vim 窗口外观。当你只需要为其中一个窗口储存特性时,得用 视图. 视图的用处在于你要以某种特定的方式编辑一个文件。例如,你以 'number' 选项显 示了行数,并定义了若干折叠。正如会话记录那样, 你可以记住这一视图并在以后还原 回来。事实上,当你储存会话时, 每个窗口的视图都储存了. 视图有两种基本用法。第一种是让 Vim 为视图文件挑一个文件名. 你可以在以后编 辑同一文件时还原该视图。为当前窗口储存视图,用: :mkview Vim 将自行决定视图的储存位置。当你以后编辑同一文件时,你用这个命令恢复该视图: :loadview 这挺容易,不是吗? 现在你要阅读这个文件,阅读时你不要 'number' 选项显示行数, 或者你要把所有 的折叠都打开。你可以设定这些选项,使窗口看起来就是你要的那个样子. 然后储存这 个视图: :mkview 1 显而易见,你可以用下面的命令把它恢复: :loadview 1 现在你可以用 ":loadview" 在这个文件的两个视图之间切换了,一个加参数 "1", 另一 个则不加参数. 你可以用这个方法为同一个文件储存视图达十个之多,一个没序数的, 而九个则有序 数 1 至 9. 命 名 视 图 第二种视图基本用法是把视图储存在一个你选定的文件内。你可以在编辑另外一个文件时 载入这个视图。Vim 将接着转而编辑该视图规定的文件. 这样你就可以用这种方法迅速换 个文件来编辑,其所有的选项设定就跟它们在存盘时一样。 例如,要保存当前文件的视图: :mkview ~/.vim/main.vim 你可以用这个命令把它还原: :source ~/.vim/main.vim

*21.6* 模式行

当你编辑一个特定的文件,你也许为该文件设定了特定的选项。每次键入这些命令很无 聊。而在许多人共享一个文件时,利用会话和视图来编辑这个文件也无济于事. 解决这个困境的方法是给文件加一个模式行。那是一行文本,它把一些只适用于该文 件的选项设定告诉 Vim. 一个典型的例子是在一个 C 程序中你把缩进值设为 4 的倍数。这就要求把选项 'shiftwidth' 设为 4。这个模式行能奏效: /* vim:set shiftwidth=4: */ 把这一行插入该文件起首五行或结尾五行。编辑这个文件时,你将注意到 'shiftwidth' 选项已经设定为 4。编辑另一个文件时,它再设回默认值 8. 对于有些文件,模式行放在其头文件里挺合适, 这样它就被置于该文件的顶部。对于 文本文件和其它那些必须在正文内插入模式行的文件,把模式行放在文件结尾处. 选项 'modelines' 规定了要在文件起首和结尾几行之内检查那儿是否包含了模式行。要 检查十行: :set modelines=10 选项 'modeline' 可以用来撤销这个设定。你应当以超级用户身份来执行这个动作,否则 你编辑的文件就靠不住: :set nomodeline 用这个格式表示模式行: any-text vim:set {option}={value} ... : any-text 其中 "any-text" 表示你可以在 Vim 实际用到的部分之前和之后加任意文本。这就允许 你使它看起来像个注释,正如上例采用了 /* 和 */. " vim:" 部分使 Vim 识别出这个模式行。在 "vim" 的前面必须有空格,或者 "vim" 必须置于行首。因此像 "gvim:" 这样用法是不行的. 冒号之间的部分是命令 ":set" 。它的用法就跟键入 ":set" 命令一模一样,只除了 在命令本身包含的冒号之前需要插入一个反斜线符 (否则该冒号就会被看成模式行结尾). 还有一个例子: // vim:set textwidth=72 dir=c\:\tmp: use c:\tmp here 在第一个冒号之前多一个反斜线符,因此它被包括在 ":set" 命令内。第二个冒号后面的 文本则被忽略不计,因此可以在那儿放个注释. 欲知详情,参见 |modeline|.

下一章: |usr_22.txt| 寻找要编辑的文件 版权: 参见 |manual-copyright| vim:tw=78:ts=8:ft=help:norl:

Generated by vim2html on 2006年 06月 24日 星期六 00:27:59 UTC