*usr_21.txt*	For Vim version 7.3.	最近更新：2007年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 就去享受你的人生，把你那
些工作忘得干干净净。两个星期以后你启动 Vim，键入:
>
	'0

你正好回到当初离开 Vim 的地方。所以你就把你的工作接着做下去。
   你每次退出 Vim，它都创建一个标记。最后那个是 '0。原来那个 '0 所指的位置就
成了 '1。而原来那个 '1 就成了 '2，依此类推。而原来的标记 '9 就没了。
   要发现标记 '0 至 '9 指向何处，|:marks| 命令很有用。


重 返 某 文 件

如果你想回到最近曾经编辑过的文件，但已经退出过 Vim，有一个稍微复杂的方法。你可
以这样看到这些文件的列表: >
	:oldfiles
<	1: ~/.viminfo ~
	2: ~/text/resume.txt ~
	3: /tmp/draft ~

假如你要编辑第二个文件，也就是列表里 "2:" 开始的那个，输入: >

	:e #<2

其它接受文件名参数的命令都能替代这里的 ":e"，"#<2" 这种形式可以用在 "%" (当前
文件名) 和 "#" (轮换文件名) 可以出现的地方。由此，你也可以这样来分割窗口来编辑
第三个文件: >

	:split #<3

#<123 这种东西在你要用来编辑文件时毕竟是太麻烦了。幸运的是有个简单点的办法: >

	:browse oldfiles
<	1: ~/.viminfo ~
	2: ~/text/resume.txt ~
	3: /tmp/draft ~
	-- More --

你可以得到和 |:oldfiles| 相同的文件。如果要编辑 "resume.txt"，先按 "q" 停止列
表，然后会有提示:

	Type number and <Enter> (empty cancels): ~

输入 "2" 并按 <Enter> 来编辑第二个文件。

详见 |:oldfiles|、|v:oldfiles| 和 |c_#<|。


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' 可以用来撤销这个设定。如果你以超级用户身份 (Unix 的 root 或
MS-Windows 的 Administrator) 工作或者你不信任要编辑的文件时应该如此: >

	: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:
