Learn how easy it is to sync an existing GitHub or Google Code repo to a SourceForge project! See Demo

Close

[r192]: trunk / doc / usr_21.txt Maximize Restore History

Download this file

usr_21.txt    439 lines (306 with data), 18.5 kB

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
*usr_21.txt* For Vim version 7.2. 最近更新: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: