<?xml version="1.0" encoding="UTF-8"?><!-- generator="wordpress/1.5.1-alpha" -->
<rss version="0.92">
<channel>
	<title>碎碎念</title>
	<link>http://blah.blogsome.com</link>
	<description>awk, sed, vim, blah blah ...</description>
	<lastBuildDate>Fri, 28 Dec 2007 17:25:53 +0000</lastBuildDate>
	<docs>http://backend.userland.com/rss092</docs>
	<language>en</language>

	<item>
		<title>缩进::Vim进阶索引[8]</title>
		<description>	
	

Up:&nbsp;(dir)

	缩进::Vim进阶索引[8]
	
	Table of Contents
	
	缩进::Vim进阶索引[8]

	1 基础知识

	2 预设规则
	
	2.1 autoindent

	2.2 smartindent,cindent

	2.3 lisp


	
	3 进阶规则（indentexpr）
	
	3.1 简单缩进

	3.2 indentkeys


	
	4 缩进进阶
	
	4.1 例2

	4.2 例2


	
	5 进阶提示
	
	5.1 去除缩进

	5.2 缩进与格式化选项

	5.3 缩进与折叠


	
	Appendix A 表达式与沙箱


	
	缩进可以使用文本结构更清晰易读。在Vi中，这通过是使用专用的外部程序（如：indent或c beautifier类的程序）实现的。Vim除保留了原有外部程序支持外更增加了一些内部的支持。包括了插入模式下的交互进行的缩进与&#39;=&#39;指令的缩进操作。
	1 基础知识
	
:h indent.txt
:h =
:h &#39;equalprg&#39;
:h indentkeys

	
	Vim中缩进有三种基本的使用方式。一是在普通（正常）模式下使用&#39;=&#39;指令。可以圈选范围后使用可以在指令后加上移动的指令。使用的方式与其他编辑指令是一样的（比如&#39;d&#39;）。&#39;==&#39;表示对当前行进行缩进。看下面的例子：
	
	=ip
对当前段落缩进

=G
将由当前行至文章末尾的范围缩进

30==
缩进由当前行开始的30行







	   二是在编辑的过程（插入模式）使用某些键触发。比如，使用&#39;autoindent&#39;时，在插入模式中输入回车（即按回车键）时Vim自动对新行应用缩进规则。
三是粘贴文本时，使用&#39;]p&#39;指令对粘贴文本强制运用缩进。详见：:h ]p
	此外，&#39;gq&#39;或ex命令&#39;:left&#39;也能用来缩进文本。由于它们属于文本格式化的内容，这里不作讨论。
	注意：当&#39;equalprg&#39;不为空时，&#39;=&#39;/&#39;gq&#39;总是使用equalprg中设置的外部工具。除此之外其他的缩进操作不影响。
	
在equalprg中使用的外部程序通常是整理（过滤）文本的工具，很少是单独用于缩进的工具。此外，如果通过外部程序实现缩进，有一些缺点不可避免：
	
	使用上不方便。如果要实现交互方式的缩进（即边输入边根据输入实现缩进），要不断运行外部程序，运行效率低。通过cinkeys/indentkeys的设置Vim可以在输入时计算缩进。

	对大多数的一般应用而言，用户只需要最基本的缩进支持——如autoindent。而你却很难找到这样的程序。

	许多工具不跨平台。

	不够灵活。你其实不想为一些简单的缩进而写新的程序。


	
	Vim应用缩进的过程如下：
	
	依据设置使用缩进规则计算缩进宽度。
	
在不同的缩进规则同时开启时只能有一个起作用。在所有开启的缩进项中只有优先级最高的起作用。它们的优先级排列如下：
indentexpr &gt; cindent &gt; smartindent &gt; ai
	缩进宽度：以一个半角字符的宽度为基本单位计算的总缩进的量。缩进时，Vim会在行首增加相应宽度的空格或制表符。举例而言，如果缩进宽度为4，则Vim在行首增加4个半角空格；如果缩进宽度为8，Vim在行首增加一个制表符。

	
	删除目标行首的制表符与空格。

	根据expandtab与tabstop的设置及缩进宽度添加相应的空格或制表符。
	
制表符的宽度与&#39;tabstop&#39;的设置有关。默认值是8，所以8个半角空格（或其他字符）的宽度与一个制表符一样。如果将&#39;tabstop&#39;设为4，那么如果缩进宽度为9则Vim在行首增加2个制表符与1个半角空格。如果不想使用制表符可以:se noet

	

	
	如果要实验各种缩进方式的话，建议定义如下的快捷键以便随时按&lt;F9&gt;查看缩进的设置：
	
map &lt;F9&gt; :se autoindent? smartindent? cindent? lisp? indentexpr? equalprg? paste? cpoptions?&lt;CR&gt;

	
	有些选项，如&#39;paste&#39;会影响缩进，所以需要查看这个设置项的情况。各个设置项的情况可以见各自的文档。
	2 预设规则
	
	为了方便用户Vim提供了一些预置的缩进规则：自动缩进（autoindent）、智能缩进（smartindent）、c缩进（cindent）、lisp缩进（lisp）。
	2.1 autoindent
	
	autoindent的缩进规则是最简单的。它使用与上一行一样的缩进量。换言之如果你为当前行加了3个空格的缩进，则开始下一行时Vim会自动添加3个空格的缩进。写python脚本时，使用这种缩进就够了。
	使用autoindent，只要开启相应的选项：:se autoindent ...</description>
		<link>http://blah.blogsome.com/2007/09/30/vim_tut_indent/</link>
	</item>
	<item>
		<title>用SED打印斐波那契序列</title>
		<description>	整理邮件时看到了这个SED脚本（2006年1月），好像是我写的最后一篇关于SED的文章……
	# 脚本开始
# SED打印斐波那契序列
	# 调用：seq 10 | sed -f fib.sed  # 打印前10个数字（运行较慢，不要打印太多）
#       yes | sed -f fib.sed     # 打印序列直到溢出
	# 这个脚本用模拟的方式进行数字运算。有关这种方法的更
