06月 29, 2011

总揽
前瞻:lookahead
后顾: lookbehind
在perl风格的正则表达式中
非捕获的语法是:(?:)
前瞻的语法是:(?=)
后顾的语法是:(?<=) 他们三者的共同点就是与普通子模式的()不同,不会捕获这些特殊模式内的匹配一下的例子只是为了说明功能编写,并非是实际使用中比较好的方法。
非捕获
先拿非捕获来说:
非捕获表达式
/(?:music) is the key/
正常的捕获子模式
/(music) is the key/
都匹配
music is the key
在选择后引用\1的时候,(?:)由于是非捕获组,所以\1无值。()是正常的捕获子模式,所以\1就是music

前瞻和非捕获
匹配字符串
J'taime
或者
J'laime
非捕获的表达式:
/J'(?:[tl]aime)/
和前瞻(lookahead)
/J'(?=[tl]aime)/
在这里,非捕获和前瞻都能匹配J'taime或者J'laime,并且后引用的\1都是无值。
那么它们有什么区别呢
如果你用php的preg_match
看看它对第三个参数的返回
实际上
非捕获(?:)匹配了整个的
J'taime
而前瞻(?=)只匹配了
J'
这个怎么理解呢?
再看下面的例子
同样还是匹配
J'taime
非捕获用
/J'(?:taime)taime/
前瞻用
/J'(?=taime)taime/
结果,非捕获(?:)无法匹配,因为它实际要匹配的是
J'taimetaime
而前瞻则可以正确匹配,并且匹配的结果就是J'taime
这就是非捕获和前瞻的区别
非捕获尽管不捕获字符,但是它在匹配中还是占了实际的字符的位置的,也就是说匹配了(?:)内的内容以后,便开始从这个匹配之后再继续检查
就像匹配了:
taime
之后,便从这个taime往后开始检查
而前瞻(lookahead) (?=)的内容只是提供了一种预测的功能,表达式
/J'(?=taime)taime/
在匹配到'之后,前瞻开始预测下面的字符,如果符合表达式,那么就继续从这个单引号之后开始匹配。并不占据实际的字符位置。

