碎碎念

2006, April 5

模式行::Vim进阶索引[1]

Filed under: vim, vi, 编辑器, 教程




Up: (dir)

Vim进阶索引[1]::模式行

这是Vim进阶索引的第一篇,本文假设用户已经掌握了Vim的基本用法(正因为这个假设所以你里的一些内容你可能已经掌握了)。作为第一篇我们要讲的是modeline

相关帮助:

:help modeline
:help 'modeline'
:help 'modelines'





Next: ,
Up: Top

1 什么是模式行?

模式行(modeline)大家应该已经见过了。在Vim文档底部通常会有这么一行`vim:tw=78:ts=8:ft=help:norl:‘,这一行就叫模式行。模式行用来在文档中保存设置,Vim在读入文档后根据模式行的指示对文档对行设置。这样通过在文档中写入模式行我们可以对文档进行个性化设置,定制文本的编辑环境。此外,模式行作为文档的附加信息有助于我们和别人了解一个文档——推荐的文本宽度、使用的语法格式、缩进的方式等等。我们先看一下模式行的用法,再讨论我们可以做什么样的设置。

2 模式行的格式

几乎所有用set命令可以使用的设置项都可以在模式行中使用(有少数设置项是不能在模式行中使用的,如formatprg)。但在进行设置之前必须在设置项前加上`vim:‘(也可以是`vi:‘或`ex:‘,注意一定要小写。),这是Vim判别一模式行的关键。比如有一个文件我们希望每次打开后自动设置为只读,可以在文件中加入模式行`vim:readonly‘。如果有多个设置项的话每个项之间用冒号或空格隔开。现在我们再看一下刚看到的Vim底部的模式行:`vim:tw=78:ts=8:ft=help:norl:‘,现在我们知道在我们打开Vim帮助后它自动进行了如下设置:设置文本宽度为78;设置制表符宽度为8;文件类型为帮助文件;阅读顺序为左到右。

3 模式行中的附加文本

如果我们在自己的日记中或者写作的过程中我们当然可以随意的在文件前几行或后几行添加模式行。但是在一些情况下我们不能直接地在文件开头或最后一行添加模式行——比如程序的源代码,模式行最好是以注释的形式出现。要让模式行以注释的形式出现,只要在前面加入表示注释的命令或符号就行了。例如要在C++源文件末尾加入模式行:

// vim:ft=cpp:

很简单对吧,事实上模式行的`vim:‘之前允许有任意的文字串。唯一的要求是文字串与`vim:‘之间必须至少有一个空格。所以,像这样的模式行是允许的:

*****今天是X月X日星期X***** @#$%$^%^&*()   |   vim:encoding=utf8  tw=80

不过下面的模式行则会出错:
/* vim:ro */
原因是后面的`*/‘被当成一个设置项了,而事实上这个设置项不存在。为了能在模式行后面添加文字串(或者说为了使用c风格的注释),我们要用到模式行的另一种形式。

4 模式行的另一种形式

实际上模式行有两种形式,第一种就是前面说的设置项之间用冒号或空格分隔,缺点是不能后设置项后面添加其他文本。第二种要求使用set命令。不能使用多条set命令。但一条命令可以设置多个选项。选项之间用空格分隔。举例而言,像前面提到的Vim文档的模式行以第二种形式写出来就是:

vim:set tw=78 ts=8 ft=help norl:

这种形式的好处就是或以是模式行末随意添加文本。下面的模式行都是允许的:

/* vim:set ro */
<!-- vim:set ft=html: 模式行示例-->

需要注意的是第一种形式中最后一设置项后的冒号或空格是可有可无的。而第二种形式中最后一设置项后一定要有冒号——不管冒号后有没有文字。在设置项中如果要使用空格、制表符或冒号可以在前面加上转义符-`\‘。其他需要转义符的情况见`:help option-backslash‘。





Next: ,
Previous: 模式行的另一种形式,
Up: Top

5 模式行应用

由于几乎所有的Vim设置项都可以在模式行中使用所以模式行的使用完全视个人的需要而定。因为自己常用的设置可以放在.vimrc文件中所以实际使用中放在模式行中的设置通常是针对某一文档的专有设置。需要在不同的电脑上编辑/查看同一份文档时为了使用同样的设置也会使用模式行(如Vim的文档)。

vim: tabstop=4
正确显示制表符,使文档在不同的机子上有一样的制表符宽度
vim: tw=48 fo=tqamn ts=4 expandtab
写文章。使用48个半角字符文本宽度(24个汉字);序号缩进及汉字支持的格式选项;用4个空格代替制表符;
vim: enc=latin1 guifont=terminal\:oem\:h10\:w8
查看ANSI编码的图形字符(Windows环境)时所用的设置。用来写/看nfo文件。
vim: nowrap tw=0 wm=0 backup
我在行对行翻译时经常使用的设置
vim: fdm=marker
设置折叠规则。关于折叠(folding)我们在以后会讲到。
vim: ft=xxx
设定filetype。关于filetype在以后会讲到。

6 下一篇

模式行的使用方式是比较容易掌握的,但它的价值也比较容易被忽视。希望通过这一篇教程能让大家对模式行有所了解。下一篇我们要讲的是折叠(:help Folding),下次见。





Previous: Top

Appendix A 为什么我添加了模式行却没作用?

  • 首先检查一下`vim:‘与前面的文本之间有没有一个(半角)空格。
  • 其次模式行要求在文件开头的前N行或后N行中,如果没在这个范围内模式行就不起作用。modelines用来设置N的具体数目。比如`:set modelines=8‘这个命令将模式行的有效范围设在了前8行和后8行。
  • 最后看有没有设置`'modeline'‘选项。modeline选项在Vim中默认是开的但也有可能因为一些原因被关上了,比如设置了nomodeline或是没有设置nocompatible

[ -结束- ]

1 Comment »

The URI to TrackBack this entry is: http://blah.blogsome.com/2006/04/05/vim_tut_modeline/trackback/

  1. 阁下的Vim相关教程确实不错!我是对编程可以说是一窍不通的,用上gVim后有很多问题想弄清楚。看过了自带的帮助文件,也上网找过不少材料,还是阁下的文章刚好能解决我心头之困。佩服,对阁下的技术,也对阁下的教学方法。谢谢!

    Comment by normyy — 2007, April 25 @ 18:34

RSS feed for comments on this post.

Leave a comment

Line and paragraph breaks automatic, e-mail address never displayed, HTML allowed: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>



请输入验证码。

Get free blog up and running in minutes with Blogsome
Theme designed by Jay of onefinejay.com