# 多细节可以参考Greg Ubben写的教程：
# http://sed.sourceforge.net/grabbag/tutorials/
	1{
# 下面字母串的长度决定了可打印的序列长度
# 可以修改下面的字串使之支持更多的序列
# s/.*/zyxwvutsrqponmlkjihgfedcba/
  s/.*/kjihgfedcba/
# 初始化序列为“1, 1”
  s/.*/ &#038;a &#038;a /; h; d
}
	# 从hs取最后两组数字串进行运算
g
s/.* \(.*\) \(.*\) ...</description>
		<link>http://blah.blogsome.com/2007/08/27/sed_fibonacci/</link>
	</item>
	<item>
		<title>Vim中输入法与编码设置的FAQ</title>
		<description>	
	目录
	
	输入法与编码设置的FAQ

	1 中文输入法
	
	1.1 Windows

	1.2 Linux


	
	2 编码问题
	
	2.1 怎么让Vim正确识别编码？
	
	2.1.1 关于编码的一些基础


	
	2.2 为什么有乱码？

	2.3 命令使用的细节

	2.4 如何实时地手工设置某个文件的fenc与enc？

	2.5 有没有办法提高识别率？
	
	2.5.1 enca

	2.5.2 MultiEnc.vim

	2.5.3 chardet


	

	
	3 小结

	4 参考资料


	
	
	

Up:&nbsp;(dir)

	输入法与编码设置的FAQ
	从去年到现在一直陆陆续续的都有人在问起中文输入法的设置和编码的设置这方面的问题。我将这些问题整理了一下，也许有些用处。
	1 中文输入法
	
	如果每次进出insert模式都要切换一下输入法是很恼人的，我自己就有过这样经历。应该也有不少人在初次尝试Vim后放弃的原因就是因为无法让中文输入法与Vim无间配合。其实这个问题是可以解决地（不过只对图形界面的Vim有效）。
	1.1 Windows
	
:h mbyte-IME

	在Windows中如果是直接下载完整的安装包的话，输入法支持已经包涵在gVim中了。如果自行编译的话记得加入以下选项：+multi_byte_ime加入这一选项后，每次退出插入模式后，Vim会依所用命令与上次退出前的输入法状态自动判断使用中文还是英文，在重新进入插入模式时回到上一次退出时的输入状态（即上一次退出时是中文输入还是英文输入的状态）。
	举例来说如果你在插入模式、中文输入状态下按
	
&lt;ESC&gt;dT

	在按&lt;ESC&gt;后Vim自动换回英文输入状态，在按到T后Vim又会自动切换至中文输入状态。
	1.2 Linux
	
:h mbyte-XIM

	Linux下要实现同样的功能需要一些额外的努力。确保所用的gVim版本包括+xim与+GUI_GTK选项。下面是ubuntu下fcitx的设置方式（我不是很清楚用scim如何设置），在.gvimrc（或者.vimrc也行）加入如下设置，
	
se imak=C imi=2 ims=2 imc

	
	imactivatekey (imak)
imak用来设置桌面系统控制输入法开关所使用的快捷键。fcitx的激活键是Ctrl-space，Ctrl则是中英切换键。如果将imak设为Ctrl-space，则每次进入插入模式都是中文输入。将imak设为Ctrl则可以保留上一次退出插入模式时的输入状态。
	
	iminsert/imsearch
imi/ims告诉Vim在插入模式与搜索时使用输入法。

	imcmdline (imc)
imc告诉Vim在使用ex命令时也允许输入法。可根据自己的需要随时设置为开或关。


	2 编码问题
	
:h mbyte.txt

	但凡是需要在Windows与Linux之间传递文档的中文用户或多或少会遇到编码方面的问题——通常是utf8/gb2312文件的识别问题。但有时候情况要更复杂一点，特别是对需要处理不同语言文本的人而言。
	2.1 怎么让Vim正确识别编码？
	
:h charset-conversion
:h fencs

	
	通常下面的命令可以解决大部分的问题：
	
set fileencodings=ucs-bom,utf-8,chinese,big5,latin1

	
	注意：上面的big5与latin1并不起作用可以省略。
	问题解决了吗？很好，现在可以收工了……除非你想了解更多细节。
	2.1.1 关于编码的一些基础
	
	字符在计算机里面有用一个或多个字节表示的。因此可以直接以十六进制数字（因为2**8==16**2）来表示某个字符，某个字符对应的十六进制数字就是该字符的编码。a在ansi、utf8的编码都是0x61，但通常不同的编码系统（编码标准）对某个数字表示的字符有着不同的规定，因而同一个汉字在GBK与Big5中以不同的十六进制数字不一样。同理，同一个数字在不同的编码系统中也对应着不同的字。如，数字0xbac3中gb2312中是“疑”而在Big5中是“好”。 某个编码系统中的字符的集合就是字集charset。
	&#39;termencoding&#39;(&#39;tenc&#39;), &#39;encoding&#39;(&#39;enc&#39;), fileencoding&#39;(&#39;fenc&#39;),是Vim中三个跟编码设置有关的设置项，它们对应着三个概念：终端编码，Vim编码与文件编码。
文件编码就是文件的数据在磁盘中存储所使用的编码。
Vim编码Vim在处理文本或表示文本时所使用的编码。
终端编码终端处理文本或表示文本时所使用的编码。
	（此外还有:scriptencoding命令，设定脚本文件所使用的编码）
	下文中将以xterm指代所有模拟终端如xterm, konsole, rxvt还有Windows下的命令窗口（DOS窗口）。
	在图形系统中每个窗口都拥有自已的绘图区，它们自已决定所使用编码，自己负责输入输出。在使用gVim时，&#39;enc&#39;的值就是就是gVim使用的编码——缺省使用系统的默认编码。gVim在读入文件时需要判断文件所使用的编码并转换为自己的工作编码即&amp;enc。所以gVim只需要处理&#39;enc&#39;与&#39;fenc&#39;。
	与gVim不同，Vim没有自己的窗口，它“借用”xterm的窗口。同其他桌面程序一样xterm也有自己的绘图区域，自己负责输入输出（当然也有自己的编码设置）。在xterm运行Vim时，Vim自己并不负责显示，而是提供数据由xterm将数据打印到绘图区，用户的输入也是经由xterm传给Vim。所以Vim还需要考虑到xterm的编码，即&#39;tenc&#39;。为了数据能正常显示Vim必须先将文本转换为xterm支持的编码再将数据提交到xterm。Vim当然不知道xterm的编码，它用猜的——根据环境变量的值。我们可以使用:set tenc=xxx命令显式地告诉Vim，xterm使用的编码是xxx。
	从下面这张图可以看到它们之间的关系：
	
	
