<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>一个搞技术的家伙</title>
	<atom:link href="http://beyondidea.cn/index.php/feed" rel="self" type="application/rss+xml" />
	<link>http://beyondidea.cn</link>
	<description>一个搞技术的家伙</description>
	<lastBuildDate>Sat, 12 Mar 2011 04:41:07 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>VIM查找替换归纳总结</title>
		<link>http://beyondidea.cn/index.php/archives/597</link>
		<comments>http://beyondidea.cn/index.php/archives/597#comments</comments>
		<pubDate>Wed, 02 Mar 2011 01:52:53 +0000</pubDate>
		<dc:creator>wl1011</dc:creator>
				<category><![CDATA[vim]]></category>

		<guid isPermaLink="false">http://beyondidea.cn/?p=597</guid>
		<description><![CDATA[VIM查找替换归纳总结        <div style="text-align:center;margin-top:10px;margin-bottom:15px;">
        <script type="text/javascript"><!--
        google_ad_client = "ca-pub-0297441349139103";
        /* feed_468x60 */
        google_ad_slot = "7402452313";
        google_ad_width = 468;
        google_ad_height = 60;
        //-->
        </script>
        <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
        </script></div>]]></description>
			<content:encoded><![CDATA[        <div style="text-align:center;margin-top:10px;margin-bottom:15px;">
        <script type="text/javascript"><!--
        google_ad_client = "ca-pub-0297441349139103";
        /* listpage_468x60 */
        google_ad_slot = "8886504232";
        google_ad_width = 468;
        google_ad_height = 60;
        //-->
        </script>
        <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
        </script></div><div>1，简单替换表达式</div>
<div>替换命令可以在全文中用一个单词替换另一个单词：</div>
<div>:%s/four/4/g</div>
<div>&#8220;%&#8221; 范围前缀表示在所有行中执行替换。最后的 &#8220;g&#8221; 标记表示替换行中的所有匹配点。如果仅仅对当前行进行操作，那么只要去掉%即可</div>
<div>如果你有一个象 &#8220;thirtyfour&#8221; 这样的单词，上面的命令会出错。这种情况下，这个单词会被替换成&#8221;thirty4&#8243;。要解决这个问题，用 &#8220;\&amp;lt;&amp;quot; 来指定匹配单词开头：</div>
<div>:%s/\&#8221; 来解决这个问题：</div>
<div>:%s/\/4/g</div>
<div>如果你在编码，你可能只想替换注释中的 &#8220;four&#8221;，而保留代码中的。由于这很难指定，可以在替换命令中加一个 &#8220;c&#8221; 标记，这样，Vim 会在每次替换前提示你：</div>
<div>:%s/\/4/gc</div>
<div>2，删除多余的空格</div>
<div>要删除这些每行后面多余的空格，可以执行如下命令：</div>
<div>:%s/\s\+$//</div>
<div>命令前面指明范围是 &#8220;%&#8221;，所以这会作用于整个文件。&#8221;substitute&#8221; 命令的匹配模式是</div>
<div>&#8220;\s\+$&#8221;。这表示行末（$）前的一个或者多个（\+）空格（\s）。替换命令的 &#8220;to&#8221; 部分是空的：&#8221;//&#8221;。这样就会删除那些匹配的空白字符。</div>
<div>3，匹配重复性模式</div>
<div>星号项 &#8220;*&#8221; 规定在它前面的项可以重复任意次。因此:</div>
<div>/a*</div>
<div>匹配 &#8220;a&#8221;，&#8221;aa&#8221;，&#8221;aaa&#8221;，等等。但也匹配 &#8220;&#8221; (空字串)，因为零次也包含在内。星号 &#8220;*&#8221; 仅仅应用于那个紧邻在它前面的项。因此 &#8220;ab*&#8221; 匹配 &#8220;a&#8221;，&#8221;ab&#8221;，&#8221;abb&#8221;,&#8221;abbb&#8221;，等等。如要多次重复整个字符串，那么该字符串必须被组成一个项。组成一项的方法就是在它前面加 &#8220;\(&#8220;，后面加 &#8220;\)&#8221;。因此这个命令:</div>
<div>/\(ab\)*</div>
<div>匹配: &#8220;ab&#8221;，&#8221;abab&#8221;，&#8221;ababab&#8221;，等等。而且也匹配 &#8220;&#8221;。</div>
<div>要避免匹配空字串，使用 &#8220;\+&#8221;。这表示前面一项可以被匹配一次或多次。</div>
<div>/ab\+</div>
<div>匹配 &#8220;ab&#8221;，&#8221;abb&#8221;，&#8221;abbb&#8221;，等等。它不匹配 后面没有跟随 &#8220;b&#8221; 的 &#8220;a&#8221;。</div>
<div>要匹配一个可选项，用 &#8220;\=&#8221;。 例如:</div>
<div>/folders\=</div>
<div>匹配 &#8220;folder&#8221; 和 &#8220;folders&#8221;。</div>
<div>4，指定重复次数</div>
<div>要匹配某一项的特定次数重复，使用 &#8220;\{n,m}&#8221; 这样的形式。其中 &#8220;n&#8221; 和 &#8220;m&#8221; 都是数字。在它前面的那个项将被重复 &#8220;n&#8221; 到 &#8220;m&#8221; 次 (|inclusive| 包含 &#8220;n&#8221; 和 &#8220;m&#8221;)。例如:</div>
<div>/ab\{3,5}</div>
<div>匹配 &#8220;abbb&#8221;，&#8221;abbbb&#8221; 以及 &#8220;abbbbb&#8221;。</div>
<div>当 &#8220;n&#8221; 省略时，被默认为零。当 &#8220;m&#8221; 省略时，被默认为无限大。当 &#8220;,m&#8221; 省略时，就表示重复正好 &#8220;n&#8221; 次。例如:</div>
<div>模式          匹配次数</div>
<div>\{,4}           0，1，2，3 或 4</div>
<div>\{3,}           3，4，5，等等</div>
<div>\{0,1}          0 或 1，同 \=</div>
<div>\{0,}           0 或 更多，同 *</div>
<div>\{1,}           1 或 更多，同 \+</div>
<div>\{3}            3</div>
<div>5，多选一匹配</div>
<div>在一个查找模式中，&#8221;或&#8221; 运算符是 &#8220;\|&#8221;。例如:</div>
<div>/foo\|bar</div>
<div>这个命令匹配了 &#8220;foo&#8221; 或 &#8220;bar&#8221;。更多的抉择可以连在后面:</div>
<div>/one\|two\|three</div>
<div>匹配 &#8220;one&#8221;，&#8221;two&#8221; 或 &#8220;three&#8221;。</div>
<div>如要匹配其多次重复，那么整个抉择结构须置于 &#8220;\(&#8221; 和 &#8220;\)&#8221; 之间:</div>
<div>/\(foo\|bar\)\+</div>
<div>这个命令匹配 &#8220;foo&#8221;，&#8221;foobar&#8221;，&#8221;foofoo&#8221;，&#8221;barfoobar&#8221;，等等。</div>
<div>再举个例子:</div>
<div>/end\(if\|while\|for\)</div>
<div>这个命令匹配 &#8220;endif&#8221;，&#8221;endwhile&#8221; 和 &#8220;endfor&#8221;。</div>
<p>1，简单替换表达式<br />
替换命令可以在全文中用一个单词替换另一个单词：<br />
:%s/four/4/g</p>
<p>&#8220;%&#8221; 范围前缀表示在所有行中执行替换。最后的 &#8220;g&#8221; 标记表示替换行中的所有匹配点。如果仅仅对当前行进行操作，那么只要去掉%即可<br />
如果你有一个象 &#8220;thirtyfour&#8221; 这样的单词，上面的命令会出错。这种情况下，这个单词会被替换成&#8221;thirty4&#8243;。要解决这个问题，用 &#8220;\&amp;lt;&amp;quot; 来指定匹配单词开头：<br />
:%s/\&#8221; 来解决这个问题：<br />
:%s/\/4/g</p>
<p>如果你在编码，你可能只想替换注释中的 &#8220;four&#8221;，而保留代码中的。由于这很难指定，可以在替换命令中加一个 &#8220;c&#8221; 标记，这样，Vim 会在每次替换前提示你：<br />
:%s/\/4/gc</p>
<p>2，删除多余的空格<br />
要删除这些每行后面多余的空格，可以执行如下命令：<br />
:%s/\s\+$//</p>
<p>命令前面指明范围是 &#8220;%&#8221;，所以这会作用于整个文件。&#8221;substitute&#8221; 命令的匹配模式是<br />
&#8220;\s\+$&#8221;。这表示行末（$）前的一个或者多个（\+）空格（\s）。替换命令的 &#8220;to&#8221; 部分是空的：&#8221;//&#8221;。这样就会删除那些匹配的空白字符。</p>
<p>3，匹配重复性模式<br />
星号项 &#8220;*&#8221; 规定在它前面的项可以重复任意次。因此:<br />
/a*<br />
匹配 &#8220;a&#8221;，&#8221;aa&#8221;，&#8221;aaa&#8221;，等等。但也匹配 &#8220;&#8221; (空字串)，因为零次也包含在内。星号 &#8220;*&#8221; 仅仅应用于那个紧邻在它前面的项。因此 &#8220;ab*&#8221; 匹配 &#8220;a&#8221;，&#8221;ab&#8221;，&#8221;abb&#8221;,&#8221;abbb&#8221;，等等。如要多次重复整个字符串，那么该字符串必须被组成一个项。组成一项的方法就是在它前面加 &#8220;\(&#8220;，后面加 &#8220;\)&#8221;。因此这个命令:<br />
/\(ab\)*</p>
<p>匹配: &#8220;ab&#8221;，&#8221;abab&#8221;，&#8221;ababab&#8221;，等等。而且也匹配 &#8220;&#8221;。</p>
<p>要避免匹配空字串，使用 &#8220;\+&#8221;。这表示前面一项可以被匹配一次或多次。<br />
/ab\+<br />
匹配 &#8220;ab&#8221;，&#8221;abb&#8221;，&#8221;abbb&#8221;，等等。它不匹配 后面没有跟随 &#8220;b&#8221; 的 &#8220;a&#8221;。</p>
<p>要匹配一个可选项，用 &#8220;\=&#8221;。 例如:<br />
/folders\=<br />
匹配 &#8220;folder&#8221; 和 &#8220;folders&#8221;。</p>
<p>4，指定重复次数<br />
要匹配某一项的特定次数重复，使用 &#8220;\{n,m}&#8221; 这样的形式。其中 &#8220;n&#8221; 和 &#8220;m&#8221; 都是数字。在它前面的那个项将被重复 &#8220;n&#8221; 到 &#8220;m&#8221; 次 (|inclusive| 包含 &#8220;n&#8221; 和 &#8220;m&#8221;)。例如:<br />
/ab\{3,5}<br />
匹配 &#8220;abbb&#8221;，&#8221;abbbb&#8221; 以及 &#8220;abbbbb&#8221;。<br />
当 &#8220;n&#8221; 省略时，被默认为零。当 &#8220;m&#8221; 省略时，被默认为无限大。当 &#8220;,m&#8221; 省略时，就表示重复正好 &#8220;n&#8221; 次。例如:<br />
模式          匹配次数<br />
\{,4}           0，1，2，3 或 4<br />
\{3,}           3，4，5，等等<br />
\{0,1}          0 或 1，同 \=<br />
\{0,}           0 或 更多，同 *<br />
\{1,}           1 或 更多，同 \+<br />
\{3}            3</p>
<p>5，多选一匹配<br />
在一个查找模式中，&#8221;或&#8221; 运算符是 &#8220;\|&#8221;。例如:<br />
/foo\|bar<br />
这个命令匹配了 &#8220;foo&#8221; 或 &#8220;bar&#8221;。更多的抉择可以连在后面:<br />
/one\|two\|three<br />
匹配 &#8220;one&#8221;，&#8221;two&#8221; 或 &#8220;three&#8221;。</p>
<p>如要匹配其多次重复，那么整个抉择结构须置于 &#8220;\(&#8221; 和 &#8220;\)&#8221; 之间:<br />
/\(foo\|bar\)\+<br />
这个命令匹配 &#8220;foo&#8221;，&#8221;foobar&#8221;，&#8221;foofoo&#8221;，&#8221;barfoobar&#8221;，等等。</p>
<p>再举个例子:<br />
/end\(if\|while\|for\)<br />
这个命令匹配 &#8220;endif&#8221;，&#8221;endwhile&#8221; 和 &#8220;endfor&#8221;。</p>
        <div style="text-align:center;margin-top:10px;margin-bottom:15px;">
        <script type="text/javascript"><!--
        google_ad_client = "ca-pub-0297441349139103";
        /* feed_468x60 */
        google_ad_slot = "7402452313";
        google_ad_width = 468;
        google_ad_height = 60;
        //-->
        </script>
        <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
        </script></div>]]></content:encoded>
			<wfw:commentRss>http://beyondidea.cn/index.php/archives/597/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>手把手教你把Vim改装成一个IDE编程环境(图文)(转)</title>
		<link>http://beyondidea.cn/index.php/archives/596</link>
		<comments>http://beyondidea.cn/index.php/archives/596#comments</comments>
		<pubDate>Tue, 28 Dec 2010 14:54:12 +0000</pubDate>
		<dc:creator>wl1011</dc:creator>
				<category><![CDATA[vim]]></category>

		<guid isPermaLink="false">http://blog.donews.com/wl1011/?p=596</guid>
		<description><![CDATA[手把手教你把Vim改装成一个IDE编程环境(图文)(转)        <div style="text-align:center;margin-top:10px;margin-bottom:15px;">
        <script type="text/javascript"><!--
        google_ad_client = "ca-pub-0297441349139103";
        /* feed_468x60 */
        google_ad_slot = "7402452313";
        google_ad_width = 468;
        google_ad_height = 60;
        //-->
        </script>
        <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
        </script></div>]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.csdn.net/wooin/archive/2007/10/31/1858917.aspx" target="_blank">原文点击查看</a></p>
<p>	Linux下编程一直被诟病的一点是: 没有一个好用的IDE, 但是听说Linux牛人, 黑客之类的也都不用IDE. 但是对我等从Windows平台转移过来的Coder来说, 一个好用的IDE是何等的重要啊, 估计很多人就是卡在这个门槛上了, &#8220;工欲善其事, 必先利其器&#8221;嘛, 我想如果有一个很好用的IDE, 那些Linux牛人也会欢迎的. 这都是劳动人民的美好愿望罢了, 我今天教大家把gvim改装成一个简易IDE, 说它&#8221;简易&#8221;是界面上看起来&#8221;简易&#8221;, 但功能绝对不比一个好的IDE差, 该有的功能都有, 不该有的功能也有, 你就自己没事偷着乐吧, 下面我开始介绍今天的工作了.<br />
<span id="more-596"></span><br />
本文会教你:<br />
1.  中文帮助手册的安装<br />
2.  vim编程常用命令<br />
3.  语法高亮<br />
4.  在程序中跳来跳去: Ctags 的使用<br />
5.  教你高效地浏览源码 &#8212; 插件: TagList<br />
6.  文件浏览器和窗口管理器 &#8212; 插件: WinManager<br />
7.  Cscope 的使用<br />
8.  QuickFix 窗口<br />
9.  快速浏览和操作Buffer &#8212; 插件: MiniBufExplorer<br />
10.  c/h文件间相互切换 &#8212; 插件: A<br />
11. 在工程中查找 &#8212; 插件: Grep<br />
12. 高亮的书签 &#8212; 插件: VisualMark<br />
13. 自动补全<br />
14. 加速你的补全 &#8212; 插件: SuperTab</p>
<p>本文不会教你:<br />
1.  如何使用vim. 本文不会从零开始教你如何使用vim, 如果你是第一次接触vim,<br />
   建议你先看看其他的vim入门的教程, 或者在shell下输入命令: vimtutor,<br />
   这是一个简单的入门教程.<br />
2.  编程技巧.<br />
3.  vim脚本的编写.</p>
<p>我的工作环境是: Fedora Core 5<br />
gvim是自己编译的7.0, 如果你还没有安装gvim, 请看我的这篇文章<br />
由于本人一直从事C语言工作, 所以下面这些例子都是在C语言程序中演示的, 其他语言的没有试过, 如果有朋友在别的语言下有问题, 可以跟我讨论一些, 我会尽量帮助你们的.</p>
<p>本文用的示范源码是vim7.1的源码, 可以在www.vim.org下载到源码包:vim-7.1.tar.bz2, 你也可以不用下载, 就用你自己程序的源码, 关系不大的. 我把源码解压在我的home目录下: ~/vim71</p>
<p>下面对文中的一些名字定义一下:<br />
1. 文中用到的一些用括起来的符号比如, , 之类的, 你可以用下面的命令看看解释:<br />
:help keycodes<br />
2. 文中说的一些路径, 比如:<br />
  ~/.vim/plugin<br />
  ~/.vim/doc<br />
  ~/.vim/syntax<br />
  如果你没有, 就自己创建.<br />
3. 文中说到的.vimrc文件都是指 ~/.vimrc</p>
<p>先给大家看张图片, 我是vim的界面, 解解馋先^_^</p>
<p>(&#8212; 图1 &#8212;)<br />
对照上图的图标, 我在本文中将教会你以下这些功能:<br />
1<br />
	简洁明了的Buffer浏览和操作<br />
2<br />
	文件浏览器<br />
3<br />
	tag浏览器<br />
4<br />
	高亮的书签<br />
5<br />
	更丰富的语法高亮<br />
6<br />
	成员变量的下拉, 自动补全</p>
<p>2 	中文帮助手册的安装</p>
<p>	vim自带的帮助手册是英文的, 对平时编程的人来说没有多大阅读困难, 何况还有&#8221;星级译王&#8221;呢, 可偏偏有一帮人将其翻译成了中文, 可偏偏我又挡不住诱惑将它安装了, 唉&#8230;&#8230;.又痛失一个学习英文的好机会, 下不为例.<br />
大家看看我的中文帮助界面吧:</p>
<p>(&#8212; 图2 &#8212;)<br />
安装方法:<br />
在下面的网站下载中文帮助的文件包:<br />
http://vimcdoc.sf.net       (English)<br />
http://vcd.gro.clinux.org    (中文)</p>
<p>下载的文件包应该是类似这样的: vimcdoc-1.5.0.tar.gz<br />
解压后其中有个doc文件夹, 将其中的内容全部复制到~/.vim/doc, 或者vim安装目录下的doc目录中, 此时vim中的help信息已经是中文的了.<br />
注意:<br />
a. 如果无法显示中文, 在~/.vimrc中增加下面这句试试:<br />
   set helplang=cn<br />
b. 帮助文件的文本是utf-8编码的, 如果想用vim直接查看, 需要在~/.vimrc中设置:<br />
   set encoding=utf-8<br />
3<br />
	vim编程常用命令</p>
<p>	建议先看看帮助手册中的下面章节, 其中有关tags文件的部分你可以先跳过, 在后面的章节中会讲到, 到时候你在回来看看, 就觉得很简单了:<br />
:help usr_29<br />
:help usr_30<br />
下面是我常用的一些命令, 放在这里供我备忘:<br />
% 	跳转到配对的括号去<br />
[[ 	跳转到代码块的开头去(但要求代码块中'{'必须单独占一行)<br />
gD 	跳转到局部变量的定义处<br />
'' 	跳转到光标上次停靠的地方, 是两个', 而不是一个"<br />
mx 	设置书签,x只能是a-z的26个字母<br />
`x 	跳转到书签处("`"是1左边的键)<br />
&gt; 	增加缩进,"x&gt;"表示增加以下x行的缩进<br />
&lt; 	减少缩进,&quot;x配色方案"(gvim)中选择一个你满意的配色方案, 然后在~/.vimrc文件中增加下面这句:<br />
colorscheme desert<br />
desert是我喜欢的配色方案, 你可以改成你的. 如果菜单中的配色方案你还不满意(你也太花了吧), 没关系, 在 vim.org 上跟你一样的人很多, 他们做了各种各样的颜色主题, 你可以下载下来一个一个的试, 多地可以看到你眼花. 如果这样你还不满意(你还真是XXXX), 没关系, vim的作者早想到会有你这种人了, 你可以创建你自己的颜色主题, 把下面的这篇文档好好学习一些一下吧:<br />
:help syntax.txt</p>
<p>更炫的语法高亮:<br />
你可能会发现很多东西没有高亮起来, 比如运算符号, 各种括号, 函数名, 自定义类型等, 但是看上面的图片, 我的运算符号和函数名都加亮了^_^, 想知道为什么吗? 哇哈哈哈哈.... 让我来教你吧 ...</p>
<p>主要的思路是新建一个语法文件, 在文件中定义你要高亮的东东, 想高亮什么就高亮什么, 用vim就是这么自信. 所谓的语法文件就是vim用来高亮各种源文件的一个脚本, vim靠这个脚本的描述来使文件中的不同文本显示不同的颜色, 比如C语言的语法文件放在类似于这样的一个路径中:<br />
/usr/share/vim/vim64/syntax/c.vim<br />
其他语言的语法文件也可以在这个路径中找到, 你的也许不在这个路径中, 不管它, 在你自己的HOME下新建一个语法文件, 新建一个空文件:<br />
~/.vim/syntax/c.vim<br />
在其中加入</p>
<p>"========================================================<br />
" Highlight All Function<br />
"========================================================<br />
syn match   cFunction "\[^()]*)(&#8220;me=e-2<br />
syn match   cFunction &#8220;\\s*(&#8220;me=e-1<br />
hi cFunction        gui=NONE guifg=#B5A1FF</p>
<p>&#8220;========================================================<br />
&#8221; Highlight All Math Operator<br />
&#8220;========================================================<br />
&#8221; C math operators<br />
syn match       cMathOperator     display &#8220;[-+\*/%=]&#8221;<br />
&#8221; C pointer operators<br />
syn match       cPointerOperator  display &#8220;-&gt;\|\.&#8221;<br />
&#8221; C logical   operators &#8211; boolean results<br />
syn match       cLogicalOperator  display &#8220;[!]=\=&#8221;<br />
syn match       cLogicalOperator  display &#8220;==&#8221;<br />
&#8221; C bit operators<br />
syn match       cBinaryOperator   display &#8220;\(&amp;\||\|\^\|&lt;&gt;\)=\=&#8221;<br />
syn match       cBinaryOperator   display &#8220;\~&#8221;<br />
syn match       cBinaryOperatorError display &#8220;\~=&#8221;<br />
&#8221; More C logical operators &#8211; highlight in preference to binary<br />
syn match       cLogicalOperator  display &#8220;&amp;&amp;\|||&#8221;<br />
syn match       cLogicalOperatorError display &#8220;\(&amp;&amp;\|||\)=&#8221;</p>
<p>&#8221; Math Operator<br />
hi cMathOperator            guifg=#3EFFE2<br />
hi cPointerOperator         guifg=#3EFFE2<br />
hi cLogicalOperator         guifg=#3EFFE2<br />
hi cBinaryOperator          guifg=#3EFFE2<br />
hi cBinaryOperatorError     guifg=#3EFFE2<br />
hi cLogicalOperator         guifg=#3EFFE2<br />
hi cLogicalOperatorError    guifg=#3EFFE2</p>
<p>再打开你的C文件看看, 是不是又明亮了许多. 还有一个压箱底的要告诉你, 如果你自己增加了一个类型或者结构之类的, 怎么让它也象&#8221;int&#8221;, &#8220;void&#8221;这样高亮起来呢? 再在上面的文件~/.vim/syntax/c.vim中添加下面的东东:</p>
<p>&#8220;========================================================<br />
&#8221; My Own DataType<br />
&#8220;========================================================<br />
syn keyword cType       My_Type_1 My_Type_2 My_Type_3</p>
<p>这样你自己的类型My_Type_1, My_Type_2, My_Type_3就也可以向&#8221;int&#8221;一样高亮起来了, 这样的缺点是每增加一个类型, 就要手动在这里添加一下, 如果有人知道更简单的方法请一定一定要告诉我, 用下面的地址:<br />
Email<br />
	: lazy.fox.wu#gmail.com<br />
Homepage 	: http://blog.csdn.net/wooin</p>
<p>5 	在程序中跳来跳去: Ctags 的使用</p>
<p>	哇, 这下可厉害了, Tag文件(标签文件)可是程序员的看家宝呀, 你可以不用它, 但你不能不知道它, 因为Linux内核源码都提供了&#8221;make tags&#8221;这个选项. 下面我们就来介绍Tag文件.</p>
<p>tags 文件是由ctags程序产生的一个索引文件, ctags程序其是叫&#8221;Exuberant Ctags&#8221;, 是Unix上面ctags程序的替代品, 并且比它功能强大, 是大多数Linux发行版上默认的ctags程序. 那么tags文件是做什么用的呢? 如果你在读程序时看了一个函数调用, 或者一个变量, 或者一个宏等等, 你想知道它们的定义在哪儿, 怎么办呢? 用grep? 那会搜出很多不相干的地方. 现在流行用是的, 谁用谁知道呀, 当光标在某个函数或变量上时, 按下&#8221;Ctrl+]&#8221;, 光标会自动跳转到其定义处, 够厉害吧, 你不用再羡慕Visual Studio的程序员了, 开始羡慕我吧~_~.</p>
<p>你现在先别急着去按, 你按没用的, 要不要我干什么呀, 你现在要做的是查查你电脑里有没有ctags这个程序, 如果有, 是什么版本的, 如果是Ctags 5.5.4, 就象我一样, 你最好去装一个Ctags 5.6, 这个在后面的自动补全章节中会用到. 在这个网站: http://ctags.sourceforge.net, 下载一个类似 ctags-5.6.tar.gz 的文件下来(现在好像5.7版的也出来了, 不过我还没用过):</p>
<p>用下面的命令解压安装:<br />
$ tar -xzvf ctags-5.6.tar.gz<br />
$ cd ctags-5.6<br />
$ make<br />
# make install   // 需要root权限</p>
<p>然后去你的源码目录, 如果你的源码是多层的目录, 就去最上层的目录, 在该目录下运行命令: ctags -R<br />
我现在以 vim71 的源码目录做演示<br />
$ cd /home/wooin/vim71<br />
$ ctags -R<br />
此时在/home/wooin/vim71目录下会生成一个 tags 文件, 现在用vim打开 /home/wooin/vim71/src/main.c<br />
$ vim /home/wooin/vim71/src/main.c<br />
再在vim中运行命令:<br />
:set tags=/home/wooin/vim71/tags<br />
该命令将tags文件加入到vim中来, 你也可以将这句话放到~/.vimrc中去, 如果你经常在这个工程编程的话.<br />
下面要开始真刀实枪的开干了, 如下图, 将光标放在setmouse()函数上</p>
<p>(&#8212; 图3 &#8212;)</p>
<p>此时按下, 光标会自动跳到setmouse()函数的定义处, 见下图:</p>
<p>(&#8212; 图4 &#8212;)</p>
<p>如果此时你还想再跳回刚才的位置, 你还可以按, 这样又跳回到setmouse()函数被调用的地方了, 变量, 结构, 宏, 等等, 都可以的, 赶快试试吧&#8230;..</p>
<p>此时在回头学习一下第3节中说的vim手册吧<br />
:help usr_29</p>
<p>不过还有一个小瑕疵, 你修改程序后, 比如增加了函数定义, 删除了变量定义, tags文件不能自动rebuild, 你必须手动再运行一下命令:<br />
$ ctags -R<br />
使tags文件更新一下, 不过让人感到欣慰的是vim不用重新启动, 正在编写的程序也不用退出, 马上就可以又正确使用和了. 如果有人知道更简单的方法请一定一定要告诉我, 用下面的地址:<br />
Email<br />
	: lazy.fox.wu#gmail.com<br />
Homepage 	: http://blog.csdn.net/wooin</p>
<p>6.<br />
	教你高效地浏览源码 &#8212; 插件: TagList</p>
<p>下载地址 	http://www.vim.org/scripts/script.php?script_id=273<br />
版本 	4.4<br />
安装 	在 ~/.vim 目录下解压taglist_xx.zip<br />
手册 	:help taglist.txt</p>
<p>在Windows平台上用过 Source Insight看程序的人肯定很熟悉代码窗口左边那个Symbol窗口, 那里面列出了当前文件中的所有宏, 全局变量, 函数名等, 在查看代码时用这个窗口总揽全局, 切换位置相当方便, 今天告诉你一个vim的插件: Taglist, 可以同样实现这个功能.</p>
<p>上一节已经告诉你ctags的用法了, ctags的基本原理是将程序程序中的一些关键字(比如:函数名, 变量名等)的名字, 位置等信息通过一个窗口告诉你, 如果你已经安装好taglist, 则可以用下面的命令看看taglist自带的帮助文件:<br />
:help taglist.txt<br />
下面是我翻译的其中的第一段&#8221;Overview&#8221;, 供大家现了解一下taglist, 翻译的不好, 请指教:<br />
&#8220;Tab List&#8221;是一个用来浏览源代码的Vim插件, 这个插件可以让你高效地浏览各种不同语言编写的的源代码, &#8220;Tag List&#8221;有以下一些特点:<br />
    * 在Vim的一个垂直或水平的分割窗口中显示一个文件中定义的tags(函数, 类, 结构,<br />
      变量, 等)<br />
    * 在GUI Vim中, 可以选择把tags显示在下拉菜单和弹出菜单中<br />
    * 当你在多个源文件/缓冲区间切换时, taglist窗口会自动进行相应地更新.<br />
      当你打开新文件时, 新文件中定义的tags会被添加到已经存在的文件列表中,<br />
      并且所有文件中定义的tags会以文件名来分组显示<br />
    * 当你在taglist窗口中选中一个tag名时, 源文件中的光标会自动跳转到该tag的定<br />
      义处<br />
    * 自动高亮当前的tag名<br />
    * 按类型分组各tag, 并且将各组显示在一个可折叠的树形结构中<br />
    * 可以显示tag的原始类型和作用域<br />
    * 在taglist窗口可选择显示tag的原始类型替代tag名<br />
    * tag列表可以按照tag名, 或者时间进行排序<br />
    * 支持以下语言的源文件: Assembly, ASP, Awk, Beta, C,<br />
      C++, C#, Cobol, Eiffel, Erlang, Fortran, HTML, Java, Javascript, Lisp,<br />
      Lua, Make, Pascal, Perl, PHP, Python, Rexx, Ruby, Scheme, Shell, Slang,<br />
      SML, Sql, TCL, Verilog, Vim and Yacc.<br />
    * 可以很简单的扩展支持新的语言. 对新语言支持的修改也很简单.<br />
    * 提供了一些函数, 可以用来在Vim的状态栏或者在窗口的标题栏显示当前的tag名<br />
    * taglist中的文件和tags的列表可以在被保存和在vim会话间加载<br />
    * 提供了一些用来取得tag名和原始类型的命令<br />
    * 在控制台vim和GUI vim中都可以使用<br />
    * 可以和winmanager插件一起使用. winmanager插件可以让你同时使用文件浏览器,<br />
      缓冲区浏览器和taglist插件, 就像一个IDE一样.<br />
    * 可以在Unix和MS-Windows系统中使用</p>
<p>首先请先在你的~/.vimrc文件中添加下面两句:<br />
let Tlist_Show_One_File=1<br />
let Tlist_Exit_OnlyWindow=1<br />
此时用vim打开一个c源文件试试:<br />
$ vim ~/vim/src/main.c<br />
进入vim后用下面的命令打开taglist窗口, 如图5:<br />
:Tlist</p>
<p>(&#8212; 图5 &#8212;)<br />
左边的窗口就是前面介绍的TagList窗口, 其中列出了main.c文件中的tag, 并且按照&#8221;typedef&#8221;, &#8220;variable&#8221;, &#8220;function&#8221;等进行了分类. 将光标移到VimMain上, 如图中左边红色的方框, 按下回车后, 源程序会自动跳转到VimMain的定义处, 如图中右边的红色方框. 这就是TagList最基本也是最常用的操作. 再教你一个常用的操作, 你在浏览TagList窗口时, 如果还不想让源码跳转, 但是想看看tag在源码中完整的表达, 可以将光标移到你想要看的tag上, 如图中上边黄色的方框, 然后按下空格键, 在下面的命令栏中, 如图下边黄色的方框, 会显示该tag在源码中完整的写法, 而不会跳转到源码处.</p>
<p>TagList插件我就介绍到这里, 其实它还有很多用法和设置, 我没法一一地教你了, 好在TagList有一份详细的帮助手册, 用下面的命令打开手册, 好好学习一下吧:<br />
:help taglist.txt</p>
<p>7.<br />
	文件浏览器和窗口管理器 &#8212; 插件: WinManager</p>
<p>下载地址 	http://www.vim.org/scripts/script.php?script_id=95<br />
版本 	2.x<br />
安装 	在 ~/.vim 目录下解压winmanager.zip<br />
手册 	:help winmanager</p>
<p>在图1中大家可以看到在图标2标识的地方是一个文件浏览器, 里面列出了当前目录中的文件, 可以通过这个浏览器来浏览工程中的源文件, 是不是越来越像常见的IDE了, 当光标停在某个文件或文件夹的时候, 按下回车, 可以打开该文件或文件夹.<br />
这个东东是怎么调出来的呢? 其实这个也是由插件实现的, 这个插件是netrw.vim, 只不过你不用下载和安装, 这个插件已经是标准的vim插件, 已经随vim一起安装进你的系统里了, 现在先简单演示一下, 进入&#8221;~/vim71&#8243;文件夹后运行vim, 然后在vim中运行命令:<br />
:e ~/vim71<br />
你将在vim看到如下图所示的界面:</p>
<p>(&#8212; 图6 &#8212;)<br />
在该界面上你可以用下面的一些命令来进行常用的目录和文件操作:<br />
 	显示帮助<br />
 	如果光标下是目录, 则进入该目录; 如果光标下文件, 则打开该文件<br />
-<br />
	返回上级目录<br />
c<br />
	切换vim 当前工作目录正在浏览的目录<br />
d<br />
	创建目录<br />
D<br />
	删除目录或文件<br />
i<br />
	切换显示方式<br />
R<br />
	文件或目录重命名<br />
s<br />
	选择排序方式<br />
x<br />
	定制浏览方式, 使用你指定的程序打开该文件</p>
<p>我这里不是教你怎么用netrw.vim插件, 而是要教你通过WinManager插件来将TagList窗口和netrw窗口整合起来, 就像图1中的图标2和3组成的那个效果<br />
现在在你的~/.vimrc中增加下面两句<br />
let g:winManagerWindowLayout=&#8217;FileExplorer|TagList&#8217;<br />
nmap wm :WMToggle<br />
然后重启vim, 打开~/vim71/src/main.c, 在normal状态下输入&#8221;wm&#8221;, 你将看到图7的样子:</p>
<p>(&#8212; 图7 &#8212;)<br />
其中左上边是netrw窗口, 左下边是TagList窗口, 当再次输入&#8221;wm&#8221;命令时这两个窗口又关闭了.</p>
<p>WinManager的功能主要就是我介绍的这些, 但是它还有其他一些高级功能, 还可以支持其他几个插件, 如果你觉得我介绍的还不够你用, 建议你把它的帮助手册好好研究一下, 用下面的命令可以调出帮助手册:<br />
:help winmanager</p>
<p>8. 	Cscope 的使用</p>
<p>	这下更厉害了, 用Cscope自己的话说 &#8211; &#8220;你可以把它当做是超过频的ctags&#8221;, 其功能和强大程度可见一斑吧, 关于它的介绍我就不详细说了, 如果你安装好了前文介绍的中文帮助手册, 用下面的命令看看介绍吧:<br />
:help if_cscop.txt<br />
我在这里简单摘抄一点, 供还在犹豫的朋友看看:<br />
Cscope 是一个交互式的屏幕下使用的工具，用来帮助你:<br />
* 无须在厚厚的程序清单中翻来翻去就可以认识一个 C 程序的工作原理。<br />
* 无须熟悉整个程序就可以知道清楚程序 bug 所要修改的代码位置。<br />
* 检查提议的改动 (如添加一个枚举值) 可能会产生的效果。<br />
* 验证所有的源文件都已经作了需要的修改；例如给某一个现存的函数添加一个参数。<br />
* 在所有相关的源文件中对一个全局变量改名。<br />
* 在所有相关的位置将一个常数改为一个预处理符号。</p>
<p>它被设计用来回答以下的问题:<br />
* 什么地方用到了这个符号？<br />
* 这是在什么地方定义的？<br />
* 这个变量在哪里被赋值？<br />
* 这个全局符号的定义在哪里？<br />
* 这个函数在源文件中的哪个地方？<br />
* 哪些函数调用了这个函数？<br />
* 这个函数调用了哪些函数？<br />
* 信息 &#8220;out of space&#8221; 从哪来？<br />
* 这个源文件在整个目录结构中处于什么位置？<br />
* 哪些文件包含这个头文件？</p>
<p>安装Cscope:<br />
如果你的系统中有cscope命令, 则可以跳过这一小段, 如果没有, 就先跟着我一起安装一个吧.<br />
在Cscope的主页: http://cscope.sourceforge.net 下载一个源码包, 解压后编译安装:<br />
# ./configure<br />
# make<br />
# make install       // 需要root权限</p>
<p>先在~/vimrc中增加一句:<br />
:set cscopequickfix=s-,c-,d-,i-,t-,e-<br />
这个是设定是否使用 quickfix 窗口来显示 cscope 结果, 用法在后面会说到。</p>
<p>跟Ctags一样, 要使用其功能必须先为你的代码生成一个cscope的数据库, 在项目的根目录运行下面的命令:<br />
$ cd /home/wooin/vim71/<br />
$ cscope -Rbq<br />
# 此后会生成三个文件<br />
$ ll cscope.*<br />
-rw-rw-r&#8211; 1 wooin wooin 1.1M 2007-09-30 10:56 cscope.in.out<br />
-rw-rw-r&#8211; 1 wooin wooin 6.7M 2007-09-30 10:56 cscope.out<br />
-rw-rw-r&#8211; 1 wooin wooin 5.1M 2007-09-30 10:56 cscope.po.out<br />
# 打开文件, 开始Coding<br />
$ cd src<br />
$ vi main.c<br />
进入vim后第一件事是要把刚才生成的cscope文件导入到vim中来, 用下面的命令:<br />
:cs add /home/wooin/vim71/cscope.out /home/wooin/vim71<br />
上面这条命令很重要, 必须写全, 不能只写前半句:<br />
:cs add /home/wooin/vim71/cscope.out<br />
因为源码是多级目录的, 如果这样写, cscope是无法在子目录中的源码中工作的, 当然, 如果你的源码都在同一级目录中就无所谓了. 如果你要经常用cscope的话, 可以把上面那句加到~/.vimrc中去.</p>
<p>下面我们来操练一下, 查找函数vim_strsave()的定义, 用命令:<br />
:cs find g vim_strsave<br />
如下图:</p>
<p>(&#8212; 图8 &#8212;)<br />
按下回车后会自动跳转到vim_strsave()的定义处. 此时你肯定会说Ctags也可以做到这个呀, 那么下面说的这个Ctags就无法做到了, 我想查找vim_strsave()到底在那些地方被调用过了, 用命令:<br />
:cs find c vim_strsave<br />
按下回车后vim会自动跳转到第一个符合要求的地方, 并且在命令栏显示有多少符合要求的结果, 如图:</p>
<p>(&#8212; 图9 &#8212;)<br />
如果自动跳转的位置你不满意, 想看其他的结果, 可以用下面的命令打开QuickFix窗口:<br />
:cw<br />
如图:</p>
<p>(&#8212; 图10 &#8212;)<br />
这时你就可以慢慢挑选了^_^</p>
<p>cscope的主要功能是通过同的子命令&#8221;find&#8221;来实现的<br />
&#8220;cscope find&#8221;的用法:<br />
cs find c|d|e|f|g|i|s|t name<br />
0 或 s 	查找本 C 符号(可以跳过注释)<br />
1 或 g 	查找本定义<br />
2 或 d 	查找本函数调用的函数<br />
3 或 c 	查找调用本函数的函数<br />
4 或 t 	查找本字符串<br />
6 或 e 	查找本 egrep 模式<br />
7 或 f 	查找本文件<br />
8 或 i 	查找包含本文件的文件</p>
<p>如果每次查找都要输入一长串命令的话还真是件讨人厌的事情, Cscope的帮助手册中推荐了一些快捷键的用法, 下面是其中一组, 也是我用的, 将下面的内容添加到~/.vimrc中, 并重启vim:<br />
nmap s :cs find s =expand(&#8220;&#8221;)<br />
nmap g :cs find g =expand(&#8220;&#8221;)<br />
nmap c :cs find c =expand(&#8220;&#8221;)<br />
nmap t :cs find t =expand(&#8220;&#8221;)<br />
nmap e :cs find e =expand(&#8220;&#8221;)<br />
nmap f :cs find f =expand(&#8220;&#8221;)<br />
nmap i :cs find i ^=expand(&#8220;&#8221;)$<br />
nmap d :cs find d =expand(&#8220;&#8221;)<br />
当光标停在某个你要查找的词上时, 按下g, 就是查找该对象的定义, 其他的同理.<br />
按这种组合键有一点技巧,按了后要马上按下一个键,否则屏幕一闪就回到nomal状态了<br />
g的按法是先按&#8221;Ctrl+Shift+-&#8221;, 然后很快再按&#8221;g&#8221;</p>
<p>很奇怪, 其中的这句:<br />
nmap i :cs find i ^=expand(&#8220;&#8221;)$<br />
在我的vim中无法工作, 但是我改成:<br />
nmap i :cs find i =expand(&#8220;&#8221;)<br />
就可以正常工作了, 不知道是什么原因? 有哪位朋友知道请告诉我.</p>
<p>cscope的其他功能你可以通过帮助手册自己慢慢学习</p>
<p>reset : 重新初始化所有连接。<br />
用法  : cs reset</p>
<p>9.<br />
	QuickFix 窗口</p>
<p>	在上一节的图10中大家可以看到在窗口下面有一个显示查询结果的窗口, 这个窗口中列出了查询命令的查询结果, 用户可以从这个窗口中选择每个结果进行查看, 这个窗口叫&#8221;QuickFix&#8221;窗口, 以前也是一个vim的插件来的, 只不过现在成了vim的标准插件, 不用你在去安装了, QuickFix窗口的主要作用就是上面看到的那个功能: 输出一些供选择的结果, 可以被很多命令调用, 更详细的介绍和使用方法请用下面的命令打开QuickFix的手册来学习吧:<br />
:help quickfix<br />
这里我一个常用的例子来再介绍一种QuickFix窗口的使用方法. 这个例子是要模仿平时我们编程时, 当编译出错时, QuickFix会把出错的信息列出来, 供我们一条条地查看和修改. 首先还是用vim打开~/vim71/src/main.c, 事先最好先编译过vim71, 否则一会儿编译的时候有点慢, 或者你也可以自己写一个小的有错误的程序来跟着我做下面的步骤, 见下图:</p>
<p>(&#8212; 图11 &#8212;)<br />
我们修改一下main.c, 人为地造成几处错误, 在第1019行增加了一个baobao_wu的没有任何定义的字符串, 删除了第1020行最后的一个括号&#8221;)&#8221;, 然后用下面的命令进行编译:<br />
:make<br />
显然编译会报很多错误, 当编译结束并退出到源码界面时, 刚才编译器报的错误都已经看不到了, 但是我们可以用QuickFix窗口再将错误信息找出来, 用下面的命令调出QuickFix窗口:<br />
:cw<br />
此时你就可以看如下图所示的QuickFix窗口了:</p>
<p>(&#8212; 图12 &#8212;)<br />
在下面的QuickFix窗口中我们可以找到每一个编译错误, 同样你可以用鼠标点击每一条记录, 代码会马上自动跳转到错误处, 你还可以用下面的命令来跳转:<br />
:cn        // 切换到下一个结果<br />
:cp        // 切换到上一个结果<br />
如果你经常使用这两个命令, 你还可以给他们设定快捷键, 比如在~/.vimrc中增加:<br />
nmap  :cn<br />
nmap  :cp</p>
<p>其还有其他的命令/插件也会用到QuickFix窗口, 但是用法基本上的都是类似的, 本文后面还会用到QuickFix窗口, 接着往下看吧.<br />
10.<br />
	快速浏览和操作Buffer &#8212; 插件: MiniBufExplorer</p>
<p>下载地址 	http://www.vim.org/scripts/script.php?script_id=159<br />
版本 	6.3.2<br />
安装 	将下载的 minibufexpl.vim文件丢到 ~/.vim/plugin 文件夹中即可<br />
手册<br />
	在minibufexpl.vim 文件的头部</p>
<p>在编程的时候不可能永远只编辑一个文件, 你肯定会打开很多源文件进行编辑, 如果每个文件都打开一个vim进行编辑的话那操作起来将是多麻烦啊, 所以vim有buffer(缓冲区)的概念, 可以看vim的帮助:<br />
:help buffer<br />
vim自带的buffer管理工具只有:ls, :bnext, :bdelete 等的命令, 既不好用, 又不直观. 现在隆重向你推荐一款vim插件(plugin): MiniBufExplorer</p>
<p>使用方法:<br />
重新启动vim, 当你只编辑一个buffer的时候MiniBufExplorer派不上用场, 当你打开第二个buffer的时候, MiniBufExplorer窗口就自动弹出来了, 见下图:</p>
<p>(&#8212; 图13 &#8212;)<br />
上面那个狭长的窗口就是MiniBufExplorer窗口, 其中列出了当前所有已经打开的buffer, 当你把光标置于这个窗口时, 有下面几个快捷键可以用:<br />
 	向前循环切换到每个buffer名上<br />
&gt;S&lt; 	向后循环切换到每个buffer名上<br />
 	在打开光标所在的buffer<br />
d 	删除光标所在的buffer</p>
<p>以下的两个功能需要在~/.vimrc中增加:<br />
let g:miniBufExplMapCTabSwitchBufs = 1</p>
<p> 	向前循环切换到每个buffer上,并在但前窗口打开<br />
 	向后循环切换到每个buffer上,并在但前窗口打开</p>
<p>如果在~/.vimrc中设置了下面这句:<br />
let g:miniBufExplMapWindowNavVim = 1<br />
则可以用切换到上下左右的窗口中去,就像:<br />
C-w,h j k l    向&#8221;左,下,上,右&#8221;切换窗口.<br />
在~/.vimrc中设置:<br />
let g:miniBufExplMapWindowNavArrows = 1<br />
是用切换到上下左右窗口中去<br />
11. 	c/h文件间相互切换 &#8212; 插件: A</p>
<p>下载地址 	http://www.vim.org/scripts/script.php?script_id=31<br />
版本</p>
<p>安装<br />
	将a.vim 放到 ~/.vim/plugin 文件夹中<br />
手册<br />
	无</p>
<p>下面介绍它的用法:<br />
作为一个C程序员, 日常Coding时在源文件与头文件间进行切换是再平常不过的事了, 直接用vim打开其源/头文件其实也不是什么麻烦事, 但是只用一个按键就切换过来了, 这是多么贴心的功能啊&#8230;.<br />
安装好a.vim后有下面的几个命令可以用了:<br />
:A 	在新Buffer中切换到c\h文件<br />
:AS 	横向分割窗口并打开c\h文件<br />
:AV 	纵向分割窗口并打开c\h文件<br />
:AT 	新建一个标签页并打开c\h文件<br />
其他还有一些命令, 你可以在它的网页上看看, 我都没用过, 其实也都是大同小异, 找到自己最顺手的就行了.</p>
<p>我在~/.vimrc中增加了一句:<br />
nnoremap   :A<br />
意思是按F12时在一个新的buffer中打开c\h文件, 这样在写程序的时候就可以不假思索地在c/h文件间进行切换, 减少了按键的次数, 思路也就更流畅了, 阿弥陀佛&#8230;.<br />
12. 	在工程中查找 &#8212; 插件: Grep</p>
<p>下载地址 	http://www.vim.org/scripts/script.php?script_id=311<br />
版本 	1.8<br />
安装 	把grep.vim 文件丢到 ~/.vim/plugin 文件夹就好了<br />
手册<br />
	在grep.vim 文件头部</p>
<p>下面介绍它的用法:<br />
vim 有自己的查找功能, 但是跟shell中的grep比起来还是有些差距的, 有时Coding正火急火燎的时候, 真想按下F3, 对光标所在的词来个全工程范围的grep, 不用敲那些繁琐的命令, 现在福音来了, 跟我同样懒的人不在少数, 在grep.vim脚本的前部可以找到一些说明文档:<br />
:Grep 	按照指定的规则在指定的文件中查找<br />
:Rgrep 	同上, 但是是递归的grep<br />
:GrepBuffer 	在所有打开的缓冲区中查找<br />
:Bgrep 	同上<br />
:GrepArgs 	在vim的argument filenames (:args)中查找<br />
:Fgrep 	运行fgrep<br />
:Rfgrep 	运行递归的fgrep<br />
:Egrep 	运行egrep<br />
:Regrep 	运行递归的egrep<br />
:Agrep 	运行agrep<br />
:Ragrep 	运行递归的agrep</p>
<p>上面的命令是类似这样调用的:<br />
:Grep   [] [ []]<br />
:Rgrep  [] [ []]<br />
:Fgrep  [] [ []]<br />
:Rfgrep [] [ []]<br />
:Egrep  [] [ []]<br />
:Regrep [] [ []]<br />
:Agrep  [] [ []]<br />
:Ragrep [] [ []]<br />
:GrepBuffer [] []<br />
:Bgrep [] []<br />
:GrepArgs [] []</p>
<p>但是我从来都不用敲上面那些命令的^_^, 因为我在~/.vimrc中增加了下面这句:<br />
nnoremap   :Grep<br />
比如你想在/home/wooin/vim71/src/main.c中查找&#8221;FEAT_QUICKFIX&#8221;, 则将光标移到&#8221;FEAT_QUICKFIX&#8221;上, 然后按下F3键, 如下图:</p>
<p>(&#8212; 图14 &#8212;)<br />
在最下面的命令行会显示:<br />
Search for pattern: FEAT_QUICKFIX<br />
此时你还可以编辑该行, grep支持正则表达式, 你想全词匹配的话可以改成:<br />
Search for pattern: \<br />
然后按下回车:</p>
<p>(&#8212; 图15 &#8212;)<br />
在最下面的命令行会显示:<br />
Search in files: *<br />
是问你搜索范围, 默认是该目录下的所有文件, 此时你还可以编辑该行, 比如你只想搜索源码文件:<br />
Search in files: *.c *.h<br />
然后在按下回车, 会在弹出的QuickFix窗口中列出所有符合条件的搜索结果, 你可以在其中查找你想要的结果, 如下图:</p>
<p>(&#8212; 图16 &#8212;)</p>
<p>其实还有一些其他功能和设置, 但是我都没有用过, 这些功能再加上正则表达式, 已经够我用了, 其他的你可以在网页上看看它的文档, 如果有什么惊人发现记得跟我互通有无, 共同进步哦&#8230;.<br />
13.<br />
	高亮的书签 &#8212; 插件: VisualMark</p>
<p>下载地址 	http://www.vim.org/scripts/script.php?script_id=1026<br />
版本</p>
<p>安装 	把visualmark.vim 文件丢到 ~/.vim/plugin 文件夹就好了<br />
手册<br />
	无</p>
<p>下面介绍它的用法:<br />
vim也和其他编辑器一样有&#8221;书签&#8221;概念, 在vim中叫&#8221;Mark&#8221;, 可以用下面的命令查看相关说明:<br />
:help Mark<br />
该&#8221;书签&#8221;有个很很大的缺点: 不可见.<br />
我下面要介绍的Visual Mark插件跟vim中的&#8221;Mark&#8221;没有什么关系, 并不是使其可见, 而是自己本身就是&#8221;可见的书签&#8221;, 接着往下看就明白了, 用作者的话说就是&#8221;类似UltraEdit中的书签&#8221;.<br />
另外, 网上也有使vim中的Mark可见的插件, 但是我试了一下, 好像没Visual Mark好用, 我就不介绍了.</p>
<p>按照上面的方法安装好Visual Mark后, 你什么也不用设置, 如果是gvim, 直接在代码上按下Ctrl+F2, 如果是vim, 用&#8221;mm&#8221;, 怎么样, 发现光标所在的行变高亮了吧, 见下图:</p>
<p>(&#8212; 图17 &#8212;)<br />
如果你设置了多个书签, 你可以用F2键正向在期间切换, 用Shift+F2反向在期间切换.<br />
好了, 我Visual Mark介绍完了, 够简单吧^_^.</p>
<p>如果你嫌书签的颜色不好看, 你还可以自己定义, 不过是修改这个插件脚本的的源码, 在目录~/.vim/plugin/中找到并打开visualmark.vim, 找到下面这段代码:<br />
if &amp;bg == &#8220;dark&#8221;  // 根据你的背景色风格来设置不同的书签颜色<br />
 highlight SignColor ctermfg=white ctermbg=blue guifg=wheat guibg=peru<br />
else             // 主要就是修改guibg的值来设置书签的颜色<br />
 highlight SignColor ctermbg=white ctermfg=blue guibg=grey guifg=RoyalBlue3<br />
endif</p>
<p>我还有几个不满意的地方:<br />
1 这个书签不能自动保存, 关闭vim就没了.<br />
2 切换书签时不能在不同文件间切换, 只能在同一个文件中切换</p>
<p>如果哪位朋友能解决这两个问题, 请一定要告诉寡人啊&#8230;.还是用下面的地址:<br />
Email<br />
	: lazy.fox.wu#gmail.com<br />
Homepage 	: http://blog.csdn.net/wooin</p>
<p>14.<br />
	自动补全</p>
<p>	用过Microsoft Visual Studio的朋友一定知道代码补全功能, 输入一个对象名后再输入&#8221;.&#8221;或者&#8221;-&gt;&#8221;, 则其成员名都可以列出来, 使Coding流畅了许多, 实现很多懒人的梦想, 现在我要告诉你, 这不再是Microsoft Visual Studio的专利了, vim也可以做到! 下面由我来教你, 该功能要tags文件的支持, 并且是ctags 5.6版本, 可以看看前文介绍tags文件的章节.</p>
<p>我这里要介绍的功能叫&#8221;new-omni-completion(全能补全)&#8221;, 你可以用下面的命令看看介绍:<br />
:help new-omni-completion</p>
<p>你还需要在~/.vimrc文件中增加下面两句:<br />
filetype plugin indent on<br />
打开文件类型检测, 加了这句才可以用智能补全<br />
set completeopt=longest,menu<br />
关掉智能补全时的预览窗口</p>
<p>请确定你的Ctags 5.6已经安装好, 并且生成的tags文件已经可以用了, 那么我们就要抄家伙开搞了.<br />
用vim打开源文件<br />
$ vi /home/wooin/vim71/src/main.c<br />
设置tags文件<br />
:set tags=/home/wooin/vim71/tags<br />
随便找一个有成员变量的对象, 比如&#8221;parmp&#8221;, 进入Insert模式, 将光标放在&#8221;-&gt;&#8221;后面,<br />
然后按下&#8221;Ctrl+X Ctrl+O&#8221;, 此时会弹出一个下列菜单, 显示所有匹配的标签, 如下图:</p>
<p>(&#8212; 图18 &#8212;)<br />
此时有一些快捷键可以用:<br />
Ctrl+P 	向前切换成员<br />
Ctrl+N 	向后切换成员<br />
Ctrl+E 	表示退出下拉窗口, 并退回到原来录入的文字<br />
Ctrl+Y 	表示退出下拉窗口, 并接受当前选项</p>
<p>如果你增加了一些成员变量, 全能补全还不能马上将新成员补全, 需要你重新生成一下tags文件, 但是你不用重启vim, 只是重新生成一下tags文件就行了, 这时全能补全已经可以自动补全了, 还真够&#8221;全能&#8221;吧.</p>
<p>vim中的其他补全方式还有:<br />
Ctrl+X Ctrl+L<br />
	整行补全<br />
Ctrl+X Ctrl+N 	根据当前文件里关键字补全<br />
Ctrl+X Ctrl+K 	根据字典补全<br />
Ctrl+X Ctrl+T 	根据同义词字典补全<br />
Ctrl+X Ctrl+I 	根据头文件内关键字补全<br />
Ctrl+X Ctrl+] 	根据标签补全<br />
Ctrl+X Ctrl+F 	补全文件名<br />
Ctrl+X Ctrl+D 	补全宏定义<br />
Ctrl+X Ctrl+V 	补全vim命令<br />
Ctrl+X Ctrl+U 	用户自定义补全方式<br />
Ctrl+X Ctrl+S 	拼写建议</p>
<p>15.<br />
	加速你的补全 &#8212; 插件: SuperTab</p>
<p>下载地址 	http://www.vim.org/scripts/script.php?script_id=1643<br />
版本 	0.43<br />
安装 	把supertab.vim 文件丢到 ~/.vim/plugin 文件夹就好了<br />
手册<br />
	supertab.vim 文件头部, 和命令 &#8220;:SuperTabHelp&#8221;</p>
<p>在上面一节中你应该学会了自动补全代码的功能, 按下&#8221;Ctrl+X Ctrl+O&#8221;就搞定了, 如果你够懒的话肯定会说&#8221;这么麻烦啊, 居然要按四个键&#8221;, 不必为此自责, 因为Gergely Kontra 和 Eric Van Dewoestine也跟你差不多, 只不过人家开发了supertab.vim这个插件, 可以永远懒下去了, 下面我来教你偷懒吧.</p>
<p>在你的~/.vimrc文件中加上这两句:<br />
let g:SuperTabRetainCompletionType=2<br />
let g:SuperTabDefaultCompletionType=&#8221;"<br />
以后当你准备按&#8221;Ctrl+X Ctrl+O&#8221;的时候直接按就好了, 够爽吧 &#8230;.</p>
<p>我稍微再介绍一下上面那两句配置信息:<br />
let g:SuperTabDefaultCompletionType=&#8221;"<br />
&#8221; 设置按下后默认的补全方式, 默认是,<br />
&#8221; 现在改为. 关于的补全方式,<br />
&#8221; 还有其他的补全方式, 你可以看看下面的一些帮助:<br />
&#8221; :help ins-completion<br />
&#8221; :help compl-omni</p>
<p>let g:SuperTabRetainCompletionType=2<br />
&#8221; 0 &#8211; 不记录上次的补全方式<br />
&#8221; 1 &#8211; 记住上次的补全方式,直到用其他的补全命令改变它<br />
&#8221; 2 &#8211; 记住上次的补全方式,直到按ESC退出插入模式为止</p>
<p>问题:<br />
但是现在我的键不好用了, 我以前爱用进行缩进, 如果前面有字符按下键后就会进行补全, 而不是我想要的缩进功能, 不知道有没有快捷键可以暂时关闭和激活SuperTab键的功能. 如果哪位朋友知道, 请一定记得告诉我啊&#8230;.还是用下面的地址:<br />
Email<br />
	: lazy.fox.wu#gmail.com<br />
Homepage 	: http://blog.csdn.net/wooin</p>
        <div style="text-align:center;margin-top:10px;margin-bottom:15px;">
        <script type="text/javascript"><!--
        google_ad_client = "ca-pub-0297441349139103";
        /* feed_468x60 */
        google_ad_slot = "7402452313";
        google_ad_width = 468;
        google_ad_height = 60;
        //-->
        </script>
        <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
        </script></div>]]></content:encoded>
			<wfw:commentRss>http://beyondidea.cn/index.php/archives/596/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>vim 常用插件推荐</title>
		<link>http://beyondidea.cn/index.php/archives/594</link>
		<comments>http://beyondidea.cn/index.php/archives/594#comments</comments>
		<pubDate>Tue, 28 Dec 2010 12:21:33 +0000</pubDate>
		<dc:creator>wl1011</dc:creator>
				<category><![CDATA[vim]]></category>

		<guid isPermaLink="false">http://blog.donews.com/wl1011/?p=594</guid>
		<description><![CDATA[1 程序设计 1.1 Tag List 下载地址： 官方站点 官方描述： The “Tag List” plugin is a source code browser plugin for Vim and provides an overview of the structure of source code files and allows you to efficiently browse through source code files for different programming languages. 滇狐评价： 这是一个非常非常非常非常重要的插件， 有了它， 我们才能够在 VIM 中查看一个文件中包含的函数列表， 或是一个类包含的方法列表， 为编程人员提供了极大方便。 推荐大家一定要安装！ 安装注意事项： [...]        <div style="text-align:center;margin-top:10px;margin-bottom:15px;">
        <script type="text/javascript"><!--
        google_ad_client = "ca-pub-0297441349139103";
        /* feed_468x60 */
        google_ad_slot = "7402452313";
        google_ad_width = 468;
        google_ad_height = 60;
        //-->
        </script>
        <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
        </script></div>]]></description>
			<content:encoded><![CDATA[<p>1 程序设计</p>
<p>1.1 Tag List</p>
<p>下载地址： 官方站点</p>
<p>官方描述： The “Tag List” plugin is a source code browser plugin for Vim and provides an overview of the structure of source code files and allows you to efficiently browse through source code files for different programming languages.</p>
<p>滇狐评价： 这是一个非常非常非常非常重要的插件， 有了它， 我们才能够在 VIM 中查看一个文件中包含的函数列表， 或是一个类包含的方法列表， 为编程人员提供了极大方便。 推荐大家一定要安装！</p>
<p>安装注意事项： 有的系统内置的 ctags 功能太弱， 推荐大家安装 EXUBERANT CTAGS， 这个东西功能比较强大， 居然连 HTML 里面内嵌的 Java Script 都能够支持， 实在是匪疑所思！</p>
<p>滇狐个人习惯： 滇狐习惯把方法列表放在屏幕的右侧， 于是在 .vimrc 中设置了</p>
<p>let Tlist_Use_Right_Window=1<br />
另外， 滇狐习惯让当前不被编辑的文件的方法列表自动折叠起来， 这样可以节约一些屏幕空间， 于是在 .vimrc 中设置了</p>
<p>let Tlist_File_Fold_Auto_Close=1。<br />
1.2 A</p>
<p>下载地址： 官方站点</p>
<p>官方描述：</p>
<p>A few of quick commands to swtich between source files and header files quickly.</p>
<p>:A switches to the header file corresponding to the current file being edited (or vise versa)</p>
<p>:AS splits and switches</p>
<p>:AV vertical splits and switches</p>
<p>E.g. if you are editing foo.c and need to edit foo.h simply execute :A and you will be editting foo.h, to switch back to foo.c execute :A again.</p>
<p>滇狐评价： 第一眼看到这个东西时， 总觉得它功能太简单， 似乎没有什么用处。 用过之后， 才发现这项功能对于一个程序员来说是如何重要！</p>
<p>1.3 Win Manager</p>
<p>下载地址： 官方站点</p>
<p>官方描述： winmanager is a plugin which implements a classical windows type IDE in Vim-6.0. Basically, you have the directory tree and the buffer list as 2 windows which stay on the left and the editing is done in a seperate area on the left. People have already made excellent File and Buffer explorers seperately and I thought that it might be a cool idea to combine them both. winmanager.vim combines the standard File Explorer which ships with Vim 6.0 and a Buffer Explorer written by Jeff Lanzarotta into one package.</p>
<p>滇狐评价： 非常好用的东西， 在屏幕上打开一个文件浏览器， 这样就可以方便地选择要编辑的文件了。</p>
<p>默认情况下， winmanager 依赖于 bufexplorer， 到这里下载。 如果你不喜欢 bufexplorer 插件的话 可以在你的 .vimrc 中添加这条命令禁用它：</p>
<p>let g:winManagerWindowLayout = &#8220;FileExplorer&#8221;<br />
这样就不需要下载该插件了。</p>
<p>滇狐为 winfileexplorer.vim 加了一个补丁， 提供了使用系统默认打开方式打开选中文件的功能， 只要把光标放在想要打开的文件上， 然后按“S”就可以了 (注意是大写)。 这样以后就可以直接在 gvim 里打开 Noatun 或别的播放器， 不用再切换出来找 konqueror 了。<br />
<span id="more-594"></span><br />
1.4 echofunc</p>
<p>下载地址： 官方站点</p>
<p>官方描述： When you type ‘(‘ after a function name in insert mode, the function declaration will be displayed in the command line automatically. Then use Alt+-, Alt+= to cycle between function declarations (if exists).</p>
<p>滇狐评价： 一个非常好用的插件， 虽然很小巧， 功能也很简单， 但非常实用， 强烈推荐。 除此之外， 安装了这个插件后， 当鼠标移到一个标志符之上时， 还会出现一个气球显示该标志符的定义， 如图：</p>
<p>安装注意事项： 该插件需要安装 EXUBERANT CTAGS， 不支持古老版本的标准 ctags。 建议创建一个这样的脚本：</p>
<p>#!/bin/sh<br />
# Filename: omnictags</p>
<p>ctags &#8211;c++-kinds=+p &#8211;fields=+iaS &#8211;extra=+q &#8220;$@&#8221;<br />
然后使用 omnictags 来运行 ctags 生成 tags 文件， 保证 tags 文件中含有所需的信息。</p>
<p>1.5 omnicppcomplete</p>
<p>下载地址： 官方站点</p>
<p>官方描述： This script is for vim 7.0 or higher it provides an omnifunc cppcomplete function. You can use the omni completion (intellisense) in c++ files.</p>
<p>This is a full vim script and you only need a ctags database.</p>
<p>滇狐评价： 虽然滇狐几乎不依赖 IDE 的自动完成， 因此也很少使用这个插件， 但总的说来， 这仍然是个很棒的插件。</p>
<p>安装注意事项： 该插件需要安装 EXUBERANT CTAGS， 不支持古老版本的标准 ctags。 建议创建一个和前面的 echofunc 中给出个脚本， 使用那个脚本来生成 tags 文件。</p>
<p>1.6 clewn</p>
<p>下载地址： 官方站点</p>
<p>官方描述： Clewn implements full gdb support in the vim editor: breakpoints, watch variables, gdb command completion, assembly windows, etc.</p>
<p>滇狐评价： Vim 从一开始的设计哲学就是要保持简单， 不要把太多的东西整合在 Vim 中。 Clewn 在保持了 Vim 简单的原则下， 将集成调试所需的一部分功能引入到了 GVim 中， 支持设置断点、 查看变量的值等许多操作， 非常方便。</p>
<p>1.7 jad</p>
<p>下载地址： 无。 自己将代码复制粘贴回去， 保存为 $HOME/.vim/plugins/jad.vim：</p>
<p>augr class<br />
au!<br />
au bufreadpost,filereadpost *.class %!jad -noctor -ff -i -p %<br />
au bufreadpost,filereadpost *.class set readonly<br />
au bufreadpost,filereadpost *.class set ft=java<br />
au bufreadpost,filereadpost *.class normal gg=G<br />
au bufreadpost,filereadpost *.class set nomodified<br />
au bufreadpost,filereadpost *.class set nomodifiable<br />
augr END<br />
官方描述： (无)</p>
<p>滇狐评价： 挺好玩的插件， 不过似乎也只是好玩而已。 安装了之后可以直接双击打开 .class 文件， VIM 会自动调用 jad 把文件反编译了。</p>
<p>安装注意事项：需要先安装一份 jad。</p>
<p>1.8 cscope_maps</p>
<p>下载地址： 官方站点</p>
<p>官方描述： Cscope is a very handy tool, but it’s even better when you don’t ever have to leave the comfort of your favorite editor (i.e. Vim) to use it. Fortunately, Cscope support has been built into Vim.</p>
<p>滇狐评价： 滇狐目前 cscope 用得不如 ctags 多， 许多功能都不大熟。 不过既然大家都说好， 那还是装着玩玩吧。</p>
<p>安装注意事项： 需要安装 cscope。</p>
<p>1.9 project</p>
<p>下载地址： 官方站点</p>
<p>官方描述： You can use this plugin’s basic functionality to set up a list of frequently-accessed files for easy navigation. The list of files will be displayed in a window on the left side of the Vim window, and you can press  or double-click on filenames in the list to open the files. This is similar to how some IDEs I’ve used work. I find this easier to use than having to navigate a directory hierarchy with the file-explorer. It also obviates the need for a buffer explorer because you have your list of files on the left of the Vim Window.</p>
<p>滇狐评价： 食之无肉，弃之有味。</p>
<p>安装注意事项： 几乎没怎么用过， 所以暂时没有发现需要注意的地方。</p>
<p>2 文档编写</p>
<p>2.1 fencview</p>
<p>下载地址： 官方站点</p>
<p>官方描述： View a multi-byte encoded file in different encodings.</p>
<p>滇狐评价： 对于亚洲用户， 尤其是中国用户而言， 这是一个非常重要的插件！ 它能自动识别文本文件的编码， 给需要编辑各种不同编码的人员提供了极大方便。</p>
<p>2.2 VIM LaTeX Suite</p>
<p>下载地址： 官方站点</p>
<p>官方描述：</p>
<p>Vim is undoubtedly one of the best editors ever made. LaTeX is an extremely powerful, intelligent typesetter. Vim-LaTeX aims at bringing together the best of both these worlds.</p>
<p>We attempt to provide a comprehensive set of tools to view, edit and compile LaTeX documents without needing to ever quit Vim. Together, they provide tools starting from macros to speed up editing LaTeX documents to compiling tex files to forward searching .dvi documents.</p>
<p>See the features page for a brief tour of the various features in LaTeX-suite. All these features can be tuned extensively using the included texrc file. The screenshots page shows you how a typical working session with LaTeX-suite might progress.</p>
<p>LaTeX-suite is made for Vim versions 6.0 and above. Installation instructions are given in the download page.</p>
<p>滇狐评价： 实在是非常非常非常非常好的一个插件！ 用 VIM 写 LaTeX 的朋友无论如何都要试一试， 不用 VIM 写 LaTeX 的朋友也要试一试， 说不定你会改变你的主意， 改用 VIM 写 LaTeX。</p>
<p>安装注意事项： 如果使用 gvim 的话， 需要注意 scim 可能会和 LaTeX Suite 有冲突。 解决方法是要么把 scim 的 on the spot 功能去掉， 或者把 gtk_im_module 设为 scim。 (较新版本 scim 建议第二种方案)。</p>
<p>另外， 为了提高工作效率， 强烈建议配置 VIM 的LaTeX 正向、反向搜索功能。</p>
<p>2.3 sketch</p>
<p>下载地址： 官方站点</p>
<p>官方描述： Sketch.vim – Line drawing/painting using the mouse. Based on an idea by Morris.</p>
<p>滇狐评价： 很好玩， 虽然用到的时候不多， 但真一旦用到了， 还是会觉得这个东西很有用的。</p>
<p>安装注意事项： 建议在 .vimrc 中把 call ToggleSketch() 映射为命令，方便一些：</p>
<p>command -nargs=0 ToggleSketch call ToggleSketch()<br />
3 日常生活</p>
<p>3.1 Calendar</p>
<p>下载地址： 官方站点</p>
<p>官方描述： This script create calender window. This don’t use the external program (cal).</p>
<p>滇狐评价： 安装完毕后使用 :Calendar 命令打开一个垂直的日历窗口， 使用 :CalendarH 命令打开水平的日历窗口。 应该还是比较有用的。</p>
<p>安装注意事项： 滇狐个人喜欢把日记的扩展名改成 .txt， 默认的是 .cal。 在 calendar.vim 里面查找替换一下就可以了。 另外， 可以在 .vimrc 里面修改日记所在的路径， 默认是 ~/diary。</p>
<p>let g:calendar_diary=<br />
3.2 vimtips</p>
<p>下载地址： 官方站点</p>
<p>官方描述：</p>
<p>Whenever you start Vim (but no more than daily) the script will open a help window with a Vim tip. You must download the tips separately, from 官方站点</p>
<p>After installation, you can get the next tip with</p>
<p>:TipOfTheDay<br />
滇狐评价： 每天看一条，慢慢就变成 VIM 牛了。</p>
<p>安装注意事项： 暂时没发现。</p>
<p>3.3 vimball</p>
<p>下载地址： 官方站点</p>
<p>官方描述： The vimball plugin facilitates creating, extracting , and listing the contents of “vimball” archives (*.vba).</p>
<p>滇狐评价：</p>
<p>非常棒的一个插件， 专门用来安装其它插件的。 Vimball 格式的插件安装方便， 只需用 Vim 打开， 执行一下 :so % 即可， 无须用户自己满世界找插件的安装路径， 更无须整天想着更新 helptags。 滇狐已经决定将所有自己编写或修改的插件改为 Vimball 格式了， 而且目前有越来越多的插件使用 Vimball 的格式发布， 因此大家手头上一定要备有一份 Vimball 插件！ 虽然 Vim 内置了一份 Vimball 插件， 但版本太低， 许多 Vimball 无法通过它正常安装， 因此还是建议大家到 Vim 网站上下载一份最新版的 Vimball 插件。</p>
<p>3.4 GetLatestScript</p>
<p>下载地址： 官方站点</p>
<p>官方描述： GetLatestVimScripts is a plugin that automates retrieval of the latest versions of the scripts that you yourself use!</p>
<p>滇狐评价：</p>
<p>非常有用的一个插件， 有了它， 滇狐就可以时刻使用上最新鲜的插件， 而不用不停地到 Vim 主页上去看插件的更新情况了。</p>
<p>安装注意事项：</p>
<p>安装完毕后， 创建文件 ~/.vim/GetLatest/GetLatestVimScripts.dat， 按照这样的格式编写你的自动下载配置文件：</p>
<p>ScriptID SourceID Filename<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
 0 [:AutoInstall:]<br />
 0 [:AutoInstall:]<br />
&#8230;<br />
每行写一个插件的下载信息。 插件 id 就是在 Vim 主页下载插件时 URL 中的 script_id= 后面的那个数字。 第二个参数是前一次成功下载到的插件文件编号， 第一次使用的时候该参数写 0， 成功使用一次后会自动被修改为该插件最新版本的文件编号。 第三个参数是该插件下载成功后是否自动安装， 如果要自动安装的话就写上 :AutoInstall:。 滇狐不建议使用自动安装， 因此第三个参数建议省略不要写。 第四个参数是插件的名称， 一般和下载到的插件的文件名相同， 当然即使不同也不会造成太大影响， 这个参数主要用于防止某些插件自动将自己加入到这张列表， 并非用于指定插件的下载文件名， 更详细情况请参看该插件的文档。 以下是滇狐自己的 GetLatestVimScripts.dat， 供大家参考：</p>
<p>ScriptID SourceID Filename<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
1066 0 cecutil.vba<br />
1066 0 cecutil.vim<br />
1066 7618 cecutil.vba.gz<br />
1075 0 netrw.vba<br />
1075 0 netrw.vim<br />
1075 9816 netrw.vba.gz<br />
1440 7151 winmanager.vba.gz<br />
1502 8743 vimball.vim<br />
1520 7722 omnicppcomplete-0.41.zip<br />
1708 9649 fencview.vim<br />
1735 10501 echofunc.vim<br />
1863 0 tlib.vim<br />
1863 10035 tlib.vba.gz<br />
1926 9111 bbs.vba.gz<br />
2037 0 hookcursormoved.vim<br />
2037 8926 hookcursormoved.vba.gz<br />
273 7701 taglist_45.zip<br />
31 7218 a.vim<br />
42 9524 bufexplorer.zip<br />
642 0 GetLatestVimScripts.vim<br />
642 0 getscript.vim<br />
642 8136 getscript.vba.gz<br />
705 2667 sketch.zip<br />
861 0 viki.vim<br />
861 10254 Viki.vba.gz<br />
编写好 GetLatestVimScripts.dat 后， 打开 Vim， 运行 :GetLatestVimScripts， 即可自动下载最新的插件。 插件下载后存放在 ~/.vim/GetLatest/ 中， 可以到那里找到后安装， 安装完毕后安装文件可以删除。</p>
        <div style="text-align:center;margin-top:10px;margin-bottom:15px;">
        <script type="text/javascript"><!--
        google_ad_client = "ca-pub-0297441349139103";
        /* feed_468x60 */
        google_ad_slot = "7402452313";
        google_ad_width = 468;
        google_ad_height = 60;
        //-->
        </script>
        <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
        </script></div>]]></content:encoded>
			<wfw:commentRss>http://beyondidea.cn/index.php/archives/594/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>vim  ctags使用帮助</title>
		<link>http://beyondidea.cn/index.php/archives/574</link>
		<comments>http://beyondidea.cn/index.php/archives/574#comments</comments>
		<pubDate>Sun, 26 Dec 2010 14:58:49 +0000</pubDate>
		<dc:creator>wl1011</dc:creator>
				<category><![CDATA[vim]]></category>

		<guid isPermaLink="false">http://blog.donews.com/wl1011/?p=574</guid>
		<description><![CDATA[vim ctags使用帮助        <div style="text-align:center;margin-top:10px;margin-bottom:15px;">
        <script type="text/javascript"><!--
        google_ad_client = "ca-pub-0297441349139103";
        /* feed_468x60 */
        google_ad_slot = "7402452313";
        google_ad_width = 468;
        google_ad_height = 60;
        //-->
        </script>
        <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
        </script></div>]]></description>
			<content:encoded><![CDATA[<p>1、 $ ctags –R &#8211;c-types=+px ($ 为Linux系统Shell提示符)</p>
<p>2、$ vi –t tag (请把tag替换为您欲查找的变量或函数名)</p>
<p>3、：ts (ts 助记字：tags list, “:”开头的命令为VI中命令行模式命令)</p>
<p>4、：tp (tp 助记字：tags preview)—此命令不常用，可以不用记</p>
<p>5、：tn (tn 助记字：tags next) —此命令不常用，可以不用记</p>
<p>6、 ：tag /tag(请把tag替换为您欲查找的变量或函数名)</p>
<p>7、Ctrl + ] 到函数定义或声明 [ + tab</p>
<p>8、Ctrl + T 返回</p>
<p>9、[{ 转到上一个位于第一列的"{"</p>
<p>10、}] 转到下一个位于第一列的&#8221;{&#8221;</p>
<p>11、{   转到上一个空行</p>
<p>12、}   转到下一个空行</p>
<p>13、gd 转到当前光标所指的局部变量的定义，gf打开头文件</p>
<p>14、*   转到当前光标所指的单词下一次出现的地方</p>
<p>15、#   转到当前光标所指的单词上一次出现的地方</p>
<p>16、Ctrl+i 前进 Ctrl+o 返回</p>
<p>17、ctrl+z将vi转入后台，fg可返回vi</p>
<p>注意：运行vim的时候，必须在“tags”文件所在的目录下运行。否则，运行vim的时候还要用“:settags=” 命令设定“tags”文件的路径，这样vim才能找到“tags”文件。在完成编码时，可以手工删掉tags文件（帚把不到，灰尘不会自己跑掉^_^）。</p>
<p>注：另外，在windows下，有gvim可以使用。而且，也可以使用ctags。这个ctags可以从其它的软件包的目录里边copy出来。比如ultraedit就带了一个ctags程序。你直接将其copy到gvim的目录下的vim目录下就可以了。</p>
<p>例子：</p>
<p>ctags -R &#8211;languages=c++ &#8211;langmap=c++:+.inl -h +.inl &#8211;c++-kinds=+px &#8211;fields=+aiKSz &#8211;extra=+q &#8211;exclude=lex.yy.cc &#8211;exclude=copy_lex.yy.cc</p>
<p>命令太长了，折成两行了，可以考虑把命令的各个参数写到文件里去了（具体做法就不谈了）。</p>
<p>1.</p>
<p>-R</p>
<p>表示扫描当前目录及所有子目录（递归向下）中的源文件。并不是所有文件ctags都会扫描，如果用户没有特别指明，则ctags根据文件的扩展名来决定是否要扫描该文件——如果ctags可以根据文件的扩展名可以判断出该文件所使用的语言，则ctags会扫描该文件。</p>
<p>2.</p>
<p>&#8211;languages=c++</p>
<p>只扫描文件内容判定为c++的文件——即ctags观察文件扩展名，如果扩展名对应c++，则扫描该文件。反之如果某个文件叫aaa.py（python文件），则该文件不会被扫描。</p>
<p>3.</p>
<p>&#8211;langmap=c++:+.inl</p>
<p>告知ctags，以inl为扩展名的文件是c++语言写的，在加之上述2中的选项，即要求ctags以c++语法扫描以inl为扩展名的文件。</p>
<p>4.</p>
<p>-h +.inl</p>
<p>告知ctags，把以inl为扩展名的文件看作是头文件的一种（inl文件中放的是inline函数的定义，本来就是为了被include的）。这样ctags在扫描inl文件时，就算里面有static的全局变量，ctags在记录时也不会标明说该变量是局限于本文件的（见第一节描述）。</p>
<p>5.</p>
<p>&#8211;c++-kinds=+px</p>
<p>记录类型为函数声明和前向声明的语法元素（见第三节）。</p>
<p>6.</p>
<p>&#8211;fields=+aiKSz</p>
<p>控制记录的内容（见第四节）。</p>
<p>7.</p>
<p>&#8211;extra=+q</p>
<p>让ctags额外记录一些东西（见第四、五节）。</p>
<p>8.</p>
<p>&#8211;exclude=lex.yy.cc &#8211;exclude=copy_lex.yy.cc</p>
<p>告知ctags不要扫描名字是这样的文件。还可以控制ctags不要扫描指定目录，这里就不细说了。</p>
        <div style="text-align:center;margin-top:10px;margin-bottom:15px;">
        <script type="text/javascript"><!--
        google_ad_client = "ca-pub-0297441349139103";
        /* feed_468x60 */
        google_ad_slot = "7402452313";
        google_ad_width = 468;
        google_ad_height = 60;
        //-->
        </script>
        <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
        </script></div>]]></content:encoded>
			<wfw:commentRss>http://beyondidea.cn/index.php/archives/574/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Vim下的代码自动补全和代码跳转阅读（转）</title>
		<link>http://beyondidea.cn/index.php/archives/572</link>
		<comments>http://beyondidea.cn/index.php/archives/572#comments</comments>
		<pubDate>Sun, 26 Dec 2010 13:43:34 +0000</pubDate>
		<dc:creator>wl1011</dc:creator>
				<category><![CDATA[vim]]></category>

		<guid isPermaLink="false">http://blog.donews.com/wl1011/?p=572</guid>
		<description><![CDATA[Vim下的代码自动补全和代码跳转阅读（转）        <div style="text-align:center;margin-top:10px;margin-bottom:15px;">
        <script type="text/javascript"><!--
        google_ad_client = "ca-pub-0297441349139103";
        /* feed_468x60 */
        google_ad_slot = "7402452313";
        google_ad_width = 468;
        google_ad_height = 60;
        //-->
        </script>
        <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
        </script></div>]]></description>
			<content:encoded><![CDATA[<p>【前言】</p>
<p>Linux之所以今天仍然只被少数人使用，不能像windows一样进入寻常百姓家，其配置之难之烦，还是很让人不爽。号称Linux编辑器哼哈二将之一的Vim也是难逃此列。虽然很多高手用的得心应手，但是作为初学者往往不知道如何下手。。。</p>
<p>我希望把同为初学者的我的配置经历，以尽量简洁的语言叙述，试图使这个过程看上去不再那么恐怖。</p>
<p>【概念】</p>
<p>代码自动补全和代码跳转阅读，应该是作为程序员最常用的功能之一了，具体二者是指什么我就不解释了。微软的Visual Studio就是靠这两样必杀技牢牢占据着广大windows程序员的心（这里面要有强大的VS插件Visual Assistant X一份功劳）。。。但是Linux程序员其实更幸福，不花钱就能搞定这两大功能。</p>
<p>从本质上说，这二者的实现都依赖于一样东西：tag。tag就是程序中的关键词，在C++中主要包括：变量、函数名、类名等。代码自动补全实际上是 tag的匹配（例如，程序员输入cla时，由于存在class这个c++的tag，就可以用class匹配cla）；代码跳转阅读实际上是tag的查找（例如，程序员要查找一个函数func()，只需要在别的文件中寻找这个func这个tag的位置即可）。<br />
<span id="more-572"></span><br />
【准备】</p>
<p>我现在的系统是Ubuntu Desktop 10.04 LTS版本。当然，一切工作的前提是你能上网，而且配置好了一个可用的源。</p>
<p>1. 安装Vim和Vim基本插件</p>
<p>我们需要首先安装好Vim和Vim的基本插件。这些使用apt-get安装即可：</p>
<p>sudo apt-get install vim vim-doc vim-scripts</p>
<p>其中vim-scripts是vim的一些基本插件，包括语法高亮的支持、缩进等等。</p>
<p>2. Vim配置文件</p>
<p>Vim强大的功能，其来源基本上就两个地方：插件，以及配置文件。</p>
<p>上面已经下载了Vim的基本插件，下面说一下Vim的基本配置。Vim本身的系统配置文件夹是在/usr/share/vim/和/etc/vim /两个文件夹下，我们一般不要去改变这些，改了以后不容易恢复。我们需要在用户文件夹下建立自己的配置文件。假设用户的名字是user。进入用户文件夹（/home/user/）之后，用gedit新建一个名叫.vimrc的文件：</p>
<p>gedit .vimrc</p>
<p>之所以用gedit是因为vim里面不能拷贝粘贴，为了方便大段大段的文字粘贴，还是先用gedit吧。。。</p>
<p>然后把下面的文字拷贝进这个文件之后保存：</p>
<p>&#8221; This line should not be removed as it ensures that various options are<br />
&#8221; properly set to work with the Vim-related packages available in Debian.<br />
runtime! debian.vim</p>
<p>&#8221; Uncomment the next line to make Vim more Vi-compatible<br />
&#8221; NOTE: debian.vim sets &#8216;nocompatible&#8217;.  Setting &#8216;compatible&#8217; changes numerous<br />
&#8221; options, so any other options should be set AFTER setting &#8216;compatible&#8217;.<br />
set nocompatible</p>
<p>&#8221; Vim5 and later versions support syntax highlighting. Uncommenting the<br />
&#8221; following enables syntax highlighting by default.<br />
if has(&#8220;syntax&#8221;)<br />
  syntax on<br />
endif</p>
<p>&#8221; detect file type<br />
filetype on<br />
filetype plugin on</p>
<p>&#8221; If using a dark background within the editing area and syntax highlighting<br />
&#8221; turn on this option as well<br />
set background=dark</p>
<p>&#8221; Uncomment the following to have Vim jump to the last position when<br />
&#8221; reopening a file<br />
if has(&#8220;autocmd&#8221;)<br />
  au BufReadPost * if line(&#8220;&#8216;\&#8221;") &gt; 1 &amp;&amp; line(&#8220;&#8216;\&#8221;")<br />
let OmniCpp_MayCompleteScope = 1 &#8221; autocomplete with ::<br />
let OmniCpp_SelectFirstItem = 2 &#8221; select first item (but don&#8217;t insert)<br />
let OmniCpp_NamespaceSearch = 2 &#8221; search namespaces in this and included files<br />
let OmniCpp_ShowPrototypeInAbbr = 1 &#8221; show function prototype  in popup window<br />
let OmniCpp_GlobalScopeSearch=1<br />
let OmniCpp_DisplayMode=1<br />
let OmniCpp_DefaultNamespaces=["std"]</p>
<p>（前几行就是提供了C++中的./-&gt;/::等操作符的提示和自动完成）。</p>
<p>6. 自动补全功能的测试</p>
<p>C++开发中经常会用到C++标准库的代码，因此STL的自动补全很重要。可以下载一份C++标准库的源代码来测试一下自动补全功能。</p>
<p>sudo apt-get install build-essential</p>
<p>然后在/usr/include/c++下就可以找到标准库的头文件了。在此文件夹下生成tags文件，并添加到vim的配置文件中（不再重复上面的内容），然后在编程的时候就可以使用自动补全功能了。</p>
<p>下面展示了一张vector的函数补全的效果图：</p>
<p>vector_auto_complete</p>
<p>PS：在自动补全的点，Vim必须知道可能补全的定义。比如说，在namespace std命名空间下的变量和函数，必须要用using namespace std;暴露出来，否则是不能补全的。在.cpp文件中还可以，在.h文件中这样就不是好的做法了。暂时不知道这个问题是由于我自己配置错误还是程序没有实现。</p>
        <div style="text-align:center;margin-top:10px;margin-bottom:15px;">
        <script type="text/javascript"><!--
        google_ad_client = "ca-pub-0297441349139103";
        /* feed_468x60 */
        google_ad_slot = "7402452313";
        google_ad_width = 468;
        google_ad_height = 60;
        //-->
        </script>
        <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
        </script></div>]]></content:encoded>
			<wfw:commentRss>http://beyondidea.cn/index.php/archives/572/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ubuntu下配置一个高效的PHP开发环境GVIM(转)</title>
		<link>http://beyondidea.cn/index.php/archives/568</link>
		<comments>http://beyondidea.cn/index.php/archives/568#comments</comments>
		<pubDate>Sun, 26 Dec 2010 05:18:15 +0000</pubDate>
		<dc:creator>wl1011</dc:creator>
				<category><![CDATA[vim]]></category>

		<guid isPermaLink="false">http://blog.donews.com/wl1011/?p=568</guid>
		<description><![CDATA[Ubuntu下配置一个高效的PHP开发环境GVIM(转)
Vim本质上只是一个编辑器。但只要配合一些适当的插件，vim也能变成一个全功能的IDE。笔者使用vim已经有挺长一段时间了，经过反复的试验，配置了一个高效的PHP开发环境，实为居家旅行、谋财害命、杀人越货必备之良品。        <div style="text-align:center;margin-top:10px;margin-bottom:15px;">
        <script type="text/javascript"><!--
        google_ad_client = "ca-pub-0297441349139103";
        /* feed_468x60 */
        google_ad_slot = "7402452313";
        google_ad_width = 468;
        google_ad_height = 60;
        //-->
        </script>
        <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
        </script></div>]]></description>
			<content:encoded><![CDATA[<p>Vim本质上只是一个编辑器。但只要配合一些适当的插件，vim也能变成一个全功能的IDE。笔者使用vim已经有挺长一段时间了，经过反复的试验，配置了一个高效的PHP开发环境，实为居家旅行、谋财害命、杀人越货必备之良品。<br />
安装Vim GVIM</p>
<p>sudo apt-get install vim</p>
<p>sudo apt-get install vim-gtk vim-doc cscope</p>
<p>卸载Vim GVIM</p>
<p>sudo apt-get remove &#8211;purge vim (&#8211;purge 是完全删除，会连配置文件一起删除)</p>
<p>sudo apt-get remove &#8211;purge vim-gtk vim-doc cscope</p>
<p>sudo apt-get clean</p>
<p>开始配置vim</p>
<p>Linux 下 vim 默认配置文件 /etc/vim/vimrc</p>
<p>用户默认配置文件 ~/.vimrc</p>
<p>如果想一次配置，所有用户都能使用，那就修改 /etc/vim/vimrc，如果只想当前用户可以使用，则修改 ~/.vim</p>
<p>针对开发配置：</p>
<p>au FileType php,c,java,javascript,html,htm,smarty call SetPhpOption()</p>
<p>function! SetPhpOption()</p>
<p>  set expandtab    &#8221; 使用空格代替tab</p>
<p>  set shiftwidth=4 &#8221; 设定 &lt;&gt; 命令移动时的宽度为 4</p>
<p>  set tabstop=4    &#8221; 用4个空格代替1个tab</p>
<p>  set sts=4        &#8221; 设置softtabstop 为 4，输入tab后就跳了4格.</p>
<p>  set cindent      &#8221; C语言方式缩进</p>
<p>  set smartindent  &#8221; 智能缩进</p>
<p>  set autoindent   &#8221; 自动缩进</p>
<p>  set smarttab     &#8221; 只在行首用tab，其他地方的tab都用空格代替</p>
<p>  set showmatch    &#8221; 在输入括号时光标会短暂地跳到与之相匹配的括号处</p>
<p>  &#8221; set fdm=indent &#8221; 代码折叠</p>
<p>  set lbr</p>
<p>  set tw=500</p>
<p>  set wrap         &#8221; 自动换行</p>
<p>endfunction</p>
<p>用NERDTree实现目录和文件导航</p>
<p>在进行PHP应用开发时，同时编辑多个文件是很正常的事情。所以必须有一个方便的目录导航工具，以便在目录结构间快速切换，找到需要编辑的文件。</p>
<p>vim中提供该类功能的插件很多，比较知名的有project、winmanager等。但笔者个人认为最好用的还是The NERD Tree这个插件。NERDTree不但可以显示完整的目录树结构，还可以将任何一个目录设置为根目录。并且提供了目录导航的书签功能，可谓非常方便。</p>
<p>下载地址：http://www.vim.org/scripts/script.php?script_id=1658</p>
<p>下载文件：NERD_tree.zip</p>
<p>解压缩时，要把压缩包中的目录结构完整的解压缩到 ~/.vim/ 目录中。完成后，应该分别找到  ~/.vim/doc/NERD_tree.txt 文件和  ~/.vim/plugin/NERD_tree.vim 文件。然后在vim中输入命令: helptags  ~/.vim/doc，将NERDTree的帮助文档添加到vim中。</p>
<p>现在，命令模式下输入:NERDTreeToggle便可打开或关闭NERDTree</p>
<p>注意：使用过程中，你可能会因为删除一个文件夹，而没有删除这个文件夹所绑定的标签，出现以下错误</p>
<p>NERDTree: 1 invalid bookmarks w&#8230;</p>
<p>解决：打开~/.vim/.NERDTreeBookmarks，删除里面无用的标签即可。<br />
用taglist实现代码导航</p>
<p>解决了目录和文件导航问题，我们还要为代码之间的跳转提供辅助手段，taglist就是这样一个插件。taglist可以列出已打开文件中定义的类、函数、常量，甚至变量。</p>
<p>下载地址：http://www.vim.org/scripts/script.php?script_id=273</p>
<p>下载文件：taglist_45.zip</p>
<p>压缩包需要完整解压缩到 ~/.vim/ 目录，并且用:helptags ~/.vim/doc命令索引taglist插件的帮助文档。</p>
<p>taglist插件需要依赖ctags程序才能工作。目前常用的ctags版本是Exuberant Ctags。<br />
安装ctags</p>
<p>下载地址：http://ctags.sourceforge.net/</p>
<p>下载文件：ctags-5.8.tar.gz</p>
<p>解压ctags：tar -zxcf ctags-5.8.tar.gz</p>
<p>进入ctags：cd ctags-5.8</p>
<p>打上PHP补丁（否则按下ctrl+n，连基本的function include等函数都出不来）：</p>
<p>wget http://svn.bitflux.ch/repos/public/misc/ctags-php5.patch<br />
patch php.c ctags-php5.patch</p>
<p>编译安装：</p>
<p>./configure</p>
<p>make</p>
<p>sudo make install</p>
<p>经过这三步后就生成 /usr/local/bin/ctags</p>
<p>继续回来修改~/.vim/plugin/taglist.vim</p>
<p>在 if !exists(&#8216;loaded_taglist&#8217;)上面加入</p>
<p>let Tlist_Ctags_Cmd=&#8221;/usr/local/bin/ctags&#8221;</p>
<p>或加在~/.vim/.vimrc文件，只要能让vim开启时加载的*.vim文件即可</p>
<p>此时Ctags和Taglist已经结合起来。</p>
<p>在相应的源码目录运行ctags -R产生相应的tags文件</p>
<p>cd ctags：cd ctags-5.8</p>
<p>ctags -R</p>
<p>拷贝到 ~/.vim/ 目录下</p>
<p>cp tags ~/.vim/</p>
<p>将tags文件在vim运行时导入。可以修改~/.vimrc，以后每次启动vim将自动导入此tags文件</p>
<p>:set tags=~/.vim/tags</p>
<p>并设置语法高亮</p>
<p>syntax enable</p>
<p>syntax on</p>
<p>此时再用vim编辑php文件，就会在右边出现一个当前文件的 类 函数 变量 等东西</p>
<p>使用ctags时， ctrl+]可查看函数的定义。 ctrl+o返回源文件。<br />
小技巧：</p>
<p>细心的朋友可能会发现，作为一个强大的IDE，还应该解决以下几个问题：</p>
<p>1.左边目录树结构不变。</p>
<p>2.代码块注释，删除注释。</p>
<p>3.代码块缩进，删除缩进。</p>
<p>解决问题：</p>
<p>1.一般情况下，我们会以标签的方式打开一个文件（让光标停留在一个要打开的文件上，按 t ），此时左边没有目录树，输入 :NERDTreeToggle打开目录树，此目录树为新建的，和第一个文件的目录树结构不同，这不符合我们普通IDE的习惯，还记得我们用 Netbeans之类的编辑器吗？左边的目录书结构一直没变，其实是所有文件共享一颗树的原因，NERDTree也允许我们共享树，命令是 :NERDTreeMirror，结合Tlist，我的快捷方式定义如下：</p>
<p>map :NERDTreeToggle<br />
map :TlistToggle<br />
map t :NERDTreeMirror</p>
<p>现在，看看我写代码的习惯：</p>
<p>首先，打开vi编辑器。</p>
<p>按 打开目录树</p>
<p>把光标停留在需要建立标签的文件夹上， :Bookmark 收藏名。</p>
<p>以后只需要 打开目录树，Shift+B打开收藏标签，双击一下想打开的标签，再按一次Shift+B关闭收藏标签。</p>
<p>鼠标选中需要打开的文件，按快捷键 ，此时，vi会先执行 t (标签方式打开文件)，再执行:NERDTreeMirror共享第一棵树。</p>
<p>怎么样，效果和大型IDE差不多了吧。</p>
<p>2.代码块注释，删除注释</p>
<p>注释：ctrl+v 进入列编辑模式，向上或向下移动光标，把需要注释的行的开头标记起来,然后按大写的I,再插入注释符,比如&#8221;//&#8221;,再按Esc,就会全部注释了。</p>
<p>删除：ctrl+v 进入列编辑模式，选中注释部分，然后按d，就会删除注释符号。</p>
<p>3.代码块缩进，删除缩进。</p>
<p>缩进：选择需要缩进的代码行（键盘鼠标都可以，选中了就行），&gt;（shift+.）</p>
<p>删除：选择需要缩进的代码行（键盘鼠标都可以，选中了就行），&lt;（shift+,）</p>
<p>.vimrc</p>
<p>&#8221; An example for a vimrc file.<br />
&#8221; disable VI&#8217;s compatible mode..<br />
set nocompatible<br />
&#8221; set encoding<br />
set encoding=utf8</p>
<p>&#8221; running in gui<br />
if has(&#8220;gui_running&#8221;)<br />
  &#8221; set color schema<br />
  colorscheme rootwater<br />
endif</p>
<p>&#8221; allow backspacing over everything in insert mode<br />
set backspace=indent,eol,start</p>
<p>&#8221; Enable syntax highlight<br />
syntax enable<br />
syntax on</p>
<p>set tags=~/.vim/tags &#8221; tagslist文件</p>
<p>&#8221; Basic editing options<br />
set history=50        &#8221; keep 50 lines of command line history<br />
set ruler             &#8221; show the cursor position all the time<br />
set showcmd           &#8221; display incomplete commands<br />
set number            &#8221; Show line number<br />
set mouse=a           &#8221; Have the mouse enabled all the time<br />
set incsearch         &#8221; do incremental searching<br />
&#8221; set sts=4<br />
set linebreak<br />
&#8221; Develop editing options<br />
au FileType vim setl shiftwidth=2<br />
au FileType vim setl tabstop=2<br />
au FileType html,c,javascript,java,php setl shiftwidth=4  &#8221; 当行之间交错时使用4个空格<br />
au FileType html,c,javascript,java,php setl tabstop=4     &#8221; 用4个空格代替1个tab<br />
au FileType html,c,javascript,java,php setl expandtab     &#8221; 使用空格代替tab<br />
&#8221; au FileType java,php setl cursorline                    &#8221; 高亮当前行<br />
au FileType html,c,javascript,java,php setl nobackup      &#8221; 不备份<br />
au FileType html,c,javascript,java,php setl hlsearch      &#8221; 高亮显示所有匹配<br />
&#8221; au FileType html,c,javascript,java,php setl fdm=indent  &#8221; 代码折叠<br />
&#8221; au FileType html,c,javascript,java,php setl showmatch   &#8221; 匹配模式，如：输入一个左括号，右括号自动加上</p>
<p>&#8220;au FileType php setl dictionary-=~/.funclist.txt<br />
&#8220;au FileType php setl dictionary+=~/.funclist.txt<br />
&#8220;au FileType php setl complete-=k<br />
&#8220;au FileType php setl complete+=k</p>
<p>set dictionary-=~/.vim/funclist.txt dictionary+=~/.vim/funclist.txt</p>
<p>set complete-=k complete+=k</p>
<p>&#8221; Only do this part when compiled with support for autocommands.<br />
if has(&#8220;autocmd&#8221;)</p>
<p>  &#8221; Enable file type detection.<br />
  &#8221; Use the default filetype settings, so that mail gets &#8216;tw&#8217; set to 72,<br />
  &#8221; &#8216;cindent&#8217; is on in C files, etc.<br />
  &#8221; Also load indent files, to automatically do language-dependent indenting.<br />
  filetype plugin indent on</p>
<p>  &#8221; Put these in an autocmd group, so that we can delete them easily.<br />
  augroup vimrcEx<br />
  au!</p>
<p>  &#8221; For all text files set &#8216;textwidth&#8217; to 78 characters.<br />
  autocmd FileType text setlocal textwidth=78</p>
<p>  &#8221; When editing a file, always jump to the last known cursor position.<br />
  &#8221; Don&#8217;t do it when the position is invalid or when inside an event handler<br />
  &#8221; (happens when dropping a file on gvim).<br />
  autocmd BufReadPost *<br />
    \ if line(&#8220;&#8216;\&#8221;") &gt; 0 &amp;&amp; line(&#8220;&#8216;\&#8221;") &lt;= line(&quot;$&quot;) |<br />
    \   exe &quot;normal! g`\&quot;&quot; |<br />
    \ endif</p>
<p>  augroup END</p>
<p>else</p>
<p>  set autoindent        &quot; always set autoindenting on</p>
<p>endif &quot; has(&quot;autocmd&quot;)</p>
<p> source ~/.vim/map.vim     &quot;导入快捷键映射文件<br />
 source ~/.vim/taglist.vim &quot;导入taglist配置文件<br />
 &quot; &#8212; MiniBufferExplorer &#8212; &quot;<br />
&quot; let g:miniBufExplMapWindowNavVim = 1<br />
&quot; let g:miniBufExplMapWindowNavArrows = 1<br />
&quot; let g:miniBufExplMapCTabSwitchBufs = 1<br />
&quot; let g:miniBufExplModSelTarget = 1</p>
<p>map.vim<br />
 &quot; gd 模式，左：h 右：l 上：j 下：k<br />
 map Q gq</p>
<p> &quot; switch buffers with Tab<br />
 map &lt;C-Tab&gt; :bn&lt;CR&gt;<br />
 map &lt;S-Tab&gt; :bp&lt;CR&gt;</p>
<p> &quot; NERDTree<br />
 map &lt;F2&gt;:NERDTreeToggle&lt;CR&gt;<br />
 map &lt;F3&gt; :TlistToggle<br />
 map t :NERDTreeMirror</p>
<p> nmap  &lt;silent&gt; &lt;F8&gt; :call SvnDiffToggle()<br />
 nmap  &lt;silent&gt; g&lt;F8&gt; :new __SVN_DIFF__&lt;CR&gt;:read !svn diff&lt;CR&gt;:set syntax=diff buftype=nofile&lt;CR&gt;gg<br />
 function SvnDiffToggle()<br />
   if bufexists(&quot;__SVN_DIFF__&quot;)<br />
     bwipeout __SVN_DIFF__<br />
   else<br />
     if exists(&quot;t:flwsvndiff&quot;)<br />
       diffoff!<br />
       let l:fileName = t:flwsvndiff<br />
       unlet t:flwsvndiff<br />
       exec &quot;bwipeout &quot; . l:fileName<br />
     else<br />
       let t:flwsvndiff = expand(&quot;%:h&quot;) . &quot;/.svn/text-base/&quot; . expand(&quot;%:t&quot;) . &quot;.svn-base&quot;<br />
       let l:ft = &amp;ft</p>
<p>       exec &quot;silent vert diffsplit &quot; . t:flwsvndiff<br />
       set readonly<br />
       set buftype=nofile<br />
       exec &quot;set ft=&quot; . l:ft<br />
       wincmd p<br />
       autocmd VimResized * :wincmd =<br />
     endif<br />
   endif<br />
 endfunction</p>
<p>taglist.vim</p>
<p> &quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;<br />
 &quot; =&gt; Plugin configuration<br />
 &quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;<br />
 &quot; taglist<br />
 set tags=~/www/hr/tags</p>
<p> let Tlist_Ctags_Cmd=&quot;/usr/local/bin/ctags&quot;<br />
 let Tlist_Auto_Highlight_Tag = 1<br />
 let Tlist_Auto_Open = 0<br />
 let Tlist_Auto_Update = 1<br />
 let Tlist_Close_On_Select = 0<br />
 let Tlist_Compact_Format = 0<br />
 let Tlist_Display_Prototype = 0<br />
 let Tlist_Display_Tag_Scope = 1<br />
 let Tlist_Enable_Fold_Column = 0<br />
 let Tlist_Exit_OnlyWindow = 1<br />
 let Tlist_File_Fold_Auto_Close = 0<br />
 let Tlist_GainFocus_On_ToggleOpen = 1<br />
 let Tlist_Hightlight_Tag_On_BufEnter = 1<br />
 let Tlist_Inc_Winwidth = 0<br />
 let Tlist_Max_Submenu_Items = 1<br />
 let Tlist_Max_Tag_Length = 30<br />
 let Tlist_Process_File_Always = 0<br />
 let Tlist_Show_Menu = 1<br />
 let Tlist_Show_One_File = 1<br />
 let Tlist_Sort_Type = &quot;order&quot;<br />
 let Tlist_Use_Horiz_Window = 0<br />
 let Tlist_Use_Right_Window = 1<br />
 let Tlist_WinWidth = 30<br />
 let tlist_php_settings = &#039;php;c:class;i:interfaces;d:constant;f:function&#039;</p>
        <div style="text-align:center;margin-top:10px;margin-bottom:15px;">
        <script type="text/javascript"><!--
        google_ad_client = "ca-pub-0297441349139103";
        /* feed_468x60 */
        google_ad_slot = "7402452313";
        google_ad_width = 468;
        google_ad_height = 60;
        //-->
        </script>
        <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
        </script></div>]]></content:encoded>
			<wfw:commentRss>http://beyondidea.cn/index.php/archives/568/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>cygwin编译运行mysql（转）</title>
		<link>http://beyondidea.cn/index.php/archives/553</link>
		<comments>http://beyondidea.cn/index.php/archives/553#comments</comments>
		<pubDate>Mon, 25 Oct 2010 08:46:00 +0000</pubDate>
		<dc:creator>wl1011</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[cygwin mysql]]></category>

		<guid isPermaLink="false">http://blog.donews.com/wl1011/?p=553</guid>
		<description><![CDATA[转自http://www13.atwiki.jp/uhaku/pages/51.html 稍微改动了一下，编译运行mysql5.1代码 1. 安装cygwin和ncurses的库 http://www.cygwin.com/setup.exe Install from Internet 设置目录和缓冲目录后next下去 Select Packages搜索并安装下列包：make,gcc和ncurses（依赖的会自动选中） make: The GNU version of the &#8216;make&#8217; utility gcc: C compiler upgrade helper gcc-core: C compiler gcc-g++: C++ compiler libncurses-devel: (devel) libraries for terminal handling 2. 下载mysql5.1的tar源码包 http://dev.mysql.com/downloads/mysql/ 选择source code mysql-5.1.50.tar.gz 3. 编译安装mysql $ make -v GNU Make 3.81 Copyright (C) 2006 Free Software [...]        <div style="text-align:center;margin-top:10px;margin-bottom:15px;">
        <script type="text/javascript"><!--
        google_ad_client = "ca-pub-0297441349139103";
        /* feed_468x60 */
        google_ad_slot = "7402452313";
        google_ad_width = 468;
        google_ad_height = 60;
        //-->
        </script>
        <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
        </script></div>]]></description>
			<content:encoded><![CDATA[<p>转自http://www13.atwiki.jp/uhaku/pages/51.html</p>
<p>稍微改动了一下，编译运行mysql5.1代码</p>
<p>1. 安装cygwin和ncurses的库</p>
<p>http://www.cygwin.com/setup.exe</p>
<p>Install from Internet<br />
设置目录和缓冲目录后next下去<br />
Select Packages搜索并安装下列包：make,gcc和ncurses（依赖的会自动选中）<br />
make: The GNU version of the &#8216;make&#8217; utility<br />
gcc: C compiler upgrade helper<br />
gcc-core: C compiler<br />
gcc-g++: C++ compiler<br />
libncurses-devel: (devel) libraries for terminal handling</p>
<p>2. 下载mysql5.1的tar源码包</p>
<p>http://dev.mysql.com/downloads/mysql/</p>
<p>选择source code<br />
mysql-5.1.50.tar.gz</p>
<p>3. 编译安装mysql<br />
$ make -v<br />
GNU Make 3.81<br />
Copyright (C) 2006  Free Software Foundation, Inc.<br />
This is free software; see the source for copying conditions.<br />
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A<br />
PARTICULAR PURPOSE.</p>
<p>This program built for i686-pc-cygwin<br />
$ gcc -v<br />
Reading specs from /usr/lib/gcc/i686-pc-cygwin/3.4.4/specs<br />
Configured with: /managed/gcc-build/final-v3-bootstrap/gcc-3.4.4-999/configure -<br />
-verbose &#8211;program-suffix=-3 &#8211;prefix=/usr &#8211;exec-prefix=/usr &#8211;sysconfdir=/etc<br />
&#8211;libdir=/usr/lib &#8211;libexecdir=/usr/lib &#8211;mandir=/usr/share/man &#8211;infodir=/usr/s<br />
hare/info &#8211;enable-languages=c,ada,c++,d,f77,pascal,java,objc &#8211;enable-nls &#8211;wit<br />
hout-included-gettext &#8211;enable-version-specific-runtime-libs &#8211;without-x &#8211;enabl<br />
e-libgcj &#8211;disable-java-awt &#8211;with-system-zlib &#8211;enable-interpreter &#8211;disable-li<br />
bgcj-debug &#8211;enable-threads=posix &#8211;enable-java-gc=boehm &#8211;disable-win32-registr<br />
y &#8211;enable-sjlj-exceptions &#8211;enable-hash-synchronization &#8211;enable-libstdcxx-debu<br />
g<br />
Thread model: posix<br />
gcc version 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)<br />
$ cd /usr/src<br />
$ explorer .<br />
(拷贝mysql-5.1.50.tar.gz进去C:\cygwin\usr\src）<br />
$ tar zxvf mysql-5.1.50.tar.gz<br />
$ cd mysql-5.1.50<br />
(下面步骤参考自http://www13.atwiki.jp/uhaku/pages/51.html）<br />
$ CFLAGS=&#8221;-O3 -march=i686&#8243; \<br />
CXXFLAGS=&#8221;-O3 -march=i686 -felide-constructors \<br />
-fno-exceptions -fno-rtti&#8221; \<br />
./configure \<br />
&#8211;with-innodb \<br />
&#8211;enable-local-infile \<br />
&#8211;prefix=/usr/local/mysql \<br />
&#8211;localstatedir=/usr/local/mysql/data \<br />
-with-extra-charsets=all \<br />
&#8211;with-unix-socket-path=/tmp/mysql.sock<br />
（建议关闭360等杀毒软件，防止一些不必要的麻烦）<br />
（如果configure过程出现cpu持续不降而无法前进，<br />
可以在任务管理器中关闭有问题的gcc-3.exe进程）<br />
$ make<br />
(出现第一个错误：<br />
readline/readline.h:70:29: sys/ttydefaults.h: No such file or directory<br />
用notepad2或者写字板打开<br />
C:\cygwin\usr\src\mysql-5.1.50\cmd-line-utils\libedit\readline\readline.h<br />
把#include 注释掉<br />
)<br />
（出现第二个错误：<br />
vi.c:918:74: macro &#8220;__weak_reference&#8221; requires 2 arguments, but only 1 given<br />
参考http://www.cygwin.com/ml/cygwin/2010-01/msg01124.html的补丁<br />
用notepad2或者写字板打开<br />
C:\cygwin\usr\src\mysql-5.1.50\cmd-line-utils\libedit\vi.c<br />
在<br />
#if defined(__weak_reference) &amp;&amp; !defined(__FreeBSD__)<br />
前面加上<br />
#ifdef __CYGWIN__<br />
#undef __weak_reference<br />
#endif<br />
)<br />
（漫长的编译。。。）<br />
（如果编译过程出现cpu持续不降而无法前进，<br />
可以Ctrl+C中断编译或结束gcc-3.exe进程然后重新执行make）<br />
$ make install<br />
（如果编译过程出现cpu持续不降而无法前进，<br />
可以Ctrl+C中断编译或结束gcc-3.exe进程然后重新执行make install）<br />
（有些步骤耗时会比较长，需要耐心等候：<br />
make[4]: Entering directory `/usr/src/mysql-5.1.50/mysql-test&#8217;<br />
没有回显，所以感觉会很长，可以查看任务管理器install.exe的命令行<br />
）<br />
$ ./scripts/mysql_install_db<br />
$ cp support-files/my-medium.cnf /etc/my.cnf<br />
（关闭防火墙和原有mysql服务）<br />
$ /usr/local/mysql/bin/mysqld_safe \<br />
&#8211;datadir=/usr/local/mysql/data \<br />
&#8211;log-error=/var/log/mysql.log &amp;<br />
$ ps<br />
（正常的话看到mysqld的存在：/usr/local/mysql/libexec/mysqld）<br />
$ /usr/local/mysql/bin/mysqlshow -u root<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+<br />
|     Databases      |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+<br />
| information_schema |<br />
| mysql              |<br />
| test               |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+<br />
$ /usr/local/mysql/bin/mysql -u root<br />
mysql&gt;status;<br />
mysql&gt;exit;<br />
Bye<br />
$ /usr/local/mysql/bin/mysqladmin -u root shutdown -h 127.0.0.1<br />
$ ps<br />
（现在看不到mysqld了）</p>
        <div style="text-align:center;margin-top:10px;margin-bottom:15px;">
        <script type="text/javascript"><!--
        google_ad_client = "ca-pub-0297441349139103";
        /* feed_468x60 */
        google_ad_slot = "7402452313";
        google_ad_width = 468;
        google_ad_height = 60;
        //-->
        </script>
        <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
        </script></div>]]></content:encoded>
			<wfw:commentRss>http://beyondidea.cn/index.php/archives/553/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oracle 的随机数、随机日期和时间、随机字符串 Oracle与Unix时间戳的转换</title>
		<link>http://beyondidea.cn/index.php/archives/550</link>
		<comments>http://beyondidea.cn/index.php/archives/550#comments</comments>
		<pubDate>Wed, 01 Sep 2010 04:59:45 +0000</pubDate>
		<dc:creator>wl1011</dc:creator>
				<category><![CDATA[oracle]]></category>

		<guid isPermaLink="false">http://blog.donews.com/wl1011/?p=550</guid>
		<description><![CDATA[Oracle 的随机数、随机日期和时间、随机字符串 Oracle与Unix时间戳的转换        <div style="text-align:center;margin-top:10px;margin-bottom:15px;">
        <script type="text/javascript"><!--
        google_ad_client = "ca-pub-0297441349139103";
        /* feed_468x60 */
        google_ad_slot = "7402452313";
        google_ad_width = 468;
        google_ad_height = 60;
        //-->
        </script>
        <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
        </script></div>]]></description>
			<content:encoded><![CDATA[<p>1. 随机数包<br />
[sql]<br />
SELECT DBMS_RANDOM.VALUE<br />
  FROM DUAL;<br />
[/sql]<br />
2. 在[0..100]范围内取随机数<br />
[sql]<br />
SELECT TRUNC (DBMS_RANDOM.VALUE (0, 100))<br />
  FROM DUAL;<br />
[/sql]<br />
3. 大于字符‘A’的10个字符随机字符串<br />
[sql]<br />
SELECT DBMS_RANDOM.STRING (&#8216;A&#8217;, 10)<br />
  FROM DUAL;<br />
[/sql]<br />
4. 单个小写随机字符<br />
[sql]<br />
SELECT CHR (ROUND (DBMS_RANDOM.VALUE (97, 122)))<br />
  FROM DUAL;<br />
[/sql]<br />
5. 在过去10天内取随机日期<br />
[sql]<br />
SELECT TO_DATE (TRUNC (DBMS_RANDOM.VALUE (TO_NUMBER (TO_CHAR (SYSDATE &#8211; 10,<br />
                                                              &#8216;J&#8217;<br />
                                                             )<br />
                                                    ),<br />
                                          TO_NUMBER (TO_CHAR (SYSDATE, &#8216;J&#8217;))<br />
                                         )<br />
                      ),<br />
                &#8216;J&#8217;<br />
               )<br />
  FROM DUAL;<br />
[/sql]<br />
6. 在过去30分钟内取随机时间<br />
[sql]<br />
SELECT (SYSDATE &#8211; 1 / 24 / 60 * 30) + DBMS_RANDOM.VALUE (1, 1800) / 3600 / 24<br />
  FROM DUAL;<br />
[/sql]<br />
Oracle随机函数</p>
<p> [sql]</p>
<p>Sql代码<br />
&#8211;创建55到100之间随机数</p>
<p>select dbms_random.value, dbms_random.value(55,100)  from dual;</p>
<p>&#8211;创建2009年内的随机时间</p>
<p>SELECT<br />
to_timestamp(&#8217;2009-01-01 00:00:01&#8242;,&#8217;yyyy-mm-dd HH24:MI:SS&#8217;) +DBMS_RANDOM.VALUE(1,365*24*3600)/3600/24<br />
FROM DUAL</p>
<p>&#8211;随机查看前N条记录(随机读取表内容)</p>
<p>SELECT * FROM (SELECT * FROM chifan  ORDER BY dbms_random.random) WHERE ROWNUM&lt;=5<br />
[/sql]</p>
<p>unix/linux 时间戳转换为标准时间格式（主要是注意时区问题）：</p>
<p>sql代码<br />
[sql]<br />
select TO_DATE(&#8217;19700101&#8242;,&#8217;yyyymmdd&#8217;) + 1235728935/86400 +TO_NUMBER(SUBSTR(TZ_OFFSET(sessiontimezone),1,3))/24 from dual，其中1235728935就是unix/linux时间戳，转换完之后就表示为 2009-2-27 18:02:15。<br />
[/sql]<br />
反过来也一样，还是要考虑时区<br />
[sql]<br />
select (to_date(&#8217;2009-2-27 18:02:15&#8242;,&#8217;yyyy-mm-dd hh24:mi:ss&#8217;) &#8211; to_date(&#8217;1970-1-1&#8242;,&#8217;yyyy-mm-dd&#8217;))*86400- TO_NUMBER(SUBSTR(TZ_OFFSET(sessiontimezone),1,3))*3600 from dual<br />
[/sql]</p>
        <div style="text-align:center;margin-top:10px;margin-bottom:15px;">
        <script type="text/javascript"><!--
        google_ad_client = "ca-pub-0297441349139103";
        /* feed_468x60 */
        google_ad_slot = "7402452313";
        google_ad_width = 468;
        google_ad_height = 60;
        //-->
        </script>
        <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
        </script></div>]]></content:encoded>
			<wfw:commentRss>http://beyondidea.cn/index.php/archives/550/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>php 高级编程之编码风格</title>
		<link>http://beyondidea.cn/index.php/archives/541</link>
		<comments>http://beyondidea.cn/index.php/archives/541#comments</comments>
		<pubDate>Fri, 27 Aug 2010 07:56:49 +0000</pubDate>
		<dc:creator>wl1011</dc:creator>
				<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://blog.donews.com/wl1011/?p=541</guid>
		<description><![CDATA[php 高级编程之编码风格        <div style="text-align:center;margin-top:10px;margin-bottom:15px;">
        <script type="text/javascript"><!--
        google_ad_client = "ca-pub-0297441349139103";
        /* feed_468x60 */
        google_ad_slot = "7402452313";
        google_ad_width = 468;
        google_ad_height = 60;
        //-->
        </script>
        <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
        </script></div>]]></description>
			<content:encoded><![CDATA[<p>php 高级编程之编码风格</p>
<p>1 Code Formatting and Layout 代码格式和布局</p>
<p>Indentation 缩格</p>
<p>Although indentation is not mandatory in PHP, it is a powerful visual organization<br />
tool that you should always consistently apply to code.<br />
尽管缩格在PHP中不是强制的（python中确实语法），它是强有力的视觉组织工具，你应该一直坚持在代码中使用它</p>
<p>考虑下述代码：<br />
[php]if($month == ‘september’ || $month == ‘april’ || $month == ‘june’ || $month ==<br />
‘november’) { return 30;<br />
}<br />
else if($month == ‘february’) {<br />
if((($year % 4 == 0) &amp;amp;&amp;amp; !($year % 100)) || ($year % 400 == 0)) {<br />
return 29;<br />
}<br />
else {<br />
return 28;<br />
}<br />
}<br />
else {<br />
return 31;<br />
}[/php]<br />
跟下面这段代码进行比较<br />
[php]if($month == ‘september’ ||<br />
$month == ‘april’ ||<br />
$month == ‘june’ ||<br />
$month == ‘november’) {<br />
    return 30;<br />
}<br />
else if($month == ‘february’) {<br />
    if((($year % 4 == 0) &amp;amp;&amp;amp; ($year % 100)) || ($year % 400 == 0)) {<br />
        return 29;<br />
}<br />
else {<br />
    return 28;<br />
}<br />
}<br />
else {<br />
    return 31;<br />
}[/php]<br />
这段代码后者的版本比前者更容易去理解整体的逻辑循环。<span id="more-541"></span></p>
<p>2 Line Length 行的长度</p>
<p>例如：<br />
[php]if($month == ‘september’ || $month == ‘april’ ||<br />
$month == ‘june’ || $month == ‘november’) {<br />
return 30;<br />
}[/php]<br />
对于单行过长的代码你应该切割成多行来表示，每一行是一个完整的表达式<br />
[php]if($month == ‘september’ ||<br />
$month == ‘april’ ||<br />
$month == ‘june’ ||<br />
$month == ‘november’)<br />
{<br />
    return 30;<br />
}[/php]<br />
对于函数中的参数同样适用<br />
[php]mail(“postmaster@example.foo”,<br />
“My Subject”,<br />
$message_body,<br />
“From: George Schlossnagle \r\n”);[/php]<br />
总的来说，我设法分解任何超过80个字符的行，<br />
因为标准UNIX终端窗体的宽度就是80个字符，<br />
并且这个宽度是适度的对于用一种清晰的字体拷贝。</p>
<p>In general, I try to break up any line that is longer than 80 characters because 80 characters<br />
is the width of a standard Unix terminal window and is a reasonable width for<br />
printing to hard copy in a readable font.</p>
<p>3 Using Whitespace 使用多个空格 你可以使用多个空格去增强代码的逻辑结构</p>
<p>下述例子是很蹩脚的格式并且很难读懂<br />
[php]$lt = localtime();<br />
$name = $_GET[‘name’];<br />
$email = $_GET[‘email’];<br />
$month = $lt[‘tm_mon’] + 1;<br />
$year = $lt[‘tm_year’] + 1900;<br />
$day = $lt[‘tm_day’];<br />
$address = $_GET[‘address’];[/php]<br />
原话 ： You can improve this code block by using whitespace to logically group related assignments<br />
together and align them on =:<br />
你可以改善这段代码，对有关系的逻辑组分配连续的空格相对于 “=”上下对齐<br />
[php]$name    = $_GET[‘name’];<br />
$email   =  $_GET[‘email’];<br />
$address = $_GET[‘address’];<br />
$lt    = localtime();<br />
$day   = $lt[‘tm_day’];<br />
$month = $lt[‘tm_mon’] + 1;<br />
$year  = $lt[‘tm_year’] + 1900;[/php]<br />
4 SQL Guidelines SQL指导方针</p>
<p>考虑下述查询语句<br />
[php]$query = “SELECT FirstName, LastName FROM employees, departments WHERE<br />
employees.dept_id = department.dept_id AND department.Name = ‘Engineering’”;[/php]<br />
这是一个简单的查询语句但是它是蹩脚的组织，你可以用以下几个方法来改善它：<br />
1）关键词用大写字母<br />
2）每个关键词一行<br />
3）使用表的别名保持代码的干净</p>
<p>例如：<br />
[sql]$query = “SELECT firstname,<br />
                 lastname<br />
          FROM employees e,<br />
               departments d<br />
          WHERE u.dept_id = d.dept_id<br />
          AND d.name = ‘Engineering’”;[/sql]<br />
5 Using Braces in Control Structures 控制结构中使用大括号<br />
[php]if(isset($name))<br />
echo “Hello $name”;[/php]<br />
你也许会在这个例子中加额外的代码如下：<br />
[php]if(isset($name))<br />
echo “Hello $name”;<br />
$known_user = true;[/php]<br />
可能不是你想要的执行结果，所以你应该永远使用大括号<br />
[php]if(isset($name)) {<br />
    echo “Hello $name”;<br />
}<br />
else {<br />
    echo “Hello Stranger”;<br />
}[/php]<br />
你应该坚持一种风格使用大括号，如下有三种风格:<br />
[php]1) BSD style: 跟关键字成一线<br />
if ($condition)<br />
{<br />
    // statement<br />
}<br />
2) GNU style ：大括号在关键字跟括号之间的空格成一线<br />
if ($condition)<br />
{<br />
    // statement<br />
}<br />
3) K&amp;amp;R style<br />
if ($condition) {<br />
    // statement<br />
}[/php]<br />
6 for Versus while Versus foreach for,while,foreach<br />
[php]while:<br />
function is_prime($number)<br />
{<br />
    If(($number % 2) != 0)<br />
    {<br />
       return true;<br />
    }<br />
    $i = 0;<br />
   while($i &amp;lt; $number)<br />
   {<br />
      // A cheap check to see if $i is even<br />
      if( ($i &amp;amp; 1) == 0 )<br />
      {<br />
         continue;<br />
      }<br />
      if ( ($number % $i ) == 0)<br />
      {<br />
         return false;<br />
      }<br />
      $i++;<br />
   }<br />
   return true;<br />
}<br />
使用FOR处理循环更自然<br />
function is_prime($number)<br />
{<br />
   if(($number % 2) != 0)<br />
   {<br />
      return true;<br />
   }<br />
   for($i=0; $i &amp;lt; $number; $i++)<br />
   {<br />
      // A cheap check to see if $i is even<br />
      if( ($i &amp;amp; 1) == 0 )<br />
      {<br />
         continue;<br />
      }<br />
      if ( ($number % $i ) == 0)<br />
      {<br />
         return false;<br />
      }<br />
   }<br />
   return true;<br />
}</p>
<p>对于循环数组foreach比for 更好<br />
$array = (3, 5, 10, 11, 99, 173);<br />
foreach($array as $number)<br />
{<br />
   if(is_prime($number))<br />
   {<br />
      print “$number is prime.\n”;<br />
   }<br />
}[/php]<br />
This is faster than a loop that contains a for statement because it avoids the use of an<br />
explicit counter.<br />
这是更快的循环相对于FOR循环因为它避免使用一个确切的计数器</p>
<p>7 Using break and continue to Control Flow in Loops<br />
使用BREAK和CONTINUE可以避免莫名其妙的深度嵌套逻辑<br />
[php]$has_ended = 0;<br />
while(($line = fgets($fp)) !== false)<br />
{<br />
   if($has_ended)<br />
   {<br />
      //<br />
   }<br />
   else<br />
   {<br />
      if(strcmp($line, ‘_END_’) == 0)<br />
      {<br />
         $has_ended = 1;<br />
      }<br />
      if(strncmp($line, ‘//’, 2) == 0)<br />
      {<br />
         //<br />
      }<br />
      else<br />
      {<br />
            // parse statement<br />
      }<br />
   }<br />
}<br />
使用 break和continue<br />
while(($line = fgets($fp)) !== false)<br />
{<br />
   if(strcmp($line, ‘_END_’) == 0)<br />
   {<br />
      break;<br />
   }<br />
   if(strncmp($line, ‘//’, 2) == 0)<br />
   {<br />
      continue;<br />
   }<br />
   // parse statement<br />
}[/php]<br />
8 Avoiding Deeply Nested Loops 避免深度循环<br />
[php]$fp = fopen(“file”, “r”);<br />
if ($fp) {<br />
   $line = fgets($fp);<br />
   if($line !== false)<br />
   {<br />
      // process $line<br />
   }else<br />
   {<br />
      die(“Error: File is empty);<br />
   }<br />
   else<br />
   {<br />
      die(“Error: Couldn’t open file”);<br />
   }<br />
}[/php]<br />
A much simpler method is to handle all error handling (or any exceptional case) up<br />
front and eliminate the unnecessary nesting, as in the following example:<br />
一种更简单的方法是对待所有错误处理（例外情况除外）前置并且忽略不必要的嵌套。例如：<br />
[php]$fp = fopen(“file”, “r”);<br />
if (!$fp)<br />
{<br />
   die(“Couldn’t open file”);<br />
}<br />
$line = fgets($fp);<br />
if($line === false)<br />
{<br />
   die(“Error: Couldn’t open file”);<br />
}<br />
// process $line[/php]<br />
9  Naming Symbols 命名<br />
Variable names and function names populate PHP code. Like good layout, naming<br />
schemes serve the purpose of reinforcing code logic for the reader.<br />
好的命名对于阅读者来说事半功倍.<br />
例如:<br />
[php]function test($baz)<br />
{<br />
   for($foo = 0; $foo &amp;lt; $baz; $foo++)<br />
   {<br />
      $bar[$foo] = “test_$foo”;<br />
   }<br />
   return $bar;<br />
}[/php]<br />
can easily be replaced with the following, which has more meaningful variable names<br />
that clearly indicate what is happening:<br />
下述可以很容易的代替，使用更有意义的变量名明显指出将会发生什么<br />
[php]function create_test_array($size)<br />
{<br />
   for($i = 0; $i &amp;lt; $size; $i++)<br />
   {<br />
      $retval[$i] = “test_$i”;<br />
   }<br />
   return $retval;<br />
}[/php]<br />
你可以接受不同的命名规则：<br />
1） Truly global ： 全局变量，你打算在全局范围内引用。<br />
2） Long-lived ： 这些变量可以存在于任何的范围，但包含有重要信息或通过大块的代码引用。<br />
3） Temporary : 这些变量的代码中使用的在很小的范围内，并存储临时信息。</p>
<p>Truly global variables and constants should appear in all uppercase letters.This allows<br />
you to easily identify them as global variables. Here’s an example:<br />
全局变量使用全部大写字母，这样允许你更容易的认出它们作为全局变量<br />
[php]$CACHE_PATH = ‘/var/cache/’;<br />
&#8230;<br />
function list_cache()<br />
{<br />
   global $CACHE_PATH;<br />
   $dir = opendir($CACHE_PATH);<br />
   while(($file = readdir($dir)) !== false &amp;amp;&amp;amp; is_file($file))<br />
   {<br />
      $retval[] = $file;<br />
   }<br />
   closedir($dir);<br />
   return $retval;<br />
}[/php]<br />
Long-Lived Variables 长生命周期的变量  变量名采用解释复合的命名规则<br />
例如<br />
[php]function clean_cache($expiration_time)<br />
{<br />
    $cachefiles = list_cache();<br />
    foreach($cachefiles as $cachefile)<br />
   {<br />
        if(filemtime($CACHE_PATH.”/”.$cachefile) &amp;gt; time() + $expiration_time)<br />
       {<br />
              unlink($CACHE_PATH.”/”.$cachefile);<br />
        }<br />
    }<br />
}[/php]<br />
Temporary Variables 临时变量<br />
临时变量名应该简短和简明，因为临时变量名仅仅存在于一小段代码中，不需要使用解释说明复合名<br />
Compare this example:<br />
[php]$number_of_parent_indices = count($parent);<br />
for($parent_index=0; $parent_index &amp;lt;$number_of_parent_indices; $parent_index++)<br />
{<br />
    $number_of_child_indices = count($parent[$parent_index]);<br />
    for($child_index = 0; $child_index &amp;lt; $number_of_child_indices; $child_index++)<br />
    {<br />
        my_function($parent[$parent+index][$child_index]);<br />
    }<br />
}[/php]<br />
with this example:<br />
[php]$pcount = count($parent);<br />
for($i = 0; $i &amp;lt; $pcount; $i++)<br />
{<br />
    $ccount = count($parent[$i]);<br />
    for($j = 0; $j &amp;lt; $ccount; $j++)<br />
    {<br />
        my_function($parent[$i][$j]);<br />
    }<br />
}[/php]<br />
Better yet, you could use this:<br />
[php]foreach($parent as $child)<br />
{<br />
    foreach($child as $element)<br />
    {<br />
        my_function($element);<br />
    }<br />
}[/php]<br />
10  Multiword Names  多字的复合名<br />
例如<br />
[php]$num_elements = count($elements);[/php]<br />
使用下划线更容易阅读</p>
<p>11 Class Names 类名<br />
以下有两个例子说明它的命名规则<br />
[php]class XML_RSS {}<br />
class Text_PrettyPrinter {}[/php]<br />
12  Method Names  方法名<br />
[php]class XML_RSS<br />
{<br />
    function startHandler() {}<br />
}[/php]<br />
13 Function Names 函数命名<br />
跟变量的命名一致，全部小写，多字复合名使用下划线分隔开。大括号选择一种好的风格推荐BSD Style<br />
[php]function print_hello($name)<br />
{<br />
    echo “Hello $name”;<br />
}[/php]<br />
<strong>Quality Names 高质量命名<br />
Quality NamesCode in any language should be understandable by others.<br />
高质量的命名在任何语言中应该被其他人所理解。<br />
A function’s, class’s, or variable’s name shouldalways reflect what that symbol is intended to do.<br />
一个函数，类，或者变量总是应该反映象征它所做的事情。<br />
Naming a function foo() or bar() does nothing toenhance the readability of your code; furthermore, it looks unprofessional and makes your code difficult tomaintain.<br />
命名一个函数foo()或者bar()不会去做任何增加你的代码的阅读性。而且他看起来外行并且使你的代码很困难的维护。</strong><br />
14 Naming Consistency 命名的一贯性<br />
[php]<br />
$num_elements = count($elements);<br />
&#8230;<br />
$objects_cnt = count($objects);<br />
$max_elements;<br />
$min_elements;<br />
$sum_elements;<br />
$prev_item;<br />
$curr_item;<br />
$next_item;<br />
[/php]<br />
15 Matching Variable Names to Schema Names 变量命名与数据表命名相匹配<br />
例如<br />
[php]$query = “SELECT firstname, lastname, employee_id<br />
FROM employees”;<br />
$results = mysql_query($query);<br />
while(list($firstname, $lastname, $employee_id) = mysql_fetch_row($results))<br />
{<br />
// &#8230;<br />
}[/php]<br />
使用非正常的，或短的命名是莫名其妙并且具有误导性，很难去维护<br />
例如<br />
[php]$first_query = “SELECT a,b<br />
                FROM subscriptions<br />
                WHERE subscription_id = $subscription_id”;<br />
$results = mysql_query($first_query);<br />
list($a, $b) = mysql_fetch_row($results);<br />
// perform necessary logic<br />
$new_a = $b;<br />
$new_b = $a;<br />
$second_query = “UPDATE subscriptions<br />
                 SET a = ‘$new_a’,<br />
                     B = ‘$new_b’<br />
                 WHERE subscription_id = $subscription_id”;<br />
Mysql_query($second_query);<br />
$first_query = “SELECT a,b<br />
                FROM subscriptions<br />
                WHERE subscription_id = $subscription_id”;<br />
$results = mysql_query($first_query);<br />
list($b, $a) = mysql_fetch_row($results);<br />
// perform necessary logic<br />
$second_query = “UPDATE subscriptions<br />
                 SET a = ‘$a’,<br />
                     B = ‘$b’<br />
                 WHERE subscription_id = $subscription_id”;<br />
Mysql_query($second_query);[/php]<br />
想想看这样的代码要是100行会是怎么样，这样的代码完全是莫名其妙的。</p>
<p>16 Avoiding Confusing Code 避免莫名其妙的代码</p>
<p>17 Avoiding Using Open Tags 避免使用短标签<br />
[php]&amp;lt; ? echo “Hello $username”; ? &amp;gt;[/php]<br />
应该这样写<br />
[php]&amp;lt; ?php echo “Hello $username”; ? &amp;gt;[/php]<br />
18 Avoiding Using echo to Construct HTML 避免使用echo输出html结构<br />
例如<br />
[php]Hello &amp;lt;?= $username ?&amp;gt;<br />
&amp;lt;?php<br />
echo “&amp;lt;table&amp;gt;”;<br />
echo “&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Name&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Position&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;”;<br />
foreach ($employees as $employee) {<br />
echo “&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;$employee[name]&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;$employee[position]&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;”;<br />
}<br />
echo “&amp;lt;/table&amp;gt;”;<br />
?&amp;gt;[/php]<br />
跟下面的进行比较<br />
[php]&amp;lt;table&amp;gt;<br />
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Name&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Position&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;<br />
&amp;lt;?php foreach ($employees as $employee) { ?&amp;gt;<br />
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;? echo $employee[‘name’] ?&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;? echo $employee[‘position’]<br />
?&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;<br />
&amp;lt;?php } ?&amp;gt;<br />
&amp;lt;/table&amp;gt;[/php]<br />
注意&lt; ?=?&gt;与&lt; ?php echo ?&gt;是一样的,但是前者依赖于short_tags，这也就是有一个好的原因去避免使用它了</p>
<p>20 Using Parentheses Judiciously 明智的使用圆括号<br />
你可以使用圆括号增加代码的清晰度<br />
[php]if($month == ‘february’)<br />
{<br />
    if($year % 4 == 0 &amp;amp;&amp;amp; $year % 100 || $year % 400 == 0)<br />
    {<br />
        $days_in_month = 29;<br />
    }<br />
    else<br />
    {<br />
        $days_in_month = 28;<br />
    }<br />
}[php]<br />
这样的代码是强制读者去记住操作顺序以便得出表达式的值<br />
[php]if($month == ‘february’)<br />
{<br />
    if((($year % 4 == 0 )&amp;amp;&amp;amp; ($year % 100)) || ($year % 400 == 0))<br />
    {<br />
        $days_in_month = 29;<br />
    }<br />
    else<br />
    {<br />
        $days_in_month = 28;<br />
    }<br />
}[/php]<br />
这样的代码就更容易阅读了<br />
你不应该过度的使用圆括号例如：<br />
[php]if($month == ‘february’)<br />
{<br />
    if(((($year % 4) == 0 )&amp;amp;&amp;amp; (($year % 100) != 0)) || (($year % 400) == 0 ))<br />
    {<br />
        $days_in_month = 29;<br />
        Documentation 29<br />
    }<br />
    else<br />
    {<br />
        $days_in_month = 28;<br />
    }<br />
}[/php]<br />
这段代码过度的使用圆括号，使读者很难读懂它的逻辑了。</p>
<p>21  Documentation 文档<br />
Inline Comments 内部注释<br />
[php]<br />
1) C-style comments<br />
/* This is a c-style comment<br />
* (continued)<br />
*/<br />
2) C++-style comments<br />
// is considered a comment. Here’s an example of a C++-style comment:<br />
// This is a c++-style comment<br />
3) Shell/Perl-style comments<br />
# This is a shell-style comment<br />
[/php]</p>
<p>22 Using phpDocumentor</p>
        <div style="text-align:center;margin-top:10px;margin-bottom:15px;">
        <script type="text/javascript"><!--
        google_ad_client = "ca-pub-0297441349139103";
        /* feed_468x60 */
        google_ad_slot = "7402452313";
        google_ad_width = 468;
        google_ad_height = 60;
        //-->
        </script>
        <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
        </script></div>]]></content:encoded>
			<wfw:commentRss>http://beyondidea.cn/index.php/archives/541/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>简单的PHP socket编程</title>
		<link>http://beyondidea.cn/index.php/archives/526</link>
		<comments>http://beyondidea.cn/index.php/archives/526#comments</comments>
		<pubDate>Wed, 25 Aug 2010 08:02:57 +0000</pubDate>
		<dc:creator>wl1011</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[socket]]></category>
		<category><![CDATA[php-socket]]></category>

		<guid isPermaLink="false">http://blog.donews.com/wl1011/?p=526</guid>
		<description><![CDATA[简单的PHP socket编程        <div style="text-align:center;margin-top:10px;margin-bottom:15px;">
        <script type="text/javascript"><!--
        google_ad_client = "ca-pub-0297441349139103";
        /* feed_468x60 */
        google_ad_slot = "7402452313";
        google_ad_width = 468;
        google_ad_height = 60;
        //-->
        </script>
        <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
        </script></div>]]></description>
			<content:encoded><![CDATA[<p>&lt;?php<br />
/**<br />
 * 客户端代码<br />
 */<br />
 <br />
error_reporting(0);<br />
set_time_limit(0);<br />
echo &#8221; TCP/IP Connection \n&#8221;;</p>
<p>$service_port = 10001;<br />
$address = &#8220;127.0.0.1&#8243;;<br />
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);<br />
if ($socket === false)<br />
{<br />
    echo &#8220;socket_create() failed: reason: &#8221; . socket_strerror(socket_last_error()) . &#8220;\n&#8221;;<br />
    die;<br />
}<br />
else<br />
{<br />
    echo &#8220;OK.\n&#8221;;<br />
}</p>
<p>echo &#8220;试图连接 &#8216;{$address}&#8217; 端口 &#8216;{$service_port}&#8217;&#8230;\n&#8221;;<br />
if (socket_connect($socket, $address, $service_port) == false)<br />
{<br />
    $error = socket_strerror(socket_last_error());<br />
    echo &#8220;socket_connect() failed.\n&#8221;,&#8221;Reason: {$error} \n&#8221;;<br />
    die;<br />
}<br />
else<br />
{<br />
    echo &#8220;连接OK\n&#8221;;<br />
}</p>
<p>$in   = &#8220;Hello World\r\n&#8221;;<br />
if (socket_write($socket, $in, strlen($in)) === false)<br />
{<br />
    echo &#8220;socket_write() failed: reason: &#8221; . socket_strerror(socket_last_error()) .&#8221;\n&#8221;;<br />
    die;<br />
}<br />
else<br />
{<br />
    echo &#8220;发送到服务器信息成功！\n&#8221;,&#8221;发送的内容为: $in  \n&#8221;;<br />
}</p>
<p>$out  = &#8221;;<br />
while ($out = socket_read($socket, 8192))<br />
{<br />
    echo &#8220;接收服务器回传信息成功！\n&#8221;,&#8221;接受的内容为:&#8221;, $out;<br />
}<br />
echo &#8220;关闭SOCKET&#8230;\n&#8221;;<br />
socket_close($socket);<br />
echo &#8220;关闭OK\n&#8221;;<br />
?&gt;</p>
<p>&lt;?php<br />
/**<br />
 * 服务器端代码<br />
 *<br />
 */</p>
<p>//确保在连接客户端时不会超时<br />
set_time_limit(0);</p>
<p>//设置IP和端口号<br />
$address = &#8217;127.0.0.1&#8242;;<br />
$port = 10001; //调试的时候，可以多换端口来测试程序！</p>
<p>//创建一个SOCKET<br />
if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false)<br />
{<br />
    echo &#8220;socket_create() 失败的原因是:&#8221; . socket_strerror(socket_last_error()) . &#8220;\n&#8221;;<br />
    die;<br />
}</p>
<p>//阻塞模式<br />
if (socket_set_block($sock) == false)<br />
{<br />
    echo &#8220;socket_set_block() 失败的原因是:&#8221; . socket_strerror(socket_last_error()) . &#8220;\n&#8221;;<br />
    die;<br />
}</p>
<p>//绑定到socket端口<br />
if (socket_bind($sock, $address, $port) == false)<br />
{<br />
    echo &#8220;socket_bind() 失败的原因是:&#8221; . socket_strerror(socket_last_error()) . &#8220;\n&#8221;;<br />
    die;<br />
}</p>
<p>//开始监听<br />
if (socket_listen($sock, 4) == false)<br />
{<br />
    echo &#8220;socket_listen() 失败的原因是:&#8221; . socket_strerror(socket_last_error()) . &#8220;\n&#8221;;<br />
    die;<br />
}</p>
<p>do<br />
{<br />
    if (($msgsock = socket_accept($sock)) === false)<br />
    {<br />
        echo &#8220;socket_accept() failed: reason: &#8221; . socket_strerror(socket_last_error()) . &#8220;\n&#8221;;<br />
        die;<br />
    }</p>
<p>    //发到客户端<br />
    $msg = &#8220;welcome \n&#8221;;<br />
    if (socket_write($msgsock, $msg, strlen($msg)) === false)<br />
    {<br />
        echo &#8220;socket_write() failed: reason: &#8221; . socket_strerror(socket_last_error()) .&#8221;\n&#8221;;<br />
        die;<br />
    }</p>
<p>    echo &#8220;读取客户端发来的信息\n&#8221;;<br />
    $buf = socket_read($msgsock, 8192);<br />
    echo &#8220;收到的信息: $buf   \n&#8221;;<br />
   <br />
    socket_close($msgsock);<br />
} while (true);</p>
<p>socket_close($sock);<br />
?&gt;</p>
        <div style="text-align:center;margin-top:10px;margin-bottom:15px;">
        <script type="text/javascript"><!--
        google_ad_client = "ca-pub-0297441349139103";
        /* feed_468x60 */
        google_ad_slot = "7402452313";
        google_ad_width = 468;
        google_ad_height = 60;
        //-->
        </script>
        <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
        </script></div>]]></content:encoded>
			<wfw:commentRss>http://beyondidea.cn/index.php/archives/526/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