后顾与前瞻
后 顾(lookbehind) (?<=)与前瞻(lookahead)一样,提供的一种预测前面(behind,说的是“后面”,所谓的“后面”,其实就是前面的字符,我们阅读 顺序是从左往右,越后就是越左)字符的匹配,表达式 /(?<=J')taime/
同样匹配
J'taime
但是匹配的内容是taime,taime前面的内容就是后顾要预测的内容。

负前瞻与负后顾
常规的前瞻与后顾分别是(?=)与(?<=) 负前瞻和负后顾分别是(?!)(?的内容必须不如此
负前瞻与负后顾实用中我遇到的还比较少,请看下面的一些例子。

前瞻与后顾用在替换
下面讲一个实际的例子
设想有个目录
/home/a/b
a目录与b目录有一些PHP文件,这些文件都用相对路径引用了
/home/a/comm/
/home/a/inc
下面的一些文件
如果你把a目录的一批文件移动到b目录
那么原a目录的文件引用的仍然是当前目录的
./comm/
./inc

comm/
inc/
原b目录的文件则是正确的
../comm/
../inc/
我们需要将那些非../开头的目录的引用文件改成../开头的
比如c.php
require './comm/global.php';
require_once("comm/user.php");
require_once 'comm/conn.php';
require_once "inc/inc.inc";
……..

我们要替换require引入的那些文件,其他的图片等都是正确的。
我们先要确立要替换那一行的代码的唯一性,按照普通的方式,就是匹配
/(require.*['"])(?![.]{2})(.*)(['"])/
替换成
\1../\2\3
这里就用到了负前瞻,表示引号后面的第一个内容,必须不是两个”..”,如果是,则整个匹配失效。所以就可以跳过包含正确路径的文件,捕捉错误路径的文件
但是这种方式比较傻,其实后引用的\1,\3完全可以不要,我们要改造的只有\2
但是如何在确立代码的唯一性的前提下,又不匹配那些用来确定唯一性的字符呢?
我们利用前瞻后顾提出如下思路:
1.预测前面的内容,但不捕获(lookbehind)
2.中间要改造的path
3.预测后面的内容,但不捕获(lookahead)
我们把\1,\3变成预测,修改表达式如下:
/ #模式开始
(?<= #后顾开始预测前面的内容
require.*['"] #要预测的内容
) #后顾预测结束
(?![.]{2}) #要跳过的正确路径
(.*) #子模式真正要匹配捕捉并替换的内容path
(?=['"]) #前瞻用来预测下面的必须是引号
/x #x的作用就是消除注释和空白
这里匹配require那段我们用到了后顾,但是为什么不用前瞻?
前瞻(?=)虽然也预测
require….."
这样的内容,但是它是一种超前预测,也就是预测下面的内容,
所以在确定下面的内容是正确的之后,就开始从require的开头继续匹配
(预测结束从这里开始匹配)require….."
但是后顾预测的是前面的内容,也就是说
require……"(预测结束从这里开始匹配,也就是路径开始的部分了)
由此看来,后顾才是我们想要的方式
但是很不幸,上面的表达式在PHP中无法起作用
也许是PHP版本的问题
我的后顾内部:
不支持? * +这样的量词
不支持子模式()的后引用\n

前瞻与后顾用在拆分
这是改自PHP Programming的例子
如下字符
saisai from marssurfchen from earth
等等,我们需要拆分成
1.人名
2.介词+地点
普通的explode,
以from为分隔符的话,拆分后就变成
array('saisai','mars');
array('surfchen','earth')
把from给丢了
此时如果用前瞻与后顾
/(?=from)/
告诉程序,如果下一个就是from那么就从这开始分吧。(这其实就是个空字符,from前面的空字符,从它断开人名与from)
结果就是
array("saisai","from mars");
array("surfchen","from earth");
如果用后顾,告诉程序 ,如果上面是from,那么就开始分吧
/(?<=from)/
结果就是
array("saisai from","mars");
array("surfchen from","earth");
至此就讲这么多
相关PHP函数就是preg_split()

一个实际的例子
问题来自http://www.phpx.com/viewarticle.php?id=134675

$str="id,name,pass,to_char(UNIT_DATE,'YYYY-MM-DD HH24:MI:SS'),level";
上面这个字符串怎么分割开,得到数组:
id
name
pass
to_char(UNIT_DATE,'YYYY-MM-DD HH24:MI:SS')
level

解:

这是用前瞻进行拆分的实际例子

Tags: .
01月 20, 2011

1,简单替换表达式

替换命令可以在全文中用一个单词替换另一个单词:

:%s/four/4/g

“%” 范围前缀表示在所有行中执行替换。最后的 “g” 标记表示替换行中的所有匹配点。如果仅仅对当前行进行操作,那么只要去掉%即可

如果你有一个象 “thirtyfour” 这样的单词,上面的命令会出错。这种情况下,这个单词会被替换成”thirty4″。要解决这个问题,用 “\<" 来指定匹配单词开头:

:%s/\” 来解决这个问题:

:%s/\/4/g

如果你在编码,你可能只想替换注释中的 “four”,而保留代码中的。由于这很难指定,可以在替换命令中加一个 “c” 标记,这样,Vim 会在每次替换前提示你:

:%s/\/4/gc

2,删除多余的空格

要删除这些每行后面多余的空格,可以执行如下命令:

:%s/\s\+$//

命令前面指明范围是 “%”,所以这会作用于整个文件。”substitute” 命令的匹配模式是

“\s\+$”。这表示行末($)前的一个或者多个(\+)空格(\s)。替换命令的 “to” 部分是空的:”//”。这样就会删除那些匹配的空白字符。

3,匹配重复性模式

星号项 “*” 规定在它前面的项可以重复任意次。因此:

/a*

匹配 “a”,”aa”,”aaa”,等等。但也匹配 “” (空字串),因为零次也包含在内。星号 “*” 仅仅应用于那个紧邻在它前面的项。因此 “ab*” 匹配 “a”,”ab”,”abb”,”abbb”,等等。如要多次重复整个字符串,那么该字符串必须被组成一个项。组成一项的方法就是在它前面加 “\(“,后面加 “\)”。因此这个命令:

/\(ab\)*

匹配: “ab”,”abab”,”ababab”,等等。而且也匹配 “”。

要避免匹配空字串,使用 “\+”。这表示前面一项可以被匹配一次或多次。

/ab\+

匹配 “ab”,”abb”,”abbb”,等等。它不匹配 后面没有跟随 “b” 的 “a”。

要匹配一个可选项,用 “\=”。 例如:

/folders\=

匹配 “folder” 和 “folders”。

4,指定重复次数

要匹配某一项的特定次数重复,使用 “\{n,m}” 这样的形式。其中 “n” 和 “m” 都是数字。在它前面的那个项将被重复 “n” 到 “m” 次 (|inclusive| 包含 “n” 和 “m”)。例如:

/ab\{3,5}

匹配 “abbb”,”abbbb” 以及 “abbbbb”。

当 “n” 省略时,被默认为零。当 “m” 省略时,被默认为无限大。当 “,m” 省略时,就表示重复正好 “n” 次。例如:

模式 匹配次数

\{,4} 0,1,2,3 或 4

\{3,} 3,4,5,等等

\{0,1} 0 或 1,同 \=

\{0,} 0 或 更多,同 *

\{1,} 1 或 更多,同 \+

\{3} 3

5,多选一匹配

在一个查找模式中,”或” 运算符是 “\|”。例如:

/foo\|bar

这个命令匹配了 “foo” 或 “bar”。更多的抉择可以连在后面:

/one\|two\|three

匹配 “one”,”two” 或 “three”。

如要匹配其多次重复,那么整个抉择结构须置于 “\(” 和 “\)” 之间:

/\(foo\|bar\)\+

这个命令匹配 “foo”,”foobar”,”foofoo”,”barfoobar”,等等。

再举个例子:

/end\(if\|while\|for\)

这个命令匹配 “endif”,”endwhile” 和 “endfor”。

Tags: .
12月 28, 2010

原文点击查看

Linux下编程一直被诟病的一点是: 没有一个好用的IDE, 但是听说Linux牛人, 黑客之类的也都不用IDE. 但是对我等从Windows平台转移过来的Coder来说, 一个好用的IDE是何等的重要啊, 估计很多人就是卡在这个门槛上了, “工欲善其事, 必先利其器”嘛, 我想如果有一个很好用的IDE, 那些Linux牛人也会欢迎的. 这都是劳动人民的美好愿望罢了, 我今天教大家把gvim改装成一个简易IDE, 说它”简易”是界面上看起来”简易”, 但功能绝对不比一个好的IDE差, 该有的功能都有, 不该有的功能也有, 你就自己没事偷着乐吧, 下面我开始介绍今天的工作了.
(阅读全文……)

Tags: .

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 中查看一个文件中包含的函数列表, 或是一个类包含的方法列表, 为编程人员提供了极大方便。 推荐大家一定要安装!

安装注意事项: 有的系统内置的 ctags 功能太弱, 推荐大家安装 EXUBERANT CTAGS, 这个东西功能比较强大, 居然连 HTML 里面内嵌的 Java Script 都能够支持, 实在是匪疑所思!

滇狐个人习惯: 滇狐习惯把方法列表放在屏幕的右侧, 于是在 .vimrc 中设置了

let Tlist_Use_Right_Window=1
另外, 滇狐习惯让当前不被编辑的文件的方法列表自动折叠起来, 这样可以节约一些屏幕空间, 于是在 .vimrc 中设置了

let Tlist_File_Fold_Auto_Close=1。
1.2 A

下载地址: 官方站点

官方描述:

A few of quick commands to swtich between source files and header files quickly.

:A switches to the header file corresponding to the current file being edited (or vise versa)

:AS splits and switches

:AV vertical splits and switches

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.

滇狐评价: 第一眼看到这个东西时, 总觉得它功能太简单, 似乎没有什么用处。 用过之后, 才发现这项功能对于一个程序员来说是如何重要!

1.3 Win Manager

下载地址: 官方站点

官方描述: 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.

滇狐评价: 非常好用的东西, 在屏幕上打开一个文件浏览器, 这样就可以方便地选择要编辑的文件了。

默认情况下, winmanager 依赖于 bufexplorer, 到这里下载。 如果你不喜欢 bufexplorer 插件的话 可以在你的 .vimrc 中添加这条命令禁用它:

let g:winManagerWindowLayout = “FileExplorer”
这样就不需要下载该插件了。

滇狐为 winfileexplorer.vim 加了一个补丁, 提供了使用系统默认打开方式打开选中文件的功能, 只要把光标放在想要打开的文件上, 然后按“S”就可以了 (注意是大写)。 这样以后就可以直接在 gvim 里打开 Noatun 或别的播放器, 不用再切换出来找 konqueror 了。
(阅读全文……)

Tags: .
12月 26, 2010

1、 $ ctags –R –c-types=+px ($ 为Linux系统Shell提示符)

2、$ vi –t tag (请把tag替换为您欲查找的变量或函数名)

3、:ts (ts 助记字:tags list, “:”开头的命令为VI中命令行模式命令)

4、:tp (tp 助记字:tags preview)—此命令不常用,可以不用记

5、:tn (tn 助记字:tags next) —此命令不常用,可以不用记

6、 :tag /tag(请把tag替换为您欲查找的变量或函数名)

7、Ctrl + ] 到函数定义或声明 [ + tab

8、Ctrl + T 返回

9、[{ 转到上一个位于第一列的"{"

10、}] 转到下一个位于第一列的”{”

11、{ 转到上一个空行

12、} 转到下一个空行

13、gd 转到当前光标所指的局部变量的定义,gf打开头文件

14、* 转到当前光标所指的单词下一次出现的地方

15、# 转到当前光标所指的单词上一次出现的地方

16、Ctrl+i 前进 Ctrl+o 返回

17、ctrl+z将vi转入后台,fg可返回vi

注意:运行vim的时候,必须在“tags”文件所在的目录下运行。否则,运行vim的时候还要用“:settags=” 命令设定“tags”文件的路径,这样vim才能找到“tags”文件。在完成编码时,可以手工删掉tags文件(帚把不到,灰尘不会自己跑掉^_^)。

注:另外,在windows下,有gvim可以使用。而且,也可以使用ctags。这个ctags可以从其它的软件包的目录里边copy出来。比如ultraedit就带了一个ctags程序。你直接将其copy到gvim的目录下的vim目录下就可以了。

例子:

ctags -R –languages=c++ –langmap=c++:+.inl -h +.inl –c++-kinds=+px –fields=+aiKSz –extra=+q –exclude=lex.yy.cc –exclude=copy_lex.yy.cc

命令太长了,折成两行了,可以考虑把命令的各个参数写到文件里去了(具体做法就不谈了)。

1.

-R

表示扫描当前目录及所有子目录(递归向下)中的源文件。并不是所有文件ctags都会扫描,如果用户没有特别指明,则ctags根据文件的扩展名来决定是否要扫描该文件——如果ctags可以根据文件的扩展名可以判断出该文件所使用的语言,则ctags会扫描该文件。

2.

–languages=c++

只扫描文件内容判定为c++的文件——即ctags观察文件扩展名,如果扩展名对应c++,则扫描该文件。反之如果某个文件叫aaa.py(python文件),则该文件不会被扫描。

3.

–langmap=c++:+.inl

告知ctags,以inl为扩展名的文件是c++语言写的,在加之上述2中的选项,即要求ctags以c++语法扫描以inl为扩展名的文件。

4.

-h +.inl

告知ctags,把以inl为扩展名的文件看作是头文件的一种(inl文件中放的是inline函数的定义,本来就是为了被include的)。这样ctags在扫描inl文件时,就算里面有static的全局变量,ctags在记录时也不会标明说该变量是局限于本文件的(见第一节描述)。

5.

–c++-kinds=+px

记录类型为函数声明和前向声明的语法元素(见第三节)。

6.

–fields=+aiKSz

控制记录的内容(见第四节)。

7.

–extra=+q

让ctags额外记录一些东西(见第四、五节)。

8.

–exclude=lex.yy.cc –exclude=copy_lex.yy.cc

告知ctags不要扫描名字是这样的文件。还可以控制ctags不要扫描指定目录,这里就不细说了。

Tags: .

【前言】

Linux之所以今天仍然只被少数人使用,不能像windows一样进入寻常百姓家,其配置之难之烦,还是很让人不爽。号称Linux编辑器哼哈二将之一的Vim也是难逃此列。虽然很多高手用的得心应手,但是作为初学者往往不知道如何下手。。。

我希望把同为初学者的我的配置经历,以尽量简洁的语言叙述,试图使这个过程看上去不再那么恐怖。

【概念】

代码自动补全和代码跳转阅读,应该是作为程序员最常用的功能之一了,具体二者是指什么我就不解释了。微软的Visual Studio就是靠这两样必杀技牢牢占据着广大windows程序员的心(这里面要有强大的VS插件Visual Assistant X一份功劳)。。。但是Linux程序员其实更幸福,不花钱就能搞定这两大功能。

从本质上说,这二者的实现都依赖于一样东西:tag。tag就是程序中的关键词,在C++中主要包括:变量、函数名、类名等。代码自动补全实际上是 tag的匹配(例如,程序员输入cla时,由于存在class这个c++的tag,就可以用class匹配cla);代码跳转阅读实际上是tag的查找(例如,程序员要查找一个函数func(),只需要在别的文件中寻找这个func这个tag的位置即可)。
(阅读全文……)

Tags: .

Vim本质上只是一个编辑器。但只要配合一些适当的插件,vim也能变成一个全功能的IDE。笔者使用vim已经有挺长一段时间了,经过反复的试验,配置了一个高效的PHP开发环境,实为居家旅行、谋财害命、杀人越货必备之良品。
安装Vim GVIM

sudo apt-get install vim

sudo apt-get install vim-gtk vim-doc cscope

卸载Vim GVIM

sudo apt-get remove –purge vim (–purge 是完全删除,会连配置文件一起删除)

sudo apt-get remove –purge vim-gtk vim-doc cscope

sudo apt-get clean

开始配置vim

Linux 下 vim 默认配置文件 /etc/vim/vimrc

用户默认配置文件 ~/.vimrc

如果想一次配置,所有用户都能使用,那就修改 /etc/vim/vimrc,如果只想当前用户可以使用,则修改 ~/.vim

针对开发配置:

au FileType php,c,java,javascript,html,htm,smarty call SetPhpOption()

function! SetPhpOption()

set expandtab ” 使用空格代替tab

set shiftwidth=4 ” 设定 <> 命令移动时的宽度为 4

set tabstop=4 ” 用4个空格代替1个tab

set sts=4 ” 设置softtabstop 为 4,输入tab后就跳了4格.

set cindent ” C语言方式缩进

set smartindent ” 智能缩进

set autoindent ” 自动缩进

set smarttab ” 只在行首用tab,其他地方的tab都用空格代替

set showmatch ” 在输入括号时光标会短暂地跳到与之相匹配的括号处

” set fdm=indent ” 代码折叠

set lbr

set tw=500

set wrap ” 自动换行

endfunction

用NERDTree实现目录和文件导航

在进行PHP应用开发时,同时编辑多个文件是很正常的事情。所以必须有一个方便的目录导航工具,以便在目录结构间快速切换,找到需要编辑的文件。

vim中提供该类功能的插件很多,比较知名的有project、winmanager等。但笔者个人认为最好用的还是The NERD Tree这个插件。NERDTree不但可以显示完整的目录树结构,还可以将任何一个目录设置为根目录。并且提供了目录导航的书签功能,可谓非常方便。

下载地址:http://www.vim.org/scripts/script.php?script_id=1658

下载文件:NERD_tree.zip

解压缩时,要把压缩包中的目录结构完整的解压缩到 ~/.vim/ 目录中。完成后,应该分别找到 ~/.vim/doc/NERD_tree.txt 文件和 ~/.vim/plugin/NERD_tree.vim 文件。然后在vim中输入命令: helptags ~/.vim/doc,将NERDTree的帮助文档添加到vim中。

现在,命令模式下输入:NERDTreeToggle便可打开或关闭NERDTree

注意:使用过程中,你可能会因为删除一个文件夹,而没有删除这个文件夹所绑定的标签,出现以下错误

NERDTree: 1 invalid bookmarks w…

解决:打开~/.vim/.NERDTreeBookmarks,删除里面无用的标签即可。
用taglist实现代码导航

解决了目录和文件导航问题,我们还要为代码之间的跳转提供辅助手段,taglist就是这样一个插件。taglist可以列出已打开文件中定义的类、函数、常量,甚至变量。

下载地址:http://www.vim.org/scripts/script.php?script_id=273

下载文件:taglist_45.zip

压缩包需要完整解压缩到 ~/.vim/ 目录,并且用:helptags ~/.vim/doc命令索引taglist插件的帮助文档。

taglist插件需要依赖ctags程序才能工作。目前常用的ctags版本是Exuberant Ctags。
安装ctags

下载地址:http://ctags.sourceforge.net/

下载文件:ctags-5.8.tar.gz

解压ctags:tar -zxcf ctags-5.8.tar.gz

进入ctags:cd ctags-5.8

打上PHP补丁(否则按下ctrl+n,连基本的function include等函数都出不来):

wget http://svn.bitflux.ch/repos/public/misc/ctags-php5.patch
patch php.c ctags-php5.patch

编译安装:

./configure

make

sudo make install

经过这三步后就生成 /usr/local/bin/ctags

继续回来修改~/.vim/plugin/taglist.vim

在 if !exists(‘loaded_taglist’)上面加入

let Tlist_Ctags_Cmd=”/usr/local/bin/ctags”

或加在~/.vim/.vimrc文件,只要能让vim开启时加载的*.vim文件即可

此时Ctags和Taglist已经结合起来。

在相应的源码目录运行ctags -R产生相应的tags文件

cd ctags:cd ctags-5.8

ctags -R

拷贝到 ~/.vim/ 目录下

cp tags ~/.vim/

将tags文件在vim运行时导入。可以修改~/.vimrc,以后每次启动vim将自动导入此tags文件

:set tags=~/.vim/tags

并设置语法高亮

syntax enable

syntax on

此时再用vim编辑php文件,就会在右边出现一个当前文件的 类 函数 变量 等东西

使用ctags时, ctrl+]可查看函数的定义。 ctrl+o返回源文件。
小技巧:

细心的朋友可能会发现,作为一个强大的IDE,还应该解决以下几个问题:

1.左边目录树结构不变。

2.代码块注释,删除注释。

3.代码块缩进,删除缩进。

解决问题:

1.一般情况下,我们会以标签的方式打开一个文件(让光标停留在一个要打开的文件上,按 t ),此时左边没有目录树,输入 :NERDTreeToggle打开目录树,此目录树为新建的,和第一个文件的目录树结构不同,这不符合我们普通IDE的习惯,还记得我们用 Netbeans之类的编辑器吗?左边的目录书结构一直没变,其实是所有文件共享一颗树的原因,NERDTree也允许我们共享树,命令是 :NERDTreeMirror,结合Tlist,我的快捷方式定义如下:

map :NERDTreeToggle
map :TlistToggle
map t :NERDTreeMirror

现在,看看我写代码的习惯:

首先,打开vi编辑器。

按 打开目录树

把光标停留在需要建立标签的文件夹上, :Bookmark 收藏名。

以后只需要 打开目录树,Shift+B打开收藏标签,双击一下想打开的标签,再按一次Shift+B关闭收藏标签。

鼠标选中需要打开的文件,按快捷键 ,此时,vi会先执行 t (标签方式打开文件),再执行:NERDTreeMirror共享第一棵树。

怎么样,效果和大型IDE差不多了吧。

2.代码块注释,删除注释

注释:ctrl+v 进入列编辑模式,向上或向下移动光标,把需要注释的行的开头标记起来,然后按大写的I,再插入注释符,比如”//”,再按Esc,就会全部注释了。

删除:ctrl+v 进入列编辑模式,选中注释部分,然后按d,就会删除注释符号。

3.代码块缩进,删除缩进。

缩进:选择需要缩进的代码行(键盘鼠标都可以,选中了就行),>(shift+.)

删除:选择需要缩进的代码行(键盘鼠标都可以,选中了就行),<(shift+,)

.vimrc

” An example for a vimrc file.
” disable VI’s compatible mode..
set nocompatible
” set encoding
set encoding=utf8

” running in gui
if has(“gui_running”)
” set color schema
colorscheme rootwater
endif

” allow backspacing over everything in insert mode
set backspace=indent,eol,start

” Enable syntax highlight
syntax enable
syntax on

set tags=~/.vim/tags ” tagslist文件

” Basic editing options
set history=50 ” keep 50 lines of command line history
set ruler ” show the cursor position all the time
set showcmd ” display incomplete commands
set number ” Show line number
set mouse=a ” Have the mouse enabled all the time
set incsearch ” do incremental searching
” set sts=4
set linebreak
” Develop editing options
au FileType vim setl shiftwidth=2
au FileType vim setl tabstop=2
au FileType html,c,javascript,java,php setl shiftwidth=4 ” 当行之间交错时使用4个空格
au FileType html,c,javascript,java,php setl tabstop=4 ” 用4个空格代替1个tab
au FileType html,c,javascript,java,php setl expandtab ” 使用空格代替tab
” au FileType java,php setl cursorline ” 高亮当前行
au FileType html,c,javascript,java,php setl nobackup ” 不备份
au FileType html,c,javascript,java,php setl hlsearch ” 高亮显示所有匹配
” au FileType html,c,javascript,java,php setl fdm=indent ” 代码折叠
” au FileType html,c,javascript,java,php setl showmatch ” 匹配模式,如:输入一个左括号,右括号自动加上

“au FileType php setl dictionary-=~/.funclist.txt
“au FileType php setl dictionary+=~/.funclist.txt
“au FileType php setl complete-=k
“au FileType php setl complete+=k

set dictionary-=~/.vim/funclist.txt dictionary+=~/.vim/funclist.txt

set complete-=k complete+=k

” Only do this part when compiled with support for autocommands.
if has(“autocmd”)

” Enable file type detection.
” Use the default filetype settings, so that mail gets ‘tw’ set to 72,
” ‘cindent’ is on in C files, etc.
” Also load indent files, to automatically do language-dependent indenting.
filetype plugin indent on

” Put these in an autocmd group, so that we can delete them easily.
augroup vimrcEx
au!

” For all text files set ‘textwidth’ to 78 characters.
autocmd FileType text setlocal textwidth=78

” When editing a file, always jump to the last known cursor position.
” Don’t do it when the position is invalid or when inside an event handler
” (happens when dropping a file on gvim).
autocmd BufReadPost *
\ if line(“‘\”") > 0 && line(“‘\”") <= line("$") |
\ exe "normal! g`\"" |
\ endif

augroup END

else

set autoindent " always set autoindenting on

endif " has("autocmd")

source ~/.vim/map.vim "导入快捷键映射文件
source ~/.vim/taglist.vim "导入taglist配置文件
" — MiniBufferExplorer — "
" let g:miniBufExplMapWindowNavVim = 1
" let g:miniBufExplMapWindowNavArrows = 1
" let g:miniBufExplMapCTabSwitchBufs = 1
" let g:miniBufExplModSelTarget = 1

map.vim
" gd 模式,左:h 右:l 上:j 下:k
map Q gq

" switch buffers with Tab
map <C-Tab> :bn<CR>
map <S-Tab> :bp<CR>

" NERDTree
map <F2>:NERDTreeToggle<CR>
map <F3> :TlistToggle
map t :NERDTreeMirror

nmap <silent> <F8> :call SvnDiffToggle()
nmap <silent> g<F8> :new __SVN_DIFF__<CR>:read !svn diff<CR>:set syntax=diff buftype=nofile<CR>gg
function SvnDiffToggle()
if bufexists("__SVN_DIFF__")
bwipeout __SVN_DIFF__
else
if exists("t:flwsvndiff")
diffoff!
let l:fileName = t:flwsvndiff
unlet t:flwsvndiff
exec "bwipeout " . l:fileName
else
let t:flwsvndiff = expand("%:h") . "/.svn/text-base/" . expand("%:t") . ".svn-base"
let l:ft = &ft

exec "silent vert diffsplit " . t:flwsvndiff
set readonly
set buftype=nofile
exec "set ft=" . l:ft
wincmd p
autocmd VimResized * :wincmd =
endif
endif
endfunction

taglist.vim

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => Plugin configuration
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" taglist
set tags=~/www/hr/tags

let Tlist_Ctags_Cmd="/usr/local/bin/ctags"
let Tlist_Auto_Highlight_Tag = 1
let Tlist_Auto_Open = 0
let Tlist_Auto_Update = 1
let Tlist_Close_On_Select = 0
let Tlist_Compact_Format = 0
let Tlist_Display_Prototype = 0
let Tlist_Display_Tag_Scope = 1
let Tlist_Enable_Fold_Column = 0
let Tlist_Exit_OnlyWindow = 1
let Tlist_File_Fold_Auto_Close = 0
let Tlist_GainFocus_On_ToggleOpen = 1
let Tlist_Hightlight_Tag_On_BufEnter = 1
let Tlist_Inc_Winwidth = 0
let Tlist_Max_Submenu_Items = 1
let Tlist_Max_Tag_Length = 30
let Tlist_Process_File_Always = 0
let Tlist_Show_Menu = 1
let Tlist_Show_One_File = 1
let Tlist_Sort_Type = "order"
let Tlist_Use_Horiz_Window = 0
let Tlist_Use_Right_Window = 1
let Tlist_WinWidth = 30
let tlist_php_settings = 'php;c:class;i:interfaces;d:constant;f:function'

Tags: .
10月 25, 2010

转自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 ‘make’ 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 Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.

This program built for i686-pc-cygwin
$ gcc -v
Reading specs from /usr/lib/gcc/i686-pc-cygwin/3.4.4/specs
Configured with: /managed/gcc-build/final-v3-bootstrap/gcc-3.4.4-999/configure -
-verbose –program-suffix=-3 –prefix=/usr –exec-prefix=/usr –sysconfdir=/etc
–libdir=/usr/lib –libexecdir=/usr/lib –mandir=/usr/share/man –infodir=/usr/s
hare/info –enable-languages=c,ada,c++,d,f77,pascal,java,objc –enable-nls –wit
hout-included-gettext –enable-version-specific-runtime-libs –without-x –enabl
e-libgcj –disable-java-awt –with-system-zlib –enable-interpreter –disable-li
bgcj-debug –enable-threads=posix –enable-java-gc=boehm –disable-win32-registr
y –enable-sjlj-exceptions –enable-hash-synchronization –enable-libstdcxx-debu
g
Thread model: posix
gcc version 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
$ cd /usr/src
$ explorer .
(拷贝mysql-5.1.50.tar.gz进去C:\cygwin\usr\src)
$ tar zxvf mysql-5.1.50.tar.gz
$ cd mysql-5.1.50
(下面步骤参考自http://www13.atwiki.jp/uhaku/pages/51.html)
$ CFLAGS=”-O3 -march=i686″ \
CXXFLAGS=”-O3 -march=i686 -felide-constructors \
-fno-exceptions -fno-rtti” \
./configure \
–with-innodb \
–enable-local-infile \
–prefix=/usr/local/mysql \
–localstatedir=/usr/local/mysql/data \
-with-extra-charsets=all \
–with-unix-socket-path=/tmp/mysql.sock
(建议关闭360等杀毒软件,防止一些不必要的麻烦)
(如果configure过程出现cpu持续不降而无法前进,
可以在任务管理器中关闭有问题的gcc-3.exe进程)
$ make
(出现第一个错误:
readline/readline.h:70:29: sys/ttydefaults.h: No such file or directory
用notepad2或者写字板打开
C:\cygwin\usr\src\mysql-5.1.50\cmd-line-utils\libedit\readline\readline.h
把#include 注释掉
)
(出现第二个错误:
vi.c:918:74: macro “__weak_reference” requires 2 arguments, but only 1 given
参考http://www.cygwin.com/ml/cygwin/2010-01/msg01124.html的补丁
用notepad2或者写字板打开
C:\cygwin\usr\src\mysql-5.1.50\cmd-line-utils\libedit\vi.c

#if defined(__weak_reference) && !defined(__FreeBSD__)
前面加上
#ifdef __CYGWIN__
#undef __weak_reference
#endif
)
(漫长的编译。。。)
(如果编译过程出现cpu持续不降而无法前进,
可以Ctrl+C中断编译或结束gcc-3.exe进程然后重新执行make)
$ make install
(如果编译过程出现cpu持续不降而无法前进,
可以Ctrl+C中断编译或结束gcc-3.exe进程然后重新执行make install)
(有些步骤耗时会比较长,需要耐心等候:
make[4]: Entering directory `/usr/src/mysql-5.1.50/mysql-test’
没有回显,所以感觉会很长,可以查看任务管理器install.exe的命令行

$ ./scripts/mysql_install_db
$ cp support-files/my-medium.cnf /etc/my.cnf
(关闭防火墙和原有mysql服务)
$ /usr/local/mysql/bin/mysqld_safe \
–datadir=/usr/local/mysql/data \
–log-error=/var/log/mysql.log &
$ ps
(正常的话看到mysqld的存在:/usr/local/mysql/libexec/mysqld)
$ /usr/local/mysql/bin/mysqlshow -u root
+——————–+
| Databases |
+——————–+
| information_schema |
| mysql |
| test |
+——————–+
$ /usr/local/mysql/bin/mysql -u root
mysql>status;
mysql>exit;
Bye
$ /usr/local/mysql/bin/mysqladmin -u root shutdown -h 127.0.0.1
$ ps
(现在看不到mysqld了)

Tags: .
09月 1, 2010

1. 随机数包

SELECT DBMS_RANDOM.VALUE
  FROM DUAL;

2. 在[0..100]范围内取随机数

SELECT TRUNC (DBMS_RANDOM.VALUE (0, 100))
  FROM DUAL;

3. 大于字符‘A’的10个字符随机字符串

SELECT DBMS_RANDOM.STRING ('A', 10)
  FROM DUAL;

4. 单个小写随机字符

SELECT CHR (ROUND (DBMS_RANDOM.VALUE (97, 122)))
  FROM DUAL;

5. 在过去10天内取随机日期

SELECT TO_DATE (TRUNC (DBMS_RANDOM.VALUE (TO_NUMBER (TO_CHAR (SYSDATE - 10,
                                                              'J'
                                                             )
                                                    ),
                                          TO_NUMBER (TO_CHAR (SYSDATE, 'J'))
                                         )
                      ),
                'J'
               )
  FROM DUAL;

6. 在过去30分钟内取随机时间

SELECT (SYSDATE - 1 / 24 / 60 * 30) + DBMS_RANDOM.VALUE (1, 1800) / 3600 / 24
  FROM DUAL;

Oracle随机函数


Sql代码
--创建55到100之间随机数   

select dbms_random.value, dbms_random.value(55,100)  from dual;    

--创建2009年内的随机时间   

SELECT
to_timestamp('2009-01-01 00:00:01','yyyy-mm-dd HH24:MI:SS') +DBMS_RANDOM.VALUE(1,365*24*3600)/3600/24
FROM DUAL    

--随机查看前N条记录(随机读取表内容)   

SELECT * FROM (SELECT * FROM chifan  ORDER BY dbms_random.random) WHERE ROWNUM<=5

unix/linux 时间戳转换为标准时间格式(主要是注意时区问题):

sql代码

select TO_DATE('19700101','yyyymmdd') + 1235728935/86400 +TO_NUMBER(SUBSTR(TZ_OFFSET(sessiontimezone),1,3))/24 from dual,其中1235728935就是unix/linux时间戳,转换完之后就表示为 2009-2-27 18:02:15。

反过来也一样,还是要考虑时区

select (to_date('2009-2-27 18:02:15','yyyy-mm-dd hh24:mi:ss') - to_date('1970-1-1','yyyy-mm-dd'))*86400- TO_NUMBER(SUBSTR(TZ_OFFSET(sessiontimezone),1,3))*3600 from dual
Tags: .
08月 27, 2010

php 高级编程之编码风格

1 Code Formatting and Layout 代码格式和布局

Indentation 缩格

Although indentation is not mandatory in PHP, it is a powerful visual organization
tool that you should always consistently apply to code.
尽管缩格在PHP中不是强制的(python中确实语法),它是强有力的视觉组织工具,你应该一直坚持在代码中使用它

考虑下述代码:

if($month == ‘september’ || $month == ‘april’ || $month == ‘june’ || $month ==
‘november’) { return 30;
}
else if($month == ‘february’) {
if((($year % 4 == 0) &amp;&amp; !($year % 100)) || ($year % 400 == 0)) {
return 29;
}
else {
return 28;
}
}
else {
return 31;
}

跟下面这段代码进行比较

if($month == ‘september’ ||
$month == ‘april’ ||
$month == ‘june’ ||
$month == ‘november’) {
    return 30;
}
else if($month == ‘february’) {
    if((($year % 4 == 0) &amp;&amp; ($year % 100)) || ($year % 400 == 0)) {
        return 29;
}
else {
    return 28;
}
}
else {
    return 31;
}

这段代码后者的版本比前者更容易去理解整体的逻辑循环。 (阅读全文……)