--------------------------------------- &lt;- 用户
        ^ ...</description>
		<link>http://blah.blogsome.com/2007/08/23/vim_cn_faq/</link>
	</item>
	<item>
		<title>TAGS::Vim进阶索引[7]</title>
		<description>	
	Table of Contents
	
	Vim进阶索引[7]::TAGS

	1 基本的tags用法

	2 tags文件格式

	3 相关命令

	4 tags进阶
	
	4.1 编写/转换为Vim文档

	4.2 exuberant ctags

	4.3 增加taglist支持

	4.4 生成导航窗口


	
	5 小结


	
	
	

Up:&nbsp;(dir)

	Vim进阶索引[7]::TAGS
	
tags最广为人知的应用是taglist。但大家对tags本身的关注却少得多。我希望这一篇文章能帮你懂得使用tags、生成tags和扩展tags的应用范围。与之前的几篇不一样的是这一篇的脚本使用了许多Vim7的新特性——大部分是关于List的。

	这几个是相关的文档：
	
:h tagsrch
:h taglist()

	
	当我们在查看Vim文档时，只要在关键字（即两边带有&quot;|&quot;的字）上按CTRL-]就可以跳转到指定的位置——Vim是如何做到这一点的呢？它怎么会知道目标位置在哪呢？
	其实在进行跳转时，Vim借助了一个叫&quot;tags&quot;的文件。tags文件是一个表格，表格中的记录以行为单位。每一条记录包含一个tag（标签）及一条对应该标签的位置信息。当我们按CTRL-]时，Vim在&quot;tags&quot;中查找相应的标签——即当前光标下的字。如果找到则读取该条记录的位置信息。并根据该信息转到相应的位置。标签就相当于HTML的链接文本，而tags文件则记录了每个链接的链接文本（标签）及其对应的href信息（位置信息）。在任意文件的任意位置，都可以使用通过标签跳转到该标签所对应的位置——只要该标签存在于某个Vim可以找到的tags文件中。
	通常Vim会在当前目录下（:pwd）查找tags文件。但你可以指定某个目录下的特定文件为tags文件——不一定要命名为tags，但无论你为它取什么文件名，为了指代方便这里我们还是叫它为tags文件。当你需要为它指定其他名字或位置时，你可能用得着modeline或filetype功能。
	如果你还没见过tags文件，现在打开Vim文档所用的tags文件看一下：
	
:e $VIMRUNTIME/doc/tags

	
	

Next:&nbsp;tags2,
Previous:&nbsp;Top

	1 基本的tags用法
	
	如果你没用过Vim中的相关功能，你可以通过这一节的例子了解tags的基本用法。如果你用过——看下一章。
新建一个工作目录，我们会在这个目录下建三个文件做实验。
	先建立如下文件，命名为“file.txt”:
	
第一行
第二行
第三行
第四行
vim:tags=./tags

	
	接下来建立一个tags文件。tags文件有三栏，第一栏是标签，第二栏是文件名，第三栏表示在文件中的第几行。我们先建立四个标签：A,B,C,&quot;A B&quot;（这个例子中标签名不重要，可以随便取。）分别用来表示上面文件中的第一、二、三、四行。新建名为“tags”的文件，并输入如下内容——注意栏与栏之间用制表符（tab）分隔：
	
A	file.txt	1
A B	file.txt	4
B	file.txt	2
C	file.txt	3

	
	最后，在新建一个文件，并在任意位置输入&quot;A B C&quot;并保存——字符之间要留有空格。将光标移到字母B上按CTRL-]，现在你应该在file.txt的第二行了也就是我们在tags文件中设定的位置上了。现在按CTRL-T可以回到原来的位置。然后再按CTRL-]又跳到file.txt的第二行了。现在，你可以反复地按CTRL-O和CTRL-I后退前进。还有一个问题，怎么使用 &quot;A B&quot;这个标签呢？方法是先选中再按CTRL-]——也就是先将光标放到字母A上，指令序列如下：vfB&lt;C-]&gt;。
	中文字与字之间没有空格，所有在中文环境中也经常要使用选中再按CTRL-]的方式跳转。
	
	

Next:&nbsp;tags3,
Previous:&nbsp;tags1,
Up:&nbsp;Top

	2 tags文件格式
	
:h &#39;tags&#39;
:h tags-file-format

	
	让我们从上面的例子总结一下tags文件的格式：共有三栏（一般也都是三栏），栏与栏之间用一个制表符（Tab）分隔。最前面一栏是标签，后面是具体的位置信息——为表示方便我们估且称之为锚点。第二栏用于定位到特定文件，第三栏将位置具体到特定的行。
	
B file.txt 2

	可解读为标签“B”所指代的位置是“file.txt”文件的第2行（或者说标签“B”对应的锚点在“file.txt”的第2行。）
	但上面例子使用最简单的tag格式。实际上，你可能会遇到下面这样子的tags文件：
	
A	file3.txt	10
ANSWER	file3.txt	norm 30G4|
B	file2.txt	2;&quot;	kind:f	kkk:vvv
C	file3.txt	32
C	file7.txt	/somewhere

	
	我们看一下跟原来的tags文件有什么不一样：
	
	这个tags文件，包含的位置信息分属不同的文件。这意味着通过tags文件，你不仅可以转到同一文件的不同位置，还可以在一堆文件中跳转。

	它包含了不只一种定位的方式。在原来的例子中，行的位置是直接用数字表示的。但实际上Vim可以懂Ex命令。所以遇到&quot;norm 30G4|&quot;Vim会将光标定位到第30行的第4列。而遇到“/somewhere”，Vim会在file7.txt中查找第一个somewhere出现的位置。通过正则表达式的字元就可以进行更复杂的定位。对于不需要修改的文档可以使用行号而需要编辑的文档可以使用正则表示式，这样即使做了修改也能定位到正确的位置。

	有两个同样的标签C指向了不同位置。这种情形当你使用C标签时，Vim会提示有多个匹配，可以:tn跳到下一个匹配。

	标签B的行号后面有“尾巴”。Vi或其他编辑器中“;&quot;”后的内容被视为注释。但Vim可以读取这部分的内容，所以我们可以通常这一部分为tags添加额外的信息。看下面的解释。


	
	只要遵循一定的规范就可以让注释变为有用的信息。我们一起再做个实验，将上面的示例文本，用Vim保存为&quot;tags&quot;。然后在Vim中输入如下命令，观察结果：
	
:echo taglist(&quot;^&quot;)
:echo taglist(&quot;^B&quot;)
:echo taglist(&quot;^B&quot;)[0][&#39;kind&#39;]
:echo taglist(&quot;^B&quot;)[0][&#39;kkk&#39;]

	
	可以看到在返回的字典列表中，多了一个kkk项，可以通过它取得kkk的值vvv。我们可以继续往tags里增加“键:值”对。只要记住，每一项之间要用制表符分开（包括;&quot;与第一项之间），键与值之间用冒号（:）分隔。 另外，Vim支持中文键值但不支持中文键名。如果需要遍历列表可使用:for（:h :for）语句。而且每个tag都有kind项，不论有无给出kind的值，它的值可以是任意的单个字母。为kind赋值时“kind:”也可以省略。所以，标签B也可写为：B  file2.txt  2;&quot;  f kkk:vvv
	
注意：tags文件的编码(encoding)要与Vim的默认编码一致，不然可能会出现中文文字工作不正常的情况。

	
	

Next:&nbsp;tags4,
Previous:&nbsp;tags2,
Up:&nbsp;Top

	3 相关命令
	
	就像往常一样，Vim提供了非常多的命令——但本文的目的不在帮用户背命令。关于这些命令可翻看文档。
	
:h tag-commands

	
下面这几个命令是一定要掌握的：
	
     :h ...</description>
		<link>http://blah.blogsome.com/2007/08/04/vim_tut_tags/</link>
	</item>
	<item>
		<title>Vim的潜能</title>
		<description>	Vim潜能
	虽然独特的屏幕编辑指令与方便使用的正则接口才是Vi类编辑器最重要的特点；虽然大部分用户只需要用10-20%的Vi功能；虽然Vim的定位是一个普通文本编辑器。但是大家还是想知道除了常规的编辑功能外，这个编辑器到底还可以做什么？
	下面这些都是Vim扩展功能的重要手段：
	
	宏(包括了q命令，:map命令和:ab命令)

	Vim Script(升级版的Ex命令)

	外部程序


	
	宏与Vim Script能实现复杂的功能但局限于Vim提供的命令/函数中。使用外部程序的灵活性要差一点，通常只用来过滤编辑区的文本。这就是Vim的全部本事吗？当然不是。Vim还有两大武器——开放源码与编程语言接口。
	1 开放源码
	
	Vim是开放源码软件，所以像所有开放源码软件一样，你可以对它做任意的改动。Vim-Shell及VimGdb是较为人所知的例子，它们使得在Vim中使用shell及在Vim中进行集成调试成为可能。
	得益于开放源码，c程序员们可以在源码级别为Vim“添砖加瓦”。这是扩充Vim的功能最强大的途径——开放源码意味着可能性。一直以来，Bram Moolenaar都声称不会在Vim中集成shell或加入控制调试器的功能1。但由于Vim源码开放，用户还是有机会在Vim中使用Shell及调试程序——虽然它们没能成为Vim的正式发布的一部分，但这些补丁的存在至少让“源码上的无限可能性”不至于成为流于虚无的口号。
	
Bram认为Vim应该成为一个开发框架的一部分（编辑器部分）而不是成为开发框架本身。而他也身体力行，于是就有了Agide。我想正是由于他对Vim的清晰定位，Vim才不至于成为另一个自带编辑器的操作系统。但小小私心的说，在Vim中加入Shell应该还是符合Vim的自身特点的（因为有行模式的存在），也有利于Vim与其他程序的交互操作。而且只是作为Shell的表现层，不至于增加许多代码。

	只是从源码上改进Vim终究是麻烦了一点——需要编译部署的周期。2于是有人为Vim增加了一些接口目的是能在Vim中使用通用脚本语言，重要的是这还成了正式发布的一部分。于是我们就有了perl和Python接口！当然，通过这些接口你还是无法改变Vim的运行机制，无法像c一样无所不能。但这样做还是换来了多方面的好处：首先，你不用为了增加一个绿豆大的功能，而在Vim源码海里打转。其次，你的开发周期中少了编译及重新部署Vim的过程。第三，现今流行的大多数脚本语言都是高级的语言，可以大幅减少开发时间。最后，你还可以选择不加入这些接口——如果你不需要的话，也没有人会强迫你安装一个你不需要用的60MB的脚本引擎。
	2 Vim的编程语言接口
	
	现在仍有许多Vim用户对Vim的程序语言接口不了解，。Vim中除了有自带的脚本引擎外还支持多种脚本语言，其中perl和python自Vim 5开始就成为了正式发布的一部分。现在可以使用的有五种脚本语言Perl, Python, Ruby, TCL和MzScheme。据不一定可靠消息称Java和Lua的接口也在开发中。
	
记住：只有在编译时加入了相应的选项才能使用这些程序语言接口。

	
？？：在Vim脚本中使用这些脚本言与通过!命令使用这些脚本语言有什么不同？外部命令/程序只能修改buffer的内容，而这些接口允许在脚本语言中访问Vim的所有功能。与开发一个更强的Vim脚本引擎相比这样做有什么优势？这些脚本语言都是成熟的通用编程语言，功能上无赘言；多种脚本语言支持也为用户提供更多的选择，用户可以使用自己熟悉的语言。当然，它们都符合Unix工具箱哲学——工具专注于各自的领域，并可以组合使用。

	各个脚本语言能直接访问的Vim对象不完全一样。总的来说可以直接在这些程序语言中使用的对象还不多，但Vim提供了访问Vim Script的接口确保所有的Vim功能都可以通过这些脚本语言访问。举例而言，你可以在perl中修改buffer的内容，但没法直接指定某一段文字所使用的语法高亮颜色。然而，你可以通过VIM::DoCommand()调用Vim Script设置高亮。
	那利用Vim的程序语言接口到底能做些什么呢？通常使用的分工模式是由Vim负责输入输出，而处理逻辑部分由脚本负责。因为这几个都是通用编程语言，所以负责处理逻辑的脚本实际上可以完成任何编程语言能完成的工作。不过记住不要滥用Vim了！如果你只是打开Vim，运行脚本，然后关闭Vim，说明你可能不需要用到Vim而可以直接用该脚本语言完成同样的工作。想一下能否在Vim中实现下面描述的功能？
	
	按一个功能键（比如&lt;F2&gt;）就自动从网上抓取最新的Vim Tips，并在一个分割窗口中显示。

	将当前编辑文本发布到twitter。

	按&lt;F2&gt;将当前编辑文本导出为Word格式，并自动进行适当的格式编排。

	与GTalk用户聊天。

	以MySQL（或其他数据库）做为万能补全的匹配源

	写一个机器人应答程序。

	一个音乐播放器。
        

	
	没错，所有这些功能都可以实现。
	
	解析XML对主流脚本语言来说都只是小菜一碟，你唯一需要确定是在Vim中的显示格式。

	发送POST请求同样不是问题。可参考：Twitter Wiki，这里是现成的Vim script(Twitter)。

	导出为Word格式需要机子上预先安装有Word，脚本语言可以使用自己的com接口来访问Word对象（Word.Application）。将解析过的文本传递给Word的com对象，并根据解析的结果添加适当的样式（控制Word对象或添加Word的样式比较简单，根据文本判断选择样式则相对复杂一点。因为涉及到文本的解析。）见使用Python來控制MS_Word。

	Perl、Python、Ruby都有现成的库XMPP可以与GTalk通信，为Vim添加这个功能并不困难。参考：XMPP Perl Library。

	通过脚本的SQL接口访问数据库返回自动补全的匹配源。这当然也没问题。

	如果你需要的只是不断回答Yes的机器人的话，使用Vim Script足矣。如果你要写一个更智能的机器人话你就需要这些更强大的脚本语言。如果你想用现成的那就看这里，这是Python实现。

	音乐播放器？没错，还是可以。只是在这个应用中其实不需要Vim。


	
	如果你觉得这不像是Vim能做到什么，而更像是这些接口能做些什么的话——没错，实现“责任和义务的转移”这正是这些接口的意义所在。有了这些通用开发语言加持，Vim能做什么就看你的创意了——你唯一需要确定的是实现这些功能需不需要用到Vim。
	
用这些接口开发Vim扩展的一个局限是，你可以同Vim交互的手段相当有限（比如没办法开一个监听Vim事件的守护进程）而且Vim没有图形方面的接口。只是当你遇到这方面的限制时，说明你很可能已经越界了——你正用Vim来做一些跟编辑/显示文本无关的事。

	3 最后
	
	c语言无疑是最强大的武器，但用c扩展Vim功能的开发成本相对较高。如果你会前面说的这几门脚本语言中的任何一种，你就可以用少量的开发成本为Vim增加非常多的可能性。啰嗦一句——如果你不会，你还是可以让Vim助你提高工作效率，要知道在这些接口出现前Vi类编辑器就已经是最受欢迎的编辑器了。
	
我听到很多人不用Vim的原因竟是因为他们用不了这么多功能-__-!，我写这篇文章时用到的最高级的的Vim指令是搜索，但已经足够提高编辑效率了（类似的话我这几天大概说了200次，只是效果不彰XD）。Vim有很多的高级应用，那演示的是Vim的可能性，但大多数人的大多数操作都只用到几十个最常用的Vi(m)指令及指令组合——而这几个指令才是Vi(m)最有价值的功能。

	作为一个Vim的用户，应该要清楚这两点，首先，Vim的目标之一是可以方便地与其他工具协作而不是取代其他工具；其次，Vim的定位是通用文本编辑器。因此使用Vim的脚本接口扩展功能前，你应该先问一下自己：有没有现成的更好/更方便的工具？为什么这个应用中需要用到Vim？
	Appendix A Vim开发原则
	
	相信大家选择编辑器无外乎就是在功能、体积、速度、外观（还有操作方式，只是在用Vi之前大家可能没意识到编辑器是可以有不同的操作方式的）中做一个权衡。没有一个编辑器能满足所有要求。对功能，外观上的要求越高，就要牺牲点体积和速度；反之亦然。Vim试图同时满足功能、体积和速度方面的要求——这不是一个容易达成的目标。Bram Moolenaar为此定了一些Vim开发的原则。可以通过以下命令查看：
	
:h develop.txt

	
	这些既是Vim的开发原则，也解释了Vim之所以成为现在的Vim。通过这些原则我们可以一窥Vim背后的理念。为了减少大家在浏览器与Vim中切换的次数，这里列出一部分：
	
	Vim的目标是成为一个更好的Vi而不是一个全新的编辑器。

	尽可能地使用键盘，因为大数人没有第三只手握鼠标。

	减少使用控制键的使用，因为按控制键不方便。

	要能支持多种不同的终端、平台、多种编译器和库。尽可能的在多平台间保持外观和功能上的一致。除非确实是很酷的功能否则不要开发某平台独有的功能。

	新的功能都要带有完整的文档。

	体积要小，速度要快。确保Vim只用少量的系统资源，让旧的机子也能用Vim。

	有些用户使用低带宽的网络连接，要减少网络通讯量。

	用户拥有定制的自由，包括可以选择去除那些带来体积增加却又不是大多数人用得上的功能。

	Vim的目标是方便高效地与其他程序协作，而不是代替所有其他程序。Vim的定位是系统的组件之一，而不是一个包罗所有功能的巨大程序。

	Vim不是一个shell（交互式命令行解释器/控制台/命令提示符）也不是一个操作系统。所以你没法在Vim中开一个shell或用Vim去控制debugger。按Vim的设计理念，应该是将Vim作为其他shell或IDE中的编辑部件（而不是成为shell或IDE本身）。

	Vim不会为了更华美的外观而牺牲其外观在不同平台的一致性。

	原则上欢迎添加任意功能（除非与其他原则相抵触XD）。


	
	Bram在这篇文章里面对Vim的发展有类似的阐述：工具应专注于各自的领域，并且可以通过组合产生1+1&gt;2的效果，而不是成为一个无所不能的臃肿程序。Vim功能上的增强会被限制在文本编辑方面。它的目标是成为最好的编辑器并且可以与方便地其他工具相配合。3
	


Footnotes
	[1] :h desing-not
	[2] 而且考虑到Unix/Linux上大把的开源软件，“可以从源码上扩展功能”这一点实在不是特别吸引人的特性。
	[3] 听起来有点耳熟？就是前面提到的Unix的工具箱哲学。关于这段话可以在原文中搜索&#8221;World domination&#8221;。事实上Bram Moolenaar曾多次提及这些原则，google一下“高效文本编辑的七个习惯”。
	

	


 </description>
		<link>http://blah.blogsome.com/2007/07/29/p44/</link>
	</item>
	<item>
		<title>有多少种方式可以在vim 中插入行号</title>
		<description>	
	

Up:&nbsp;(dir)

	有多少种方式可以在vim 中插入行号
	
	Table of Contents
	
	有多少种方式可以在vim 中插入行号

	1 在文本中插入行号
	
	1.1 使用line()函数

	1.2 使用ex命令

	1.3 使用range()函数

	1.4 加法运算

	1.5 使用&lt;CTRL-A&gt;

	1.6 利用Vim的编程支持

	1.7 外部命令


	
	2 最后


	
	
	

Next:&nbsp;chap2,
Up:&nbsp;Top

	1 在文本中插入行号
	最近有朋友提到某编辑器有一个可以插入行号的插件，问Vim有没有办法可以在文章中插入行号。%$^&amp;*#8~#$@#!……让我们看一下有多少种方式可以在vim中插入行号或数字序列！
	建议看一下Vim官网的这篇文章。里面一部分内容与这篇是重叠的。不过这篇是中文的XD。
	我们的目的是在当前编辑文中的每一行前面加上行号或数字序列并用空格分隔，如：
	
这是第一行
这是第二行
	
这是第四行

	在插入行号后将成为：
	
1 这是第一行
2 这是第二行
3
4 这是第四行

	但有时我们需要对部分行编号。下面的例子是对第二行以后的所有非空行依次编号：
	
这是第一行
1 这是第二行
	
2 这是第四行
3 这是第五行

	为了区别行号，我这里就称之为数字序列。
	进入正题。
	
	

Next:&nbsp;sec2,
Up:&nbsp;Top

	1.1 使用line()函数
	
	相信这是大多数人第一个想到的解法了——使用line()函数产生行号用:s命令插入行号。
	
&quot; 为所有行加上行号
&quot; 使用合适的范围或者正则表达式就可以限定作用的范围。
:g/^/ s//\=line('.').' '/

	
	优点是简单易用。缺点是不够灵活，只能用以显示指定行的行号。
	
	

Next:&nbsp;sec3,
Previous:&nbsp;sec1,
Up:&nbsp;Top

	1.2 使用ex命令
	
	vim提供了一些可以打印行号的ex命令，如，&quot;=&quot;, &quot;p #&quot; 和&quot;#&quot;。为了捕捉Vim的命令输出，我们用redir命令。
	
&quot; 为前30行加上行号
:redir @a | 1,30# | redir END
:1,30d | put! a

	
	逻辑上很容易理解：1,30#显示前30行及其行号。保存到寄存器a中，删掉前30行，再贴上寄存器的内容。
	没什么明显优点的一种方法。缺点同上。如果不是更改当前编辑区的内容而是直接保存到新文件的话，这种方法就比其他的方法方便。
	
	

Next:&nbsp;sec4,
Previous:&nbsp;sec2,
Up:&nbsp;Top

	1.3 使用range()函数
	
	range()是个新的函数，用来产生包含数字序列的列表。当然也可以用来生成行号：
	
&quot; 为前30行加上行号
:for i in range(31)
:call setline(i,i .' '. getline(i))
:endfor

	
	对range()，setline()的用法见帮助文档。
	range()函数相对前面的2个解法而言要灵活许多，除可用以表示行号，也可以用来编数字序列，相应地也要求一些编程基础。
	
	

Next:&nbsp;sec5,
Previous:&nbsp;sec3,
Up:&nbsp;Top

	1.4 加法运算
	
	这是也是简单灵活的一种解法。好吧，也许大家第一个想到的解法不是使用line()函数。
	
&quot; ...</description>
		<link>http://blah.blogsome.com/2007/06/27/vim_line_no/</link>
	</item>
	<item>
		<title>Vim7中的万能补全（Omni completion）</title>
		<description>	
	Table of Contents: 
	
	Vim7中的万能补全（Omni completion）

	1 万能补全基础

	2 在返回的列表中使用字典

	3 更多

	4 使用外部文件

	5 实例

	Appendix A 中文议题

	Appendix B 用自动补全来计算结果


	
	
	

Up:&nbsp;(dir)

	Vim7中的万能补全（Omni completion）
	自动补全是Vim的一项重要功能。但由于中文的特性，这项功能对很多中文用户来讲显得不那么实用。在中国这项功能几乎只局限于写程序时使用了。
Vim支持多种形式的补全。补全的使用方法是按C-X，再根据所使用的补全输入相应的键。
	
	整句补全对中文用户还是比较有用的C-l（这条命令在所有的buffer中查找匹配的行）。

	单词补全基本没用因为中文的书写并不以词为单位（没有分隔）C-n（倒是也可当成整句补用）。

	字典补全c-k和thesaurus补全。同样的对于中文只能当成整句补用。

	单词补全还有一种C-k，除了在当前文件中找匹配外也在包含文件中查找匹配──对编程来讲比较有用。

	tags补全C-j。

	文件名补全C-f。

	定义和宏补全C-d。

	Vim命令补全C-v。

	用户定义补全C-U。万能补全C-O。


	
	


	1 万能补全基础
	
本文关于万能补全（omni completion）的所有内容同样适用于，用户定义补全（user completion）。

	什么是万能补全？万能补全有什么作用呢？
万能补全是一种按自定义规则进行补全的补全功能。它的好处在于他给了用户满足特殊需要的灵活性。
	万能补全的使用方式是在插入模式下输入&lt;C-x&gt;&lt;C-o&gt;（或者&lt;C-x&gt;&lt;C-u&gt;）。不过在你使用这项功能前你得先在自定义函数中定义补全所使用的规则。并相应地设置&#39;omnifunc&#39;（或&#39;completefunc&#39;）。比如你自定义的规则在自定义的UCompl()函数中则设置：
	
se ofu=UCompl

	
	那这个自定义的函数或者说自定义的补全规则要怎么写呢？这就是我接下去要讲的最主要的内容。
	这里先看一下自定义补全函数的基本框架：
	
func! Mycomp(start,base)
    if a:start
        &quot; 返回欲匹配字的起始位置。对于英文就是往前找到第一个非字母字符的位置。
    else
        &quot; 返回匹配列表。
    ...</description>
		<link>http://blah.blogsome.com/2006/06/27/vim7_tut_oc/</link>
	</item>
	<item>
		<title>外部程序::Vim进阶索引[6]</title>
		<description>	
	Table of Contents: 
	
	Vim进阶索引[6]::外部程序

	1 使用外部程序的Vim命令

	2 !命令
	
	2.1 !的两种使用风格

	2.2 实例


	
	3 相关议题

	4 小结

	Appendix A 


	
	
	

Up:&nbsp;(dir)

	Vim进阶索引[6]::外部程序
	
Windows的用户可能会因为这一篇里面用了大量的Unix工具而倍感沮丧。但大可不必如此，这一篇里面我们更多的是讲一种使用Vim的理念──用户可以依据自身对外部工具的掌握程度适时地使用这些工具来减少工作量。常的工具都可以找到对应的Winodws版本，而且通常很小。

	unix工具箱哲学的一个核心思想是每个工具只完成各自相对简单的任务，这些工具的真正威力来自于它们之间关系。你可以组合这些工具来完成复杂的工作。Vim虽然是一个交互式的编辑器，但这种思想仍在它身上得了很好的体现。它能很好地与其他工具配合来扩展功能或完成相对复杂的编辑工作。
	这一篇教程我们将讨论与Vim中与外部程序有关的议题。
	
	



	1 使用外部程序的Vim命令
	
	Vim中有一些功能是通过外部程序来实现的。比如:make命令，Vim没有内置make工具。但是用户可以为:make命令指定一个外部程序，比如：gnu make或Windows下的nmake。这样我们在Vim中就可以使用:make命令了。设置make工具所用的设置项是&#39;makeprg&#39;。我们先看一下跟外部程序有关命令和其对应设置项。
   
	


:cscope 
	
	设置项：&#39;cscopeprg&#39;

	说明：cscope是c/c++的源代码分析工具。&#39;cscopeprg&#39;默认设置即为“cscope”。要使用这项功能除了在编译时+cscope外，还要求系统上已安装了cscope类的程序。:cscope命令在Vim有一个专有的运行介面和选项，只适用于cscope或类似的工具。cscope虽然是为c/c++而生的，但存在着许多类似工具。如果在Vim的搜索路径或在系统的路径上只要将相应程序的名称传结csprg，否则必须写上完整路径。

	用法：在vim中使用这条:cs命令之前需要先在命令行下运行cscope生成数据文件。然后再在Vim中使用:cs add载入数据文件。输入:cs可看到在线帮助。当然还可以*cscope*。详细用法见文档。


	

	
= 
	
	设置项：&#39;equalprg&#39;

	说明：=这是条一般模式下的过滤命令。用来对c程序进行缩进。在缺省的情况下，这条命令用来进行C缩进。通过对&#39;indentexpr&#39;进行设置我们还可以决定缩进的方式。


	

	
gq 
	
	设置项：&#39;formatprg&#39;

	说明：这也是一条一般模式下的过滤命令，用来整理段落。缺省情形下使用内建的功能重排段落，可以通过调整，&#39;tw&#39;&#39;formatoptions&#39;等项细化重排功能。缺省情况下调用Vim内置函数进行格式重排。


	

	
:grep 
	
	设置项：&#39;grepprg&#39;

	说明：grep查找文本，并返回结果（到错误列表中）。正如它的名称一样这条命令的作用就是跟!grep是一样了，因为在Unix下它就是调用grep程序──除了一点：Vim会为:grep命令生成一个窗口和匹配列表。用户可以在结果文件中跳转。Unix下默认设置为&quot;grep -n&quot;，Win32环境中默认设置为&quot;findstr /n&quot;。相关的设置项有&#39;grepformat&#39;，缺省下不需要设置。


	

	
:make 
	
	设置项：&#39;makeprg&#39;

	说明：写程序的话对这个应该不会陌生。默认情况下设置为make。这条命令在Vim中运行各种的make类工具。而它存在的理由和grep一样，Vim中我们可以通过结果方便地导航（通常是在“出错”的情况下）。


	

	
K 
	
	设置项：&#39;keywordprg&#39;

	说明：这是个一般模式命令用以运行查找Vim文档或man的命令。这条命令的特别之处在于传递参数给外部程序的过程将由Vim自动完成。它将当前“词”做参数传给&#39;keywordprg&#39;。缺省情况下，使用man（Unix）或内置的:help命令（Windows）。相关的设置项有：keywordprg iskeyword


	

	
:shell 
	
	设置项：&#39;shell&#39;

	说明：Linux下一般是根据环境变量`$SHELL&#8216;或设置为`sh&#8216;。Win32下默认设置为`command.com&#8216;或`cmd.exe&#8216;。如无特殊说明这一系列教程中所使用的命令解释器分别为Linux下的`sh&#8216;（或`bash&#8216;）和Windows Xp下的`cmd.exe&#8216;。这个命令涉及的还有外部程序和脚本的使用!，所以无特殊需要最好不要改动。我们在Vim中的:sh命令，!过滤命令等都是通过shellprg 的设置来运转的。
	Linux下一般是根据环境变量`$SHELL&#8216;或设置为`sh&#8216;。Win32下默认设置为`command.com&#8216;或`cmd.exe&#8216;。如无特殊说明这一系列教程中所使用的命令解释器分别为Linux下的`sh&#8216;（或`bash&#8216;）和Windows Xp下的`cmd.exe&#8216;。这个命令涉及的还有外部程序和脚本的使用!，所以无特殊需要最好不要改动。


	


	提示：这些设置的一个共同点是它们都不能在模式行中进行设置。出于安全的原因在模式行中不能使用这些设置项。
	Vim的Diff模式就是使用了工具GNU diff，这个程序是Vim的重要组成，Vim并未提供相应的设置项让用户更改。与vim相关的外部程序还有ctags类的程序，这类程序用来生成关键字的索引。但Vim用到的是tags文件所以也没有提供相应的设置项。（即使要生成tags，ctags也不是必需的）
	这些就是使用或可设置为外部程序的命令。总的来说这些命令在某些方面提供了方便。但从功能性来说它们并非是必不可少的。不过既然有了我们还是利用起来吧。
	由于这些命令的特性我们可以用来做一些有用的事情，现在来看一下我们还能怎么用这些命令。
	
	=
	gq
这两条命令都是在一般模式中使用的过滤命令（一般的过滤在行模式中使用）。它们的工作方式都是一样的：对一定的范围使用过滤程序/内部命令，所以我们放在一起。通过指定合适的过滤程序我们就能决定这命令的作用。
比如：设置为sort可以用来排序`se equalprg=sort&#8216;，设置为`se equalprg=sort&#92;|uniq&#8216;，排序并去除重复。
总之任何过滤程序都可以在这里使用──而决不仅仅可以使用缩进或文本格式化的工具。

K
与前面两个命令不同，这个命令的目的并非改变当前文本的内容或格式。这个命令以当前字为或选区(至多一行)为参数运行命令 。自动传递参数给相应的程序。利用它自动传递参数的特点我们可以运行一些需要参数的程序。
除了用来查找Vim文档，man文档外最直觉的一个用法就是用来查字典了。只要是以一个字词为输入的所有程序都可以定义为&#39;keywordprg&#39;。如：stardict、locate、which等。
	下面是用K来运行当前圈选1的网址的例子（windows平台）：
	
     se kp=start&#92; c:&#92;&#92;progra~1&#92;&#92;opera&#92;&#92;opera.exe

	
:grep
	:make
这两条命令的真正有用的/有效的特性在于Vim可以根据运行的结果生成quickfix窗口。而且你可以用:cn, :clist, cw&#8230;等quickfix命令在不同的位置间跳转。要用好两条命令首先要了解这两个设置项：grepformat errorformat。这两个设置项的作用是捕捉并分析输出。在使用make工具时由于在使用不同编译器时输出的错误信息的格式也不尽相同，所以在设置好了grepprg或makeprg后还要教它“读懂输出”。
	在缺省情况下Unix平台的Vim的&#39;grepprg&#39;是&#39;grep -n&#39;而Windows下则是&#39;findstr /n&#39;，不过它们运行的结果都一样。假设你是命令行下（shell中）用前面的命令在当前目录查找：grep -n goes *.txtl，返回信息是以下面的格式出现的：
	
 ...</description>
		<link>http://blah.blogsome.com/2006/06/27/vim_tut_bang/</link>
	</item>
	<item>
		<title>暂停更新</title>
		<description>	在接下来的一段时间内这个Blog将暂停更新

 </description>
		<link>http://blah.blogsome.com/2006/06/18/p38/</link>
	</item>
	<item>
		<title>Vi/Ex编辑器教程[4]</title>
		<description>	


	Vi/Ex编辑器
	
作者：Walter Alan Zintz
译者：hq00e （at） 126.com
原文：The Vi/Ex Editor 

	
	


	第四章 替换命令
	
	目录
	
	Vi/Ex编辑器

	第四章 替换命令
	
	对当前行进行替换

	更多的字元

	在替换式样中使用的字元

	替换命令的其他用法

	脚本入门

	看好你的文件

	读者来信

	下一篇


	
	Appendix A 答案


	
	除了在这篇教程的上一篇中讲过的全局命令（:global）外在行模式命令中就数“:substitute”命令也就是替换命令最为精细和复杂了。在讲完复杂的部分后我们就会开始接触那些用以构建强力行模式命令串的技巧和窍门。
	
	

下一个：&nbsp;sect2,
上层：&nbsp;substitute

	对当前行进行替换
	
	你们中的大多数人应该已经知道替换命令的最简略的写法是“:s”并且已经以这种形式：
	     s/previous/former/
     %s/Smith/Lee and Smith/

	
	分别用来为当前所在行做替换和对文件中的所有行作替换。你如果已经在使用这两种形式的替换了，那你的学习进度已经超前了。有太多的课堂讲师和教课书的编撰者都告诉你要在所有行中替换某个短语要使用类似下面的命令：
	     global/Smith/s//Lee and Smith/

	
	这只是在浪费时间。两种的形式干的是一样的活，但第二种形式要用掉更多的输入时间和电脑解释命令的时间。在两个版本的命令中不管文件中是否每行都有要替换的“Smith”亦或整篇文档中只有一个“Smith”，替换命令都能很正常并且安静地完成工作。
	但两种形式的命令都不保证对文件中所有的“Smith”进行替换。替换命令在默认情况下只对行中出现的第一个目标字串进行替换，因此像下面的这一行：
	     inure to Smith&#39;s benefit only if Smith shall

	
	在运行完两个版本中任一版本的替换命令后成了：
	     inure to Lee ...</description>
		<link>http://blah.blogsome.com/2006/06/18/vi_tut_4/</link>
	</item>
</channel>
</rss>
