Tuesday, March 27, 2007

1、安装MS字体
cd /usr/share/fonts
sudo mkdir zh_CN
然后将MS的字体文件(simsun.ttc tahoma.ttf verdana.ttf verdanab.ttf verdanaz.ttf tahomabd.ttf verdanai.ttf)复制到zh_CN目录下,然后

程序代码 程序代码
cd zh_CN
sudo mkfontscale
sudo mkfontdir
sudo fc-cache


注意,有不少朋友反映重启后,出现乱码,所以如果不以是root身份登录到系统进行修改的,而只是用sudo的方式建议再使用下面的命令,修改新增加的字体的权限
sudo chmod 644 /usr/share/fonts/zh_CN/*

2、修改language-selector.conf文件


程序代码 程序代码
sudo cp /etc/fonts/language-selector.conf /etc/fonts/language-selector.conf_backup
sudo gedit /etc/fonts/language-selector.conf


使用下面的代码替换掉里面的全部内容,注意,我这里没有按照Vstar的把文泉驿字体放到第二位,而是直接把宋体(Siumu)放到第二位,因为没有用文泉驿的字体,所以把文泉驿的字体那个 family和string项都删除了。这样一来,如果系统中要使用中文字体,首先用到的就是宋体。


程序代码 程序代码





serif



Bitstream Vera Serif
SimSun
DejaVu Serif
AR PL ShanHeiSun Uni
AR PL ZenKai Uni







sans-serif



Bitstream Vera Sans
Simsun
DejaVu Sans
AR PL ShanHeiSun Uni
AR PL ZenKai Uni








monospace



Bitstream Vera Sans Mono
Simsun
DejaVu Sans Mono
AR PL ShanHeiSun Uni
AR PL ZenKai Uni









SimSun
Song
Sun
Kai
Ming


100




180





true







SimSun
宋体
宋体-18030
Song
Sun
Kai
Ming
黑体
新宋体
新宋体-18030
楷体_GB2312
仿宋_GB2312
隶体
SimSun-18030
SimHei
NSimSun
NSimSun-18030
KaiTi_GB2312
FangSong_GB2312
LiSu




false





0





true





false





true





12




24




false








3、按Ctrl+Alt+Backspace重启X-windows,应该是这样的功能吧。呵呵。
然后再到“系统”“首选项”“字体”中进行设置,注意,设置中还是有一些重要的地方,不然效果还是不太理想。

注意1、在字体选项中
字体全部设置为9号,如果效果和MS Windows的效果不太一样,请全部选择使用THOMA字体,然后全部设置为8号,如下图

jsp页面中设置 自动下载成Excel报表

meta http-equiv="Content-Type" contect="application/vnd.ms-Excel"

Sunday, March 25, 2007

install scim to ubuntu

如何安装中文输入法 (SCIM)

以下信息假设您已经安装了中文支持,若不知道如何安装请参考 这里

请注意,SCIM已经安装了默认的精简版, 要安装中文,日文或韩文支持请使用 系统>管理>语言支持. wiki有更多准确的信息

* Read #概述
* Read #如何安装额外的软件外
* Read #如何安装额外的字体

sudo apt-get install language-pack-gnome-zh language-pack-gnome-zh-base language-pack-zh language-pack-zh-base language-support-zh
sudo apt-get install scim scim-modules-socket scim-modules-table scim-pinyin scim-tables-zh scim-input-pad
sudo sh -c " echo 'export XMODIFIERS=@im=SCIM ; export GTK_IM_MODULE="scim" ; scim -d ' > /etc/X11/Xsession.d/95xinput "
sudo chmod 755 /etc/X11/Xsession.d/95xinput

* 英文环境下运行SCIM请修改环境设置如下:

sudo gedit /etc/environment

LANGUAGE="en_US:en"
LC_CTYPE="zh_CN.UTF-8"
LANG="en_GB.UTF-8"
GST_ID3_TAG_ENCODING=GBK

* 你可以在这里找到设置 系统 -> 首选项 -> SCIM 输入法设置
* 运行SCIM

按 'Ctrl + Space'

[edit]

Thursday, March 22, 2007

vim 命令

名称
vim - 改进的vi,程序员的文本编辑器
大纲

vim [options] [file ..]
vim [options] -
vim [options] -t tag
vim [options] -q [errorfile]

ex
view
gvim gview
rvim rview rgvim rgview

描述
Vim 是一个向上兼容于Vi的文本编辑器。用于编辑任何ASCII文本。对于编辑源程序尤其有用。
和VI相比,VIM做了相当大的扩展:多级的undo,多个窗口和缓冲区,句法高亮显示,命令行编辑,文件名的自动完成,在线帮助,可视化的选择,等等。详细的 Vim 和Vi之间的区别可参见"help vi_diff"

在运行 Vim 的时候,使用":help"命令,可以通过在线帮助系统得到许多帮助。参见下面的ON-LINE HELP部分。

大多数时候,可用

vim file


命令,启动 Vim 以编辑单个文件。更常见的启动 Vim 的方法是用这条命令:

vim [options] [filelist]


如果缺少文件列表,编辑器起动运行时会打开一个空的缓冲区。否则,可能使用下面四个参数之一,以选择编辑一个或多个文件。

file ..
文件名列表。第一个作为当前文件,被读入缓冲区。光标会停留在缓冲区的第一行上。使用":next"命令可以切换到其余文件。在文件列表前面加上"--" 可以迅速的启动编辑一个文件。
-
需要编辑的文件来自于标准输入(stdin)。而命令从stderr读入,在这里stderr 应该作为一个终端(tty)。
-t {tag}
这个标签(tag)(就是一系列的goto标记)决定了要编辑的文件和初始的光标位置。在标签文件中查找{tag},将关联的文件作为当前文件,并且执行相关的命令。大多数情况下,它用于C程序,这时{tag}可能为一个函数名。好处在于包含该函数的文件会成为当前文件,而且光标会停留在函数开始的地方。参见":help tag_commands"。
-q [errorfile]
以quickFix模式启动。读入文件[errorfile],并显示第一个错误。如果忽略了 [errorfile],文件名会从'errorfile'选项中获得(在Amiga中缺省值是"AztecC.Err" ,在其他系统中是"errors.vim")。使用":cn"可以跳转显示其余的错误。参见":help quick-fix"。
Vim 依据不同的命令参数(执行的可能是同一文件),可能有不同的执行方式。

vim
"正常"模式,所有选项都取缺省值。
ex
以Ex模式开始。用":vi"命令可进入正常模式。也可采用"-e"参数执行。
view
以"只读"模式开始。 文件被写保护。 也可采用"-R"参数执行。
gvim gview
图型用户界面,开始一个新窗口。也可采用"-g"参数执行。
rvim rview rgvim rgview
同上,但有所限制。 不能开启命令解释器,也不能挂起 Vim. 。也可采用"-Z"参数。

选项
选项可任意顺序,可在文件名之前或之后。不带参数的选项可组合在单个"破折号"之后。
+[num]
光标定位在首文件的指定行(num)上。若行号(num)为空,光标则定位于最末行。
+/{pat}
光标定位在首文件的第一个{pat}出现的位置。关于有效查找模式,可参阅":help search_pattern"。
+{command}
-c {command}
命令({command})将在第一个文件读取之后执行。该命令是作为"Ex command"解释。若该命令({command})包含空格,则必需用双引号包括(依据采用的解释器)。例如:Vim "+set si" main.c
注意:最多可采用十个"+"或"-c"命令。
-b
二进制模式。少用的选项,用来设置编辑二进制或可执行文件。
-C
兼容模式,设置'兼容模式(compatible)'选项。即使在".vimrc"文件存在的情况下,也使得 Vim 很像Vi。
-d {device}
打开设备(device)作为终端。只用于Amiga。例如: "-d con:20/30/600/150"。
-e
用Ex模式开启 Vim ,就好像执行调用"ex"。
-f
前台模式。对图形用户界面, Vim 开启时与命令解释器不分离,对Amiga, Vim 并不以新窗口重开。当 Vim 被一个程序用来等待编辑进程结束(如邮件程序),需采用该模式。对amiga,":sh"和":!"命令将无效。
-F
如果 Vim 采用FKMAP(采用自右向左编辑文件、波斯语键盘映射)支持模式编译,该选项使得 Vim 以波斯语模式开始,也就是设置了"fkmap"和"rightleft"选项。否则将出现错误信息, Vim 也将中断。
-g
如果 Vim 采用GUI支持模式编译,该选项使GUI生效,若未以GUI支持模式编译,将出现错误信息, Vim 也将中断。
-h
Vim 退出之后给出一些命令行参数和选项的帮助。
-H
如果 Vim 采用RIGHTLEFT(采用自右向左编辑文件、希伯来语键盘映射)支持模式编译,该选项使得 Vim 以希伯来语模式开始,也就是设置了"hkmap"和"rightleft"选项。否则将出现错误信息, Vim 也将中断。
-i {viminfo}
当使用viminfo文件的使用有效,该选项使用该文件名来代替缺省的"~/.viminfo"文件。也可使用"NONE"来跳过".viminfo"文件的使用。
-L
与-r相同。
-l
Lisp模式。把'lisp'和'showmatch'选项设置为开。
-m
禁止进行修改文件。重新设置'write'选项,以使修改文件成为不可能的。
-N
非兼容模式。 重新设置'compatible'选项。这个设置将使 Vim 的性能得到一点提高,但同时牺牲了与VI的兼容性,就是在.vimrc文件不存在的时候也是如此。
-n
不使用交换文件。所以在出意外时,文件不能恢复。如果你在一慢速介质(如:软盘)上编辑文件,请随时手工存盘。此参数也可以通过在命令状态输入":set uc=0"设置。取消此项功能则在命令行输入":set uc=200"。
-o[N]
打开N个窗口。如果忽略了N,就为每个文件打开一个窗口。
-R
只读模式。将设置'readonly'选项。你仍然可以编辑缓冲区,但可以防止你无意地覆盖文件。如果你需要覆盖文件,就为Ex命令增加一个惊叹号,如":w!"。 -R选项还隐含了 -n 选项(见下)。可以用":set noro"重新设置'readonly'选项。参见":help 'readonly'"。
-r
列举对换文件,以及关于把它们用于恢复的信息。
-r {file}
恢复模式。对换文件用来恢复被破坏的编辑过程。对换文件的文件名是在原文件的文件名后加上".swp"后缀名。参见":help recovery"。
-s
寂静模式。 只能在命令状态下启动,或在"-s"参数前加上"-e"参数。
-s {scriptin}
此参数读入脚本文件{scription}。文件中的字符就象你敲入的那样被解释。你也可以在命令状态下使用":source! {scription}"来设置此模式。如果编辑器退出之前就已经读到了脚本文件的底部,那么编辑器就将从键盘键入中读入字符。
-T {terminal}
告诉 Vim 你要使用的终端名。只有在自动方式无法工作是才使用。使用的终端必须是 Vim 知道的内建终端,或者是在termcap或terminfo文件中定义的终端。
-u {vimrc}
此参数使用{vimrc}指定的文件中的命令来初始化。其它的初始化都将被忽略。用本选项编辑特殊类型的文件。也可以将{vimrc}设置为"NONE"来跳过所有的初始化。关于更多细节,在vim中参见":help initialization"。
-U {gvimrc}
此参数使用文件{gvimrc}中的命令来进行GUI初始化。其它的GUI初始化都将被跳过。也可以将{gvimrc}设置为"NONE"来忽略所有的GUI初始化。关于更多细节,在vim中参见": help gui_init"。
-V
冗余。 给出关于哪些被作为源文件的和用来读写一个viminfo文件的文件消息。
-v
以Vi模式启动 Vim ,就象可执行文件的文件名是"vi"一样。 这只在可执行文件被称为"ex"的时候才有影响。
-w {scriptout}
所有你输入的字符都被记录在文件{scriptout}中,直到你退出 Vim 。如果你想创建一个脚本文件用来和"vim -s"或":source!"使用时,它就是有作用的。如果{scriptout}文件存在,就附加一些字符。
-W {scriptout}
类似于-w,但是覆盖已经存在的文件。
-x
通过加密过滤被读写的文件。 还未实现。
-Z
限制模式。 象是可执行的从"r"开始一样工作。
--
意味着选项结束。在这以后的变量将被作为一个文件名来处理。这将能用来编辑一个以一个"-"开始的文件名。

在线帮助
在 Vim 中输入":help"来开始。输入":help subject"来在具体的主题上获得帮助。例如:输入"help ZZ"来获得关于"ZZ"命令的帮助。使用和CTRL-D来完成主题(":help cmdline_completion")。用标签来表示在从一个位置到另一个的跳转(超级链接类型,见":help")。所有的文档文件都能用这种方式来观看,例如":help syntax.txt"。
文件
/usr/share/vim/vim54/doc/*.txt
Vim 文档文件。使用":help doc-file-list"来得到完整的清单。
/usr/share/vim/vim54/doc/tags
标记文件用来找到在文档文件中的信息。
/usr/share/vim/vim54/syntax/syntax.vim
系统广泛的语法初始化。
/usr/share/vim/vim54/syntax/*.vim
用于不同语言的语法文件。
/usr/share/vim/vimrc
系统范围的 Vim 初始化操作。
/usr/share/vim/gvimrc
系统范围的gvim初始化操作。
/usr/share/vim/vim54/optwin.vim
用于":options"命令的脚本,一种察看与设置选项的良好方式。
/usr/share/vim/vim54/menu.vim
系统范围的gvim的菜单初始化操作。
/usr/share/vim/vim54/bugreport.vim
用于生成错误报告的脚本。 参见":help bugs"。
/usr/share/vim/vim54/filetype.vim
通过文件名监测文件类型的脚本。 参见":help 'filetype'"。
/usr/share/vim/vim54/scripts.vim
通过文件内容监测文件类型的脚本。 参见":help 'filetype'"。
最新消息请阅读VIM主页:


参见
vimtutor(1)
作者
Vim 的大部分是Bram Moolenaar编写的,其中得到了其他人的大量帮助。参见":help credits"。
Vim 最初为Stevie开发,为Tim Thompson、Tony Andrews和G.R. (Fred) Walter所完善。虽然几乎没有保留任何原始的代码。
错误
很可能。关于已知问题的列表,参见":help todo"。
注意,不少被一些人认为是错误的地方,实际上是过于忠诚于再现Vi的功能。并且如果你其它一些地方是错误,认为" 因为Vi与它不一样",那么你应该更注意看看vi_diff.txt文件( 或在Vim 中键入":help vi_diff")。同样看一下'compativle'与'cpoptions'选项。

vim 使用指南

Vi IMproved (VIM) 是 Bram Moolenaar 开发的与 UNIX 下的通用文本编辑器 vi 兼容并
且更加强大的文本编辑器。它支持语法变色、正规表达式匹配与替换、插入补全、自定义键
等等功能,为编辑文本尤其是编写程序提供了极大方便。VIM 可以运行在“任何”操作系统
上,包括我们常用的 Windows 和 UNIX/Linux。一旦掌握了 VIM,你就掌握了一项跨平台的
利器。

尽管 VIM 功能十分强大,但对于刚接触它的人尤其是用惯类似 Windows 的 notepad 的人
来说,VIM 并不十分易于掌握,毕竟它兼容的是 vi 而不是 notepad。本文旨在介绍 VIM
中我所了解的用法,希望有更多的人喜欢 VIM。应该指出的是,VIM 中有太多的功能和命令
,有许多你并不用的着,因此没有记的必要,有些我也不知道,这要靠你来发现,关键是多
看 :help ,多试。另外,取决于你的 VIM 的版本以及编译安装时的设置,文中讲述的某些
功能或命令在你的 VIM 中也许并不存在,如有需要请升级。
1. vi 的基本用法

vi 的屏幕区域分为两个部分:最下面一行是命令行,一般用于提示信息或命令行输入;除
此之外为正文显示区域。跟 notepad 不同的是,vi 中存在两种模式:普通(Normal)模式和
插入(Insert)模式。

进入 vi 后默认即为普通模式。新手一般初次进入 vi 后就想输入一串字符,结果发现 vi
一连串莫名其妙的反应。其实,在 vi 的普通模式下,任何按键包括普通字符都表示某个
命令,并不表示在当前光标处插入字符。常用的命令有:(注意区分大小写)
: 进入命令行
i 或 a 进入插入模式。区别是:i 进入插入模式后,光标在当前字符前面; a 进入插入
模式后,光标在当前字符后面
h j k l 分别是光标左移、下移、上移、右移(一般来说你不会用到它们来移动光标,按方
向键就可以了)
x 删除一个字符
dd 删除一行
J 删除本行的回车符,把下一行并入本行末尾
r字符 替换光标所在字符为新字符
^ $ 分别是光标移到行首和行末
数字G 移动光标到第若干行,如果直接按 G 则移动到最后一行

在普通模式中,命令以按键形式输入。而在命令行中,命令以字符串形式输入。下面是常用
的命令行:
:q 退出! (更确切的说应该是关闭当前文件)
:w 文件名 存盘。如果还是保存为当前文件,不必写文件名
:wq 存盘退出
:new 文件名 打开或新建文件(同时关闭当前文件)。如果不指定文件名或者文件名不存
在则是新建文件
:help 帮助! 看完后用 :q 关掉窗口。可以在 help 后面加某个帮助主题的名称,如 :he
lp dd 或 :help help

还有一点是,如果某个命令得到警告(拒绝执行),则要在命令的命令词后加叹号表示强制执
行。比如你修改过文件,但又想放弃存盘并退出,如果输入 :q,vi 会告诉你文件已修改,
这时,你只能输入 :q! 退出。又如用 :w! a.txt 表示把当前文件存为 a.txt 而不管 a.tx
t 是否已经存在。

插入模式就不用多说了,添加你的新内容吧。不过,你也许会发现 BackSpace 键和 Delete
键的运用很受限制,也不能像 notepad 那样选择、复制和粘贴。这些都是由于这是 vi 的
标准,后面我们将看到 VIM 扩展的功能可以解决这些问题。记住按 ESC 退出插入模式,回
到普通模式。
2. 复制和粘贴

为了便于选取文本,VIM 引入了可视(Visual)模式。要选取一段文本,首先将光标移到段首
,在普通模式下按 v 进入可视模式,然后把光标移到段末。需要注意,光标所在字符是包
含在选区中的。这时可以对所选的文本进行一些操作,常用的(可视模式)命令有:
x 或 d 剪切(即删除,同时所选的文本进入剪贴板)
y 复制
r字符 所有字符替换为新字符
u U ~ 分别是所有字母变小写、变大写、反转大小写
> < 分别是缩进和反缩进

当输入了命令以后,VIM 将回到普通模式,这时可以按 p 或 P 进行粘贴。普通模式下有关
复制和粘贴的命令:
v 进入可视模式
p 或 P 在当前位置粘贴剪贴板的内容,p 粘在光标所在字符后面,P 粘在前面

不得不承认,虽然引入了可视模式,复制和粘贴在 VIM 中仍然是比较麻烦的操作,这也许
是 VIM 唯一的缺点。:-) 此外,VIM 还引入了选择(Select)模式,跟可视模式类似。结合
一些键的定义和选项设置,可以实现跟 notepad 相同的复制和粘贴的使用习惯。限于篇幅
和水平,在此不提。
3. VIM 的定制

VIM 在 vi 的基础上扩展了许多功能和命令,提供了许多选项。但是有些功能默认是关闭的
,有些选项可能也不符合个人的使用习惯。为此,我们需要编写一个 vimrc 文件。在 DOS/
Windows 版本的 VIM 中,这个文件应放在 VIM 的目录下,文件名为“_vimrc”。在 UNIX
版本 的 VIM 中,这个文件一般可以放在用户的个人主目录下,文件名为“.vimrc”。VIM
启动时将会把 vimrc 文件中的每一行作为命令行依次执行,我们可以在该文件中加入若干

下面是一个 vimrc 文件的示例:(请注意区分浏览器的换行与实际的换行。)
" 设置 Backspace 和 Delete 的灵活程度,backspace=2 则没有任何限制
set backspace=2
" 设置在哪些模式下使用鼠标功能,mouse=a 表示所有模式
set mouse=a
" 设置路径,在 f 等命令中涉及此参数
" 对于 Windows 编程,path 可设为如
" set path=.,"C:\Program Files\Microsoft Visual Studio\vc98\Include",,
" 对于 UNIX 编程,path 可设为如下
set path=.,/usr/include,/usr/include/qt,,
" 打开光标的行列位置显示功能
set ruler
" 设置跳格距离
set tabstop=4
" 设置自动缩进格数
set shiftwidth=4
" 打开自动缩进功能
set autoindent
" 设置哪些键可以行间绕转,如下设置则 Backspace 和方向键等均可行间绕转
set whichwrap=b,s,h,l,<,>,[,]
" 根据当前文件语法自动变色。VIM 识别上百种文本文件的语法,如 html、c++、java 等
syntax on
" 以下是个人习惯,定义 等键,便于插入模式和可视模式之间的切换
" (1) 使 x d y 自动返回插入模式
vnoremap y "ryi
vnoremap x "rxi
vnoremap d di
" (2) 普通模式和插入模式下均可按 粘贴
imap :if col(".")!=1 exe 'normal "rp'elseexe 'normal "r
P'endif`[i
nmap "rP
" (3) 普通模式和插入模式下均可按 进入可视模式
imap :if col(".")!=1 exe 'normal lv'elseexe 'normal v'<
Bar>endif
nmap v

下面给出我常用的 vimrc 文件。另外,你的 VIM 安装目录下很可能也带有一个默认的 vim
rc 文件,你都可以参考。如果遇到没有见过的命令或者参数,可以自己看看 :help 。

* vimrc

4. VIM 的其它命令

要真正使用 VIM,光靠 vi 的基本命令当然不行,下面就来介绍更多的命令。以下的命令,
有些是 VIM 特有的,有些在 vi 中也存在,我就不加区分了。其中,以“:”开头表示该命
令在命令行输入,以“i”开头表示这是插入模式下的命令,其它则是普通模式下的命令。<
C-X> 表示按 Ctrl+X。
4.1 使用帮助

在 :help 中,遇到超连接可以按 Ctrl+] 跳转
在 :help 中,按 Ctrl+T 往回跳转

4.2 打开多个文件

:split 文件名 切分出一个新窗口,打开指定文件。如果省略文件名,则仍显示当前文件
,可用于同时观察文件的不同部分。(注意跟 :new 的区别)
f 切分显示光标所指的文件名,VIM 会在 path 中搜索该文件名,比如常用它打开 #
include 语句中的文件
当同时打开几个文件时,按 在各窗口之间切换
_ 当同时打开几个文件时,按 _ 使当前窗口最大化
:set scrollbind 设置卷动绑定属性。所有设置了卷动绑定属性的窗口将一起卷动。可以用
:set noscrollbind 解除绑定

4.3 撤销和恢复

编辑过程中出现错误在所难免,不过没有关系,VIM 允许无限次的撤销。只要你没有关闭文
件,你甚至可以一直撤销下去,回到几个小时以前刚打开这个文件开始工作时的状态。
u 撤销(Undo)上次所做的修改
恢复(Redo)上次撤销的内容

4.4 字符串搜索替换

/字符串 向下搜索字符串
?字符串 向上搜索字符串
* # 分别是向下和向上搜索光标所指的词
n 重复上一次搜索
:起始行,结束行s/搜索串/替换串/g 从起始行到结束行,把所有的搜索串替换为替换串
:set ignorecase 设置忽略字母大小写。可以用 :set noignorecase 取消忽略字母大小写

例如 /hello 从当前光标位置开始向下搜索 hello,不带字符串的命令 / 可重复上一次搜
索,相当于 n。又如 :1,$s/hello/hi/g 把全文中的 hello 改为 hi,其中 $ 表示最后一
行。另外,你还可以先进入可视模式选择一段文本,按 :进入命令行并输入 s/hello/hi/g
,VIM 将在选区中进行替换操作。

搜索字符串用的是正规表达式(Regular expression),其中许多字符都有特殊含义:
\ 取消后面所跟字符的特殊含义。比如 \[vim\] 匹配字符串“[vim]”
[] 匹配其中之一。比如 [vim] 匹配字母“v”、“i”或者“m”,[a-zA-Z] 匹配任
意字母
[^] 匹配非其中之一。比如 [^vim] 匹配除字母“v”、“i”和“m”之外的所有字符
. 匹配任意字符
* 匹配前一字符大于等于零遍。比如 vi*m 匹配“vm”、“vim”、“viim”……
\+ 匹配前一字符大于等于一遍。比如 vi\+m 匹配“vim”、“viim”、“viiim”…

\? 匹配前一字符零遍或者一遍。比如 vi\?m 匹配“vm”或者“vim”
^ 匹配行首。例如 /^hello 查找出现在行首的单词 hello
$ 匹配行末。例如 /hello$ 查找出现在行末的单词 hello
\(\) 括住某段正规表达式
\数字 重复匹配前面某段括住的表达式。例如 \(hello\).*\1 匹配一个开始和末尾都是
“hello”,中间是任意字符串的字符串

对于替换字符串,可以用“&”代表整个搜索字符串,或者用“\数字”代表搜索字符串中的
某段括住的表达式。

举一个复杂的例子,把文中的所有字符串“abc……xyz”替换为“xyz……abc”可以有下列
写法:
:%s/abc\(.*\)xyz/xyz\1abc/g
:%s/\(abc\)\(.*\)\(xyz\)/\3\2\1/g
其它关于正规表达式搜索替换的更详细准确的说明请看 :help pattern 。

在插入模式下,为了减少重复的击键输入,VIM 提供了若干快捷键,当你要输入某个上下文
曾经输入过的字符串时,你只要输入开头若干字符,使用快捷键,VIM 将搜索上下文,找到
匹配字符串,把剩下的字符补全,你就不必敲了。这样,编程序时你起多长的变量名都没关
系了,:-) 而且还可以减少输入错误。我认为,插入补全是 VIM 最为突出的一项功能。
i 向上搜索,补全一个词。例如,上文中出现过 filename 这个词,当你想再输入 f
ilename 时,只要按 f 即可。假如 VIM 向上搜索,找到以 f 开头的第一个匹配不是
filename,你可以继续按 搜索下一个匹配进行补全。当然,如果你想一次
就成功,你可以多输入几个字符比如 filen 再按 补全
i 向下搜索,补全一个词
i 补全一行。比如你写过一行 for (int i = 0; i < 100; i++),你想再写
一模一样的一行,只要输入 for 即可。如果补全出来的不是你想要的那一行,
你可以按 选择上一个或下一个匹配行
i 在文件系统中搜索,补全一个文件名

如果按 补全一个词,在当前文件中没有找到匹配,VIM 将搜索 #include
语句中的文件,而文件的位置将在 path 中搜索。
4.6 键的定义

在 VIM 中你可以定义一个键,按了这个键等于按了某一串预定的键。比如
:map! ddi
表示如果你在插入模式下按 就相当于连续按了 ddi,这将会使 VIM 退回到普
通模式,删除一行,再进入插入模式。

map 命令有许多变化形式,每种变化形式所定义的键只在某些模式下有效,而在其它模式下
无效。你需要根据情况使用正确的变化形式:
:nmap 键只对普通模式有效
:imap 键只对插入模式有效
:vmap 键只对可视模式有效
:cmap 键只在命令行下有效
:map 键在普通模式和可视模式都有效
:map! 键在插入模式和命令行下都有效

还要注意,如果你定义 :map d di 这将引起循环定义错误。这时,你需要使用 :noremap d
di 来定义。同样,noremap 也有对不同模式的变化形式。

比如,你想在文件的每一行的倒数第二个字符处插入字符串“abc”,你可以定义
:nmap $hiabcj
在普通模式下按一次 将会:光标移到行末,光标左移一格,进入插入模式,输入“a
bc”,退回到普通模式,光标下移一行。不停地按 将解决问题。这是我临时处理多
行重复操作的常用手段,当然,这是一种笨办法。:-) 而上文写到的对 的定义
则是 map 更复杂的用法。你还可以定义
:map :w:!gcc -o %< -I/usr/include/qt -lqt %
:map :!./%<
实现按 编译当前文件,按 执行。

在插入补全当中提到的补全一行需要按 ,如果你觉得麻烦,你可以定义
:inoremap
减少击键次数。同样,对 也可以作类似定义。
4.7 其它命令

:!命令行 执行一条外部命令
. 在光标当前位置处重复上一次操作
i后续字符 输入特殊的 ASCII 字符或键。除了插入模式外,也适用于命令行。后续
字符可以是键盘上的任意键,也可以是三位的十进制数字表示字符的 ASCII 码
i命令 执行一个普通模式的命令,执行完毕后回到插入模式
i 跳转到光标所指标识符的定义行。比如你在编程时遇到一个函数 CreateWindow,
想看它的定义语句,你就可以在它上面按 i,VIM 将打开新窗口,把光标移到它定义
的地方。当然,前提是在当前文件或它的 #include 文件中存在 CreateWindow 的定义。这
也牵涉到 path 的设置。不过,VIM 找得不一定很准
K 看光标所指标识符的 man 帮助页
i 把上一行对应列的字符抄下来
i 把下一行对应列的字符抄上来(写这一行时我就用了 )
光标所指整数加一
光标所指整数减一
光标返回到以前的位置。相当于光标移动的“撤销”
光标返回到后来的位置。相当于光标移动的“恢复”
进入可视模式,选取一个矩形区域。该命令通常用于对多行进行列操作。接着按 I
可以在块前的每一行同时插入字符;按 A 可以在块后的每一行同时插入字符;按 x、d 或
y 可以剪切或复制;等等
:X 对当前文件加密

5. VIM 6.0 的一些新特性

2001 年 9 月 26 日发布的 VIM 6.0 增加了一些以往没有的新特性。下面仅仅是一些简单
的介绍,更详细的描述请自己看 :help 。

* 打开目录

在 VIM 6.0 中,:new 和 :split 等命令不但可以打开普通文件,还可以打开目录。
一个目录打开以后将列出里面的文件信息,可以按回车继续打开相应的文件或者子目录,也
可以按 ? 得到其它目录操作(修改文件名,删除文件等)的帮助。
* 折叠

当一个文本太长而你又对其中很长一大段内容不关心的话,可以把你不关心的那些行
折叠起来,让它们从你的视线中消失。被折叠的行将以一行显示代替,例如:
+--217 行:2. VIM 的定制---------------------
折叠可以有多种方式控制,可以通过设置 foldmethod 选项的值来改变。默认情况下
foldmethod=manual 为手工折叠。下面介绍几个使用折叠的最简单的命令:
(可视模式下) zf 手工创建折叠。在可视模式下选择一段文本,然后按 zf 可以手
工创建一个折叠
方向键左或右 打开折叠。普通或插入模式下,在折叠行上横向移动光标将打开
被折叠的行
zc 关闭折叠

* 垂直切分窗口

:vsplit 文件名 垂直切分窗口。跟 :split 命令相似,但新窗口与原窗口左右并
列。

* 更多的正规表达式

VIM 6.0 比以前增加了许多新的正规表达式,其中我认为最有用的是换行匹配符 \n
。以前的版本中,正规表达式只能在同一行上匹配。现在,只要显式地给出 \n,正规表达
式可以跨多行。
* diff 模式

专门用于比较编辑两个或多个内容相近的文件的模式。一般来说,比如你要比较编辑
A 跟 B 两个文件,你可以命令行启动 vim -d A B 或者这样:先打开文件 A,然后 :vspl
it 打开文件 B,对文件 A 和 B 都输入命令 :diffthis。这时 VIM 将非常清晰的对比显示
出两个文件的不同之处,编辑起来十分方便。

仔细一看,这个 diff 模式动用了 VIM 许许多多的特性,包括卷动绑定,折叠和语
法变色等等。好高级啊!

我所熟悉的 VIM 的功能已经介绍得差不多,剩下的要靠你自己来学习了。其实,VIM 的功
能还有很多很多。还是那句话,多看 :help ,多试。VIM 的帮助还是挺容易看的,相信你
看了以后会有更多的惊喜。另外,VIM 的主页上有不少有用的技巧提示,也是一个很好的去
处。如果你有什么心得或者新发现,欢迎跟我讨论。

希望你喜欢 VIM。(2003.12.03)

VIM技巧

1) 为什么别人的方法在我这里行不通?
(2) 如何找到上次编辑的文件?
(3) 如何复制粘贴?
(4) 如何在多个文件中进行替换?
(5) 如何把fold一次全部打开?
(6) 如何选择或者复制光标所在的单词?
(7) 如何计数搜索的字符串?
(8) 如何去掉高亮搜索?
(9) 如何解决linux下gvim中文菜单乱码的问题?
(10) 如何对所编辑的文件语法高亮显示?
(11) 如何快速插入多行数字0-99?

==============================================================================
(1) 为什么别人的方法在我这里行不通?

估计这是最难回答的一个问题了。:-)
不过首先应该确定你的VIM版本是否足够新,功能是否完整。使用 :version 命令查看你
的VIM版本以及功能。一个常见的情况,如果你用的是RedHat系统,请确定安装了
vim-enhance的rpm包,否则将是不完整的VIM。

(2) 如何找到上次编辑的文件?

Ctrl+O (按两次)

(3) 如何复制粘贴?

方法一:先ma标记当前位置为a,移动到新的位置,再y`a或者y'a复制从标记位置a到
当前位置的内容。`和'的区别:`以字符为单位,'以行为单位。这个方法应该是所有vi
都适用的。(如果不对请指正。)
方法二:按v或V或Ctrl+V进入visual模式,移动光标选择一段内容,按y。三者的区别:
v以字符为单位,V以行为单位,Ctrl+V是块选择。这个方法只在VIM下适用。

(4) 如何在多个文件中进行替换?

一般可以用sed或者vim来做。比如要对当前目录下的*.c文件进行替换:
方法一:
for i in *.c; do
sed -i -e 's/oldvalue/newvalue/g' $i
done
方法二:
vim *.c
:argdo %s/oldvalue/newvalue/g

(5) 如何把fold一次全部打开?

zR 或者 :set foldlevel=999

(6) 如何选择或者复制光标所在的单词?

在VIM中用iw或者aw表示一个单词,两者稍有区别。
选择光标所在的单词:viw (v进入visual模式,然后iw)
复制光标所在的单词:yiw

(7) 如何计数搜索的字符串?

如果需要统计缓冲中一个模式(pattern)出现的频率,需要把 'report' 置为0,然后
用替换命令把模式替换成它自己。Vim 报告的已替换的数目就是模式出现的次数。例:
:set report=0
:%s/./&/g characters
:%s/\i\+/&/g words
:%s/^ lines
:%s/the/&/g "the" anywhere
:%s/\/&/g "the" as a word
你可能希望复位 'hlsearch' 或者使用 ":nohlsearch"。

(8) 如何去掉高亮搜索?

方法一::nohlsearch
方法二:/awertgvcxz (查找一个肯定不存在的字符串)
设置了高亮搜索(:set hlsearch)以后,可以通过 :set nohlsearch 永久地关闭高亮
显示,也可以通过 :nohlsearch 暂时关闭高亮显示,下次搜索时将自动恢复高亮。

(9) 如何解决linux下gvim中文菜单乱码问题?

以vim6.3为例
source /usr/local/vim/share/vim/vim63/delmenu.vim
source /usr/local/vim/share/vim/vim63/menu.vim

光source一个menu.vim或者啥也不source都是乱码
另外,也有网友报告说没有遇到此类问题

(10) 如何对所编辑的文件语法高亮显示?

需要解释的是,VI有很多变种,它本身并没有这种功能,提供这种功能
往往是其各种衍生版本,比如说vim。下面就vim中如何语法高亮简单解释一下。

首先,确定一下你所用的操作系统,如果是windows,那么默认的配置文件
就可以工作了。如果还不行,可以用鼠标从syntax菜单下选择一下适合你的
文件类型(新版本的gvim默认把文件类型选择关闭了,需要点开,然后按照
开头字母选择类型)
如果是linux,那么确认一下是否是redhat。如果是redhat,那么需要安装
vim-enhanced的rpm包。这些都做了以后,可以用:syntax on来打开语法高亮。
必要时可以用:set filetype=...来设定你的文件类型。
如果使用图形界面,比如gvim,那么syntax on和set filetype的操作可以
用鼠标在菜单中选择,同windows下。
如果是在控制台中使用vim,还应当确定你的终端设置支持颜色。

(11) 如何快速插入多行数字0-99?

在命令行中输入以下代码,或者先把代码保存到一个外部文件,然后source这个文件:
let i = 0
while i < 100
put = i
let i = i + 1
endw
如果位数不足需要在前面补零,可以用Ctrl-V块选择,然后I插入0。

※ 修改:·thinelephant 于 Jun 30 11:03:43 修改本文·[FROM: 211.100.11.*]
※ 来源:·BBS 水木清华站 smth.org·[FROM: 211.100.11.*]


发信人: vale (浅谷·等待溪流), 信区: VIM
标 题: VIM中不易发现的强劲功能
发信站: BBS 水木清华站 (Mon May 31 10:54:41 2004), 站内

在我最初使用Vim时,有些功能并不知道,等发现后真后悔自己干了那么久的体力活。

1. * (super star)
向下查找光标下(或附近)的。向上找用#。g*查找则不限制whole word。

2. C-R (magic insert)
在insert模式下,C-R (register) 插入register里的内容,一个有趣的reg是"=".
假设你想输入123K的具体字节数,不用打开计算器,试试这个“=1024*123”,
“125952”就出来了!
另外在命令行里C-R C-W和C-R C-A是必用的技巧,它们将光标下的
考到命令行里,省了你无数的typing。

3. C-X (auto complete)
在insert模式下,C-X C-P/N/L/F等自动完成前面的词、行、文件名等,是编程时必用的
命令。其中C-P和C-N可以不用C-X。

4. [p & ]p (smart paste)
paste同时自动根据目标行的缩进调整来源行的缩进。在copy代码段的时候非常有用。

5. C-O (fast out, fast in)
在insert模式下,用C-O后可以执行一个normal命令,然后立即返回insert模式,省去了
用ESC的麻烦。

6. [I (fast grep )
[I显示文件中包含光标下的所有行。我常用来浏览某个id在程序中的引用情况。
还有很多相关的命令::h include-search

7. object-select
iw, aw, ib, i], i} ... 都非常有用!看help吧
:h object-select


先写这么多,以后再补充吧。

--
The world puts off its mask of vastness to its lover.
It becomes small as one song, as one kiss of the eternal.


※ 来源:·BBS 水木清华站 http://smth.org·[FROM: 210.82.111.*]

发信人: ann77 (ann), 信区: VIM
标 题: 我常用的 vim 的功能
发信站: BBS 水木清华站 (Fri May 28 13:39:08 2004), 站内

光说我马上能够想起来的。

1.

fx
x 表示任何一个字符。
这是最快的在一行种移动的方法了。然后用
; (分号)
继续移动。

反向移动好像是 t ,但是我记性不好,
总是记不住,于是
0fx
用 0 先回到行首,在 f

2.
任何一个操作命令在加一个移动命令。实现对某个范围的操作。
例如
dfx
表示删除到下一个出现 x 的地方, x 可以使任意字符。
操作命令有 d (cut), y(copy) , p(paste), v (select)
移动命令有 hjkl, f, /, gg, G

3.
任何命令组合都可以先按一些 数字健 表示重复操作。
如:
d123j
删除下面123行。

4. 宏纪录的功能
例如,把文件中所有奇数行和偶数行合并。按如下序列
gg
qq
J
q
100000000@q

5. C-p
在 insert mode 下
写程序的时候,任何超长的变量名字都不成问题。
如果有一个this_is_very_long_variable_name
可以
this
90%的可能性自动就把名字补全了。

于是,我写程序的时候,变量的名字其的越来越长,输入越来越快。:)

6. C-x C-p
在写程序 abc.h 的时候
写道 #include "abc.h" 的时候
其实可以
#include "a"

90% 的情况,可以自动补全文件名称。


6.从外部命令输入
:r !ls
可以读取当前目录的文件列表。
如果你对 bash 很熟悉的话,这个功能非常好用
例如
输入
case 1
case 2
....
case 1000:
的方法是
:r !for ((i=0;i<100;i++));do echo "case $i" ; done

7. 利用外部命令处理文字。
我在 ~/.vimrc 中写了一行。
map = ggVG:!indent -nut -st -kr 2>/dev/nullG

我按一个 = ,就可以利用外部命令 indent 美化 我的 c 程序。
我认为,
还可以用外部命令排序
例如
用 v 选定要排序的区域
然后按一个叹号。
:'<,'>!sort

8
我在 ~/.vimrc 中写了
map :bp
map :bn
map :bd

就可以用 左右方向健来切换 buffer
F4 关闭 buffer 了。

9
我在 ~/.vimrc 中写了
runtime ftplugin/man.vim

就可以在把光标停在一个函数上,然后用
\k
查看在线帮助了。

:Man getuid
查看 getuid 函数的手册了。

10.
:make
可以用外部命令 make 编译工程。
:cw
查看出错信息,
:cn
:cp
在出错信息之间跳转。

11.
]] , [[ , [] , ][ 命令可以在函数之间移动。




Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=624403

VIM 使用简介(转载

Vi IMproved (VIM) 是 Bram Moolenaar 开发的与 UNIX 下的通用文本编辑器 vi 兼容并
且更加强大的文本编辑器。它支持语法变色、正规表达式匹配与替换、插入补全、自定义键
等等功能,为编辑文本尤其是编写程序提供了极大方便。VIM 可以运行在“任何”操作系统
上,包括我们常用的 Windows 和 UNIX/Linux。一旦掌握了 VIM,你就掌握了一项跨平台的
利器。

尽管 VIM 功能十分强大,但对于刚接触它的人尤其是用惯类似 Windows 的 notepad 的人
来说,VIM 并不十分易于掌握,毕竟它兼容的是 vi 而不是 notepad。本文旨在介绍 VIM
中我所了解的用法,希望有更多的人喜欢 VIM。应该指出的是,VIM 中有太多的功能和命令
,有许多你并不用的着,因此没有记的必要,有些我也不知道,这要靠你来发现,关键是多
看 :help ,多试。另外,取决于你的 VIM 的版本以及编译安装时的设置,文中讲述的某些
功能或命令在你的 VIM 中也许并不存在,如有需要请升级。
1. vi 的基本用法

vi 的屏幕区域分为两个部分:最下面一行是命令行,一般用于提示信息或命令行输入;除
此之外为正文显示区域。跟 notepad 不同的是,vi 中存在两种模式:普通(Normal)模式和
插入(Insert)模式。

进入 vi 后默认即为普通模式。新手一般初次进入 vi 后就想输入一串字符,结果发现 vi
一连串莫名其妙的反应。其实,在 vi 的普通模式下,任何按键包括普通字符都表示某个
命令,并不表示在当前光标处插入字符。常用的命令有:(注意区分大小写)
: 进入命令行
i 或 a 进入插入模式。区别是:i 进入插入模式后,光标在当前字符前面; a 进入插入
模式后,光标在当前字符后面
h j k l 分别是光标左移、下移、上移、右移(一般来说你不会用到它们来移动光标,按方
向键就可以了)
x 删除一个字符
dd 删除一行
J 删除本行的回车符,把下一行并入本行末尾
r字符 替换光标所在字符为新字符
^ $ 分别是光标移到行首和行末
数字G 移动光标到第若干行,如果直接按 G 则移动到最后一行

在普通模式中,命令以按键形式输入。而在命令行中,命令以字符串形式输入。下面是常用
的命令行:
:q 退出! (更确切的说应该是关闭当前文件)
:w 文件名 存盘。如果还是保存为当前文件,不必写文件名
:wq 存盘退出
:new 文件名 打开或新建文件(同时关闭当前文件)。如果不指定文件名或者文件名不存
在则是新建文件
:help 帮助! 看完后用 :q 关掉窗口。可以在 help 后面加某个帮助主题的名称,如 :he
lp dd 或 :help help

还有一点是,如果某个命令得到警告(拒绝执行),则要在命令的命令词后加叹号表示强制执
行。比如你修改过文件,但又想放弃存盘并退出,如果输入 :q,vi 会告诉你文件已修改,
这时,你只能输入 :q! 退出。又如用 :w! a.txt 表示把当前文件存为 a.txt 而不管 a.tx
t 是否已经存在。

插入模式就不用多说了,添加你的新内容吧。不过,你也许会发现 BackSpace 键和 Delete
键的运用很受限制,也不能像 notepad 那样选择、复制和粘贴。这些都是由于这是 vi 的
标准,后面我们将看到 VIM 扩展的功能可以解决这些问题。记住按 ESC 退出插入模式,回
到普通模式。
2. 复制和粘贴

为了便于选取文本,VIM 引入了可视(Visual)模式。要选取一段文本,首先将光标移到段首
,在普通模式下按 v 进入可视模式,然后把光标移到段末。需要注意,光标所在字符是包
含在选区中的。这时可以对所选的文本进行一些操作,常用的(可视模式)命令有:
x 或 d 剪切(即删除,同时所选的文本进入剪贴板)
y 复制
r字符 所有字符替换为新字符
u U ~ 分别是所有字母变小写、变大写、反转大小写
> < 分别是缩进和反缩进

当输入了命令以后,VIM 将回到普通模式,这时可以按 p 或 P 进行粘贴。普通模式下有关
复制和粘贴的命令:
v 进入可视模式
p 或 P 在当前位置粘贴剪贴板的内容,p 粘在光标所在字符后面,P 粘在前面

不得不承认,虽然引入了可视模式,复制和粘贴在 VIM 中仍然是比较麻烦的操作,这也许
是 VIM 唯一的缺点。:-) 此外,VIM 还引入了选择(Select)模式,跟可视模式类似。结合
一些键的定义和选项设置,可以实现跟 notepad 相同的复制和粘贴的使用习惯。限于篇幅
和水平,在此不提。
3. VIM 的定制

VIM 在 vi 的基础上扩展了许多功能和命令,提供了许多选项。但是有些功能默认是关闭的
,有些选项可能也不符合个人的使用习惯。为此,我们需要编写一个 vimrc 文件。在 DOS/
Windows 版本的 VIM 中,这个文件应放在 VIM 的目录下,文件名为“_vimrc”。在 UNIX
版本 的 VIM 中,这个文件一般可以放在用户的个人主目录下,文件名为“.vimrc”。VIM
启动时将会把 vimrc 文件中的每一行作为命令行依次执行,我们可以在该文件中加入若干

下面是一个 vimrc 文件的示例:(请注意区分浏览器的换行与实际的换行。)
" 设置 Backspace 和 Delete 的灵活程度,backspace=2 则没有任何限制
set backspace=2
" 设置在哪些模式下使用鼠标功能,mouse=a 表示所有模式
set mouse=a
" 设置路径,在 f 等命令中涉及此参数
" 对于 Windows 编程,path 可设为如
" set path=.,"C:\Program Files\Microsoft Visual Studio\vc98\Include",,
" 对于 UNIX 编程,path 可设为如下
set path=.,/usr/include,/usr/include/qt,,
" 打开光标的行列位置显示功能
set ruler
" 设置跳格距离
set tabstop=4
" 设置自动缩进格数
set shiftwidth=4
" 打开自动缩进功能
set autoindent
" 设置哪些键可以行间绕转,如下设置则 Backspace 和方向键等均可行间绕转
set whichwrap=b,s,h,l,<,>,[,]
" 根据当前文件语法自动变色。VIM 识别上百种文本文件的语法,如 html、c++、java 等
syntax on
" 以下是个人习惯,定义 等键,便于插入模式和可视模式之间的切换
" (1) 使 x d y 自动返回插入模式
vnoremap y "ryi
vnoremap x "rxi
vnoremap d di
" (2) 普通模式和插入模式下均可按 粘贴
imap :if col(".")!=1 exe 'normal "rp'elseexe 'normal "r
P'endif`[i
nmap "rP
" (3) 普通模式和插入模式下均可按 进入可视模式
imap :if col(".")!=1 exe 'normal lv'elseexe 'normal v'<
Bar>endif
nmap v

下面给出我常用的 vimrc 文件。另外,你的 VIM 安装目录下很可能也带有一个默认的 vim
rc 文件,你都可以参考。如果遇到没有见过的命令或者参数,可以自己看看 :help 。

* vimrc

4. VIM 的其它命令

要真正使用 VIM,光靠 vi 的基本命令当然不行,下面就来介绍更多的命令。以下的命令,
有些是 VIM 特有的,有些在 vi 中也存在,我就不加区分了。其中,以“:”开头表示该命
令在命令行输入,以“i”开头表示这是插入模式下的命令,其它则是普通模式下的命令。<
C-X> 表示按 Ctrl+X。
4.1 使用帮助

在 :help 中,遇到超连接可以按 Ctrl+] 跳转
在 :help 中,按 Ctrl+T 往回跳转

4.2 打开多个文件

:split 文件名 切分出一个新窗口,打开指定文件。如果省略文件名,则仍显示当前文件
,可用于同时观察文件的不同部分。(注意跟 :new 的区别)
f 切分显示光标所指的文件名,VIM 会在 path 中搜索该文件名,比如常用它打开 #
include 语句中的文件
当同时打开几个文件时,按 在各窗口之间切换
_ 当同时打开几个文件时,按 _ 使当前窗口最大化
:set scrollbind 设置卷动绑定属性。所有设置了卷动绑定属性的窗口将一起卷动。可以用
:set noscrollbind 解除绑定

4.3 撤销和恢复

编辑过程中出现错误在所难免,不过没有关系,VIM 允许无限次的撤销。只要你没有关闭文
件,你甚至可以一直撤销下去,回到几个小时以前刚打开这个文件开始工作时的状态。
u 撤销(Undo)上次所做的修改
恢复(Redo)上次撤销的内容

4.4 字符串搜索替换

/字符串 向下搜索字符串
?字符串 向上搜索字符串
* # 分别是向下和向上搜索光标所指的词
n 重复上一次搜索
:起始行,结束行s/搜索串/替换串/g 从起始行到结束行,把所有的搜索串替换为替换串
:set ignorecase 设置忽略字母大小写。可以用 :set noignorecase 取消忽略字母大小写

例如 /hello 从当前光标位置开始向下搜索 hello,不带字符串的命令 / 可重复上一次搜
索,相当于 n。又如 :1,$s/hello/hi/g 把全文中的 hello 改为 hi,其中 $ 表示最后一
行。另外,你还可以先进入可视模式选择一段文本,按 :进入命令行并输入 s/hello/hi/g
,VIM 将在选区中进行替换操作。

搜索字符串用的是正规表达式(Regular expression),其中许多字符都有特殊含义:
\ 取消后面所跟字符的特殊含义。比如 \[vim\] 匹配字符串“[vim]”
[] 匹配其中之一。比如 [vim] 匹配字母“v”、“i”或者“m”,[a-zA-Z] 匹配任
意字母
[^] 匹配非其中之一。比如 [^vim] 匹配除字母“v”、“i”和“m”之外的所有字符
. 匹配任意字符
* 匹配前一字符大于等于零遍。比如 vi*m 匹配“vm”、“vim”、“viim”……
\+ 匹配前一字符大于等于一遍。比如 vi\+m 匹配“vim”、“viim”、“viiim”…

\? 匹配前一字符零遍或者一遍。比如 vi\?m 匹配“vm”或者“vim”
^ 匹配行首。例如 /^hello 查找出现在行首的单词 hello
$ 匹配行末。例如 /hello$ 查找出现在行末的单词 hello
\(\) 括住某段正规表达式
\数字 重复匹配前面某段括住的表达式。例如 \(hello\).*\1 匹配一个开始和末尾都是
“hello”,中间是任意字符串的字符串

对于替换字符串,可以用“&”代表整个搜索字符串,或者用“\数字”代表搜索字符串中的
某段括住的表达式。

举一个复杂的例子,把文中的所有字符串“abc……xyz”替换为“xyz……abc”可以有下列
写法:
:%s/abc\(.*\)xyz/xyz\1abc/g
:%s/\(abc\)\(.*\)\(xyz\)/\3\2\1/g
其它关于正规表达式搜索替换的更详细准确的说明请看 :help pattern 。

在插入模式下,为了减少重复的击键输入,VIM 提供了若干快捷键,当你要输入某个上下文
曾经输入过的字符串时,你只要输入开头若干字符,使用快捷键,VIM 将搜索上下文,找到
匹配字符串,把剩下的字符补全,你就不必敲了。这样,编程序时你起多长的变量名都没关
系了,:-) 而且还可以减少输入错误。我认为,插入补全是 VIM 最为突出的一项功能。
i 向上搜索,补全一个词。例如,上文中出现过 filename 这个词,当你想再输入 f
ilename 时,只要按 f 即可。假如 VIM 向上搜索,找到以 f 开头的第一个匹配不是
filename,你可以继续按 搜索下一个匹配进行补全。当然,如果你想一次
就成功,你可以多输入几个字符比如 filen 再按 补全
i 向下搜索,补全一个词
i 补全一行。比如你写过一行 for (int i = 0; i < 100; i++),你想再写
一模一样的一行,只要输入 for 即可。如果补全出来的不是你想要的那一行,
你可以按 选择上一个或下一个匹配行
i 在文件系统中搜索,补全一个文件名

如果按 补全一个词,在当前文件中没有找到匹配,VIM 将搜索 #include
语句中的文件,而文件的位置将在 path 中搜索。
4.6 键的定义

在 VIM 中你可以定义一个键,按了这个键等于按了某一串预定的键。比如
:map! ddi
表示如果你在插入模式下按 就相当于连续按了 ddi,这将会使 VIM 退回到普
通模式,删除一行,再进入插入模式。

map 命令有许多变化形式,每种变化形式所定义的键只在某些模式下有效,而在其它模式下
无效。你需要根据情况使用正确的变化形式:
:nmap 键只对普通模式有效
:imap 键只对插入模式有效
:vmap 键只对可视模式有效
:cmap 键只在命令行下有效
:map 键在普通模式和可视模式都有效
:map! 键在插入模式和命令行下都有效

还要注意,如果你定义 :map d di 这将引起循环定义错误。这时,你需要使用 :noremap d
di 来定义。同样,noremap 也有对不同模式的变化形式。

比如,你想在文件的每一行的倒数第二个字符处插入字符串“abc”,你可以定义
:nmap $hiabcj
在普通模式下按一次 将会:光标移到行末,光标左移一格,进入插入模式,输入“a
bc”,退回到普通模式,光标下移一行。不停地按 将解决问题。这是我临时处理多
行重复操作的常用手段,当然,这是一种笨办法。:-) 而上文写到的对 的定义
则是 map 更复杂的用法。你还可以定义
:map :w:!gcc -o %< -I/usr/include/qt -lqt %
:map :!./%<
实现按 编译当前文件,按 执行。

在插入补全当中提到的补全一行需要按 ,如果你觉得麻烦,你可以定义
:inoremap
减少击键次数。同样,对 也可以作类似定义。
4.7 其它命令

:!命令行 执行一条外部命令
. 在光标当前位置处重复上一次操作
i后续字符 输入特殊的 ASCII 字符或键。除了插入模式外,也适用于命令行。后续
字符可以是键盘上的任意键,也可以是三位的十进制数字表示字符的 ASCII 码
i命令 执行一个普通模式的命令,执行完毕后回到插入模式
i 跳转到光标所指标识符的定义行。比如你在编程时遇到一个函数 CreateWindow,
想看它的定义语句,你就可以在它上面按 i,VIM 将打开新窗口,把光标移到它定义
的地方。当然,前提是在当前文件或它的 #include 文件中存在 CreateWindow 的定义。这
也牵涉到 path 的设置。不过,VIM 找得不一定很准
K 看光标所指标识符的 man 帮助页
i 把上一行对应列的字符抄下来
i 把下一行对应列的字符抄上来(写这一行时我就用了 )
光标所指整数加一
光标所指整数减一
光标返回到以前的位置。相当于光标移动的“撤销”
光标返回到后来的位置。相当于光标移动的“恢复”
进入可视模式,选取一个矩形区域。该命令通常用于对多行进行列操作。接着按 I
可以在块前的每一行同时插入字符;按 A 可以在块后的每一行同时插入字符;按 x、d 或
y 可以剪切或复制;等等
:X 对当前文件加密

5. VIM 6.0 的一些新特性

2001 年 9 月 26 日发布的 VIM 6.0 增加了一些以往没有的新特性。下面仅仅是一些简单
的介绍,更详细的描述请自己看 :help 。

* 打开目录

在 VIM 6.0 中,:new 和 :split 等命令不但可以打开普通文件,还可以打开目录。
一个目录打开以后将列出里面的文件信息,可以按回车继续打开相应的文件或者子目录,也
可以按 ? 得到其它目录操作(修改文件名,删除文件等)的帮助。
* 折叠

当一个文本太长而你又对其中很长一大段内容不关心的话,可以把你不关心的那些行
折叠起来,让它们从你的视线中消失。被折叠的行将以一行显示代替,例如:
+--217 行:2. VIM 的定制---------------------
折叠可以有多种方式控制,可以通过设置 foldmethod 选项的值来改变。默认情况下
foldmethod=manual 为手工折叠。下面介绍几个使用折叠的最简单的命令:
(可视模式下) zf 手工创建折叠。在可视模式下选择一段文本,然后按 zf 可以手
工创建一个折叠
方向键左或右 打开折叠。普通或插入模式下,在折叠行上横向移动光标将打开
被折叠的行
zc 关闭折叠

* 垂直切分窗口

:vsplit 文件名 垂直切分窗口。跟 :split 命令相似,但新窗口与原窗口左右并
列。

* 更多的正规表达式

VIM 6.0 比以前增加了许多新的正规表达式,其中我认为最有用的是换行匹配符 \n
。以前的版本中,正规表达式只能在同一行上匹配。现在,只要显式地给出 \n,正规表达
式可以跨多行。
* diff 模式

专门用于比较编辑两个或多个内容相近的文件的模式。一般来说,比如你要比较编辑
A 跟 B 两个文件,你可以命令行启动 vim -d A B 或者这样:先打开文件 A,然后 :vspl
it 打开文件 B,对文件 A 和 B 都输入命令 :diffthis。这时 VIM 将非常清晰的对比显示
出两个文件的不同之处,编辑起来十分方便。

仔细一看,这个 diff 模式动用了 VIM 许许多多的特性,包括卷动绑定,折叠和语
法变色等等。好高级啊!

我所熟悉的 VIM 的功能已经介绍得差不多,剩下的要靠你自己来学习了。其实,VIM 的功
能还有很多很多。还是那句话,多看 :help ,多试。VIM 的帮助还是挺容易看的,相信你
看了以后会有更多的惊喜。另外,VIM 的主页上有不少有用的技巧提示,也是一个很好的去
处。如果你有什么心得或者新发现,欢迎跟我讨论。

希望你喜欢 VIM。(2003.12.03)



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=409361

以前写的php日历页面的后台,现在自己都有些看不懂了:)



/* Reminder: always indent with 4 spaces (no tabs). */
// +---------------------------------------------------------------------------+
// | Copyright (c) 2006, Demian Turner |
// | All rights reserved. |
// | |
// | Redistribution and use in source and binary forms, with or without |
// | modification, are permitted provided that the following conditions |
// | are met: |
// | |
// | o Redistributions of source code must retain the above copyright |
// | notice, this list of conditions and the following disclaimer. |
// | o Redistributions in binary form must reproduce the above copyright |
// | notice, this list of conditions and the following disclaimer in the |
// | documentation and/or other materials provided with the distribution. |
// | o The names of the authors may not be used to endorse or promote |
// | products derived from this software without specific prior written |
// | permission. |
// | |
// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
// | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
// | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
// | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
// | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
// | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
// | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
// | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
// | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
// | |
// +---------------------------------------------------------------------------+
// | Seagull 0.6 |
// +---------------------------------------------------------------------------+
// | calendarMgr.php |
// +---------------------------------------------------------------------------+
// | Author: Alouicious Bird |
// +---------------------------------------------------------------------------+
// $Id: CalendarMgr.php,v 1.6 2006/08/17 08:24:50 jiangtao Exp $

require_once 'DB/DataObject.php';
/**
* calendar used files ;
*/
require_once 'Calendar/Month/Weekdays.php';
require_once 'Calendar/Calendar.php';
/**
* Type your class description here ...
*
* @package calendar
* @author Jiangtao Chen
*/
class CalendarMgr extends SGL_Manager {
function CalendarMgr() {
SGL :: logMessage(null, PEAR_LOG_DEBUG);
parent :: SGL_Manager();

$this->pageTitle = 'Calendar Manager';
$this->template = 'calendarList.html';
$this->_aActionsMapping = array (
'list' => array (
'list'
),
/*
* Tony add
*/
'eventDetail' => array (
'eventDetail'
),
'dayEventList' => array (
'dayEventList'
),
'monthEventList' => array (
'monthEventList'
),


);
}

function validate($req, & $input) {
SGL :: logMessage(null, PEAR_LOG_DEBUG);
$this->validated = true;
$input->error = array ();
$input->pageTitle = $this->pageTitle;
$input->masterTemplate = $this->masterTemplate;
$input->template = $this->template;
$input->action = ($req->get('action')) ? $req->get('action') : 'list';
$input->aDelete = $req->get('frmDelete');
$input->submitted = $req->get('submitted');
$input->calendar = (object) $req->get('calendar');
$input->calendarId = $req->get('frmCalendarID');
$input->calendarDate = $req->get('frmCalendarDate');
$input->calendar_id = $req->get('calendar_id');
$input->year = $req->get('year');
$input->month = $req->get('month');
$input->day = $req->get('day');
$input->flag = $req->get('flag');

if ($input->submitted || in_array($input->action, array('insert', 'update'))) {
if (empty($input->calendar->newsdate)) {
$aErrors['newsdate'] = 'Please fill in a newsdate';
}
if (empty($input->calendar->newstitle)) {
$aErrors['newstitle'] = 'Please fill in an newstitle';
}
if(empty($input->calendar->newsdetail)){
$aErrors['newsdetail'] = 'Please fill in an newsdetail';;
}
}

// if errors have occured
if (isset($aErrors) && count($aErrors)) {
SGL::raiseMsg('Please fill in the indicated fields');
$input->error = $aErrors;
$input->template = 'calendarEdit.html';
$this->validated = false;

// save currect title
if ($input->action == 'insert') {
$input->pageTitle .= ' :: Add';
} elseif ($input->action == 'update') {
$input->pageTitle .= ' :: Edit';
}
}

}

function display(& $output) {
if ($this->conf['CalendarMgr']['showUntranslated'] == false) {
$c = & SGL_Config :: singleton();
$c->set('debug', array (
'showUntranslated' => false
));
}
}




/*
* echo event detail
* @authour cjt
*/

function _cmd_eventDetail(& $input, & $output) {
SGL :: logMessage(null, PEAR_LOG_DEBUG);
$output->template = 'calendarEvent.html';
$output->pageTitle = 'CalendarMgr :: EchoEventDeail';
/**
* DB_DataObject :: factory($this->conf['table']['faq']) return $class
* needs DataObjects_Calendar class in /var/entities/Calendar.php
* else error!!
*/

$output->month=$input->month;//show month
$output->year=$input->year;//echo year

//make back parameter This's needs!!
if($input->flag=="dayEventList"){
$output->backParam="frmCalendarDate=".$input->calendarDate."&month=".$input->month."&year=".$input->year;
$output->flag="dayEventList";
}else if($input->flag=="monthEventList"){
$output->backParam="month=".$input->month."&year=".$input->year;
$output->flag="monthEventList";
}else if($input->flag=="event"){
$output->backParam="month=".$input->month."&year=".$input->year;
$output->flag="list";
}

$calendar = DB_DataObject :: factory($this->conf['table']['calendar']);
//$calendar->orderBy('newsdate');

$calendar->newsid = $input->calendarId;
//echo "calendar= ".$input->calendarId;
//echo get_class ( $calendar );//test
$result = $calendar->find();
$events = array ();
/**
* gain data from table.
*/
if ($result > 0) {
while ($calendar->fetch()) {
$calendar->newstitle = $calendar->newstitle;
$calendar->newsdate = $calendar->newsdate;
$calendar->newsdetail = nl2br($calendar->newsdetail); //will /n
$events[] = clone ($calendar);
// $output->month=substr($calendar->newsdate,0,4);//show month
// $output->year=substr($calendar->newsdate,5,2);//show year;
}
}

$output->results = $events;
}
/**
* warranty ( accoding to ) event list
*/
function _cmd_dayEventList(& $input, & $output) {
SGL :: logMessage(null, PEAR_LOG_DEBUG);
$output->template = "calendarEventList.html";
$output->pageTitle = "CalendarMgr :: DayEventList";
$calendar = DB_DataObject :: factory($this->conf['table']['calendar']);
$calendar->newsdate = $input->calendarDate;
$result = $calendar->find();
$events = array ();
if ($result > 0) {
while ($calendar->fetch()) {
$calendar->newsid = $calendar->newsid;
$calendar->newstitle = $calendar->newstitle;
$calendar->newsdate = $calendar->newsdate;
$calendar->newsdetail = $calendar->newsdetail;
$events[] = clone ($calendar);
}
}
$output->results = $events;
//reback needs;
$output->backParam="frmCalendarDate=".$input->calendarDate."&flag=dayEventList&month=".$input->month."&year=".$input->year;
}

function _cmd_monthEventList(& $input, & $output) {
SGL :: logMessage(null, PEAR_LOG_DEBUG);
$output->template = "calendarEventList.html";
$output->pageTitle = "CalendarMgr :: MonthEventList";
$calendar = DB_DataObject :: factory($this->conf['table']['calendar']);
$result = $calendar->find();
$events = array ();
if ($result > 0) {
while ($calendar->fetch()) {
if ($input->year == substr($calendar->newsdate,0,4) and $this->getDigitalMonth($input->month)==(int)substr($calendar->newsdate,5,2)) {
$calendar->newsid = $calendar->newsid;
$calendar->newstitle = $calendar->newstitle;
$calendar->newsdate = $calendar->newsdate;
$calendar->newsdetail = $calendar->newsdetail;
$events[] = clone ($calendar);
}
// echo "
convarsion month = ".$this->getDigitalMonth("July");
}
}
$output->results = $events;
//reback needs;
$output->backParam="month=".$input->month."&year=".$input->year."&flag=monthEventList";//show month
}

function _cmd_list(& $input, & $output) {
SGL :: logMessage(null, PEAR_LOG_DEBUG);
$output->template = 'calendarList.html';
$output->pageTitle = 'CalendarMgr :: List';

// $output->year = $input->year;
// $output->month = $input->month;
// $output->day = $input->day;
$y = $input->year;
$m = $input->month;
// $d = $input->day;
// $mkdate = mktime(0, 0, 0, $m, 0, $y);
/*
* calender construct
*/
$m = $this->getDigitalMonth($input->month);
// echo "m=--------" . $m;

$Month = new Calendar_Month_Weekdays($y, $m);
$Month->build();

// modify cjt
// if (isset ($input->year))
// $query = "SELECT * FROM {$this->conf['table']['calendar']} where newsdate='" . $input->year . '-' . ($input->month + 1) . '-' . $input->day . "'";
// else
$query = "SELECT * FROM {$this->conf['table']['calendar']} where newsdate='" . date('Y-n-j') . "'";
$limit = $_SESSION['aPrefs']['resPerPage'];
$pagerOptions = array (
'mode' => 'Sliding',
'delta' => 3,
'perPage' => $limit,


);
$aPagedData = SGL_DB :: getPagedData($this->dbh, $query, $pagerOptions);
$output->aPagedData = $aPagedData;
$output->totalItems = $aPagedData['totalItems'];

if (is_array($aPagedData['data']) && count($aPagedData['data'])) {
$output->pager = ($aPagedData['totalItems'] <= $limit) ? false : true;
}
/**
* old version
*/
// $this->showCalendar($output);//call function
/**
* call function bigCalendar for gain array have day and events
*/
$currentdate = $this->getCurrentDate($input, $output);
// echo "??".$currentdate["y"];
// echo "??".$currentdate["m"];
/**
* accoding to a include array.
*/
$output->monthArray = $this->bigCalendar($currentdate["y"], $currentdate["m"]); //call function return a array.
// echo "cudate = " . $currentdate["y"] . $currentdate["m"];
//$output->mydate = date("Y-n-j"); //test
/*
* echo year and month
*/
$strMonth = date("F", mktime(0, 0, 0, $currentdate["m"], 1, $currentdate["y"]));
// echo "mkdate=" . $strMonth;
$output->y = $currentdate["y"];
$output->m = $strMonth;

//echo "mkdate = ".date("Y-j-n",$mkdate);
//echo "strtotime= " . strtotime("10 September 2000");
}
/**
* warrang digital month;
*/
function getDigitalMonth($m) {
// $m = $input->month;
if (isset ($m)) {
switch ($m) {
case "January" :
$m = 1;
break;
case "February" :
$m = 2;
break;
case "March" :
$m = 3;
break;
case "April" :
$m = 4;
break;
case "May" :
$m = 5;
break;
case "June" :
$m = 6;
break;
case "July" :
$m = 7;
break;
case "August" :
$m = 8;
break;
case "September" :
$m = 9;
break;
case "October" :
$m = 10;
break;
case "November" :
$m = 11;
break;
case "December" :
$m = 12;
break;
}
}
return $m;
}

/**
* return array include year and month;
*/
function getNextDate($currentMonth) {
$nextDate = array ();
++ $currentMonth;
if ($currentMonth > 12) {
$nextDate["m"] = 1;
$nextDate["y"] = 1; //year add 1;
} else {
$nextDate["m"] = $currentMonth;
$nextDate["y"] = 0;
}
return $nextDate;
}
/**
* return array include year and month;
*/
function getPreviousDate($currentMonth) {
$previousDate = array ();
-- $currentMonth;
if ($currentMonth < 1) {
$previousDate["m"] = 12;
$previousDate["y"] = -1; //year min 1;
} else {
$previousDate["m"] = $currentMonth;
$previousDate["y"] = 0;
}
return $previousDate;
}

/**
* getcurrentdate
* @return array
*/
function getCurrentDate($input) {
$m = $this->getDigitalMonth($input->month); //call function getDigitalMonth accoding to digital month;
// echo "==" . $m;
$cdate = array ();
$y = $input->year;
/**
* saved year and month;
*/
if (isset ($m)) {
if ($input->flag == "add") { //if is >> flag
$cdate = $this->getNextDate($m);
$cdate["y"] += $y;
//echo "add===".$cdate["y"];//test
} else
if ($input->flag == "min") { //if is << flag
$cdate = $this->getPreviousDate($m);
$cdate["y"] += $y;
//echo "min===".$cdate["y"];//test
}
else{
$cdate["m"]=$m;
$cdate["y"]=$y;
}
}
return $cdate;
}



//show calendar
function showCalendar(& $input, & $output) {
require_once 'source/activecalendar.php';
$cal = new activeCalendar();
$output->cal = $cal->showMonth();
}
/*
* calendar splie
* @return array
*/
function bigCalendar(& $y, & $m) {
/*
* constens Month object
*/
if (!isset ($y) || !isset ($m)) {
$y = date("Y");
$m = date("n");
}
$Month = new Calendar_Month_Weekdays($y, $m);
$Month->build();
/*
* talk all day and event
*
*/
$monthArray = array ();
$weekArray = array ();
$dayArray = array ();

while ($Day = $Month->fetch()) {
if ($Day->isEmpty()) {
$weekArray[] = "";
} else {
$fulldate = $y . "-" . $m . "-" . $Day->thisDay(); //fullday
$dayArray["day"] = $Day->thisDay();
$dayArray["fulldate"] = $fulldate;
/*
* date motify in getEvents
*/
$dayArray["events"] = $this->getEvents($fulldate); //call function

if($dayArray["events"]["flag"]) //vardict array data;
$dayArray["flag"]=1;
else
$dayArray["flag"]=0;

/*
* clear $dayArray after join
*/
$weekArray[] = $dayArray;
$dayArray = array ();
}
if ($Day->isLast()) {
/*
* clear $weekArray after join
*/
$monthArray[] = $weekArray;
$weekArray = array ();
}

}
return $monthArray;
}

/**
* warranty(according to) currentdate fetch events!
* get Events array
* @param $currentdate current date. formatdate e.g: date('Y-n-j') //show "2006-8-11"
* return array
*
*/
function getEvents($currentdate) {
$query = "SELECT * FROM {$this->conf['table']['calendar']} where newsdate='" . $currentdate . "'";
//$limit = $_SESSION['aPrefs']['resPerPage'];
$pagerOptions = array (
'mode' => 'Sliding',
'delta' => 3,
'perPage' => 10,


);
$aPagedData = SGL_DB :: getPagedData($this->dbh, $query, $pagerOptions);
/**
* events included event;
* event included
* event[self] = eventself(string)
* event[id] = eventid(int)
*/
$events = array ();
$event = array ();
/*
* talk events in the aPagedData[data]
* first talk rows info
* thencd dicteri "newstitle" isset
* if rows["newstitle"] is set will newstitle insert into $events array
*/
//echo "count = ".count($aPagedData['data']);
if(count($aPagedData['data'])>0){
foreach ($aPagedData['data'] as $title => $rows) {
/*
* error logic
*/
//foreach ($rows as $col => $value) {
//return ($col == "newstitle" && isset ($value)) ? $value : 't';
//}
/*
*
*/
if (isset ($rows["newstitle"])) {
$event["title"] = $rows["newstitle"];
$event["id"] = $rows["newsid"];
$events[] = $event; //will $event save $events
$event = array (); //clear $event;
}
}
$events["flag"]=1;
}else
$events["flag"]=0;
return $events;
}
}
?>

从数据库导出数据到Excel表(jxl.jar)

package com.*****.query;

import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import jxl.*;
import jxl.write.*;
import jxl.write.biff.RowsExceededException;

/**
* 对Excel表进行操作
*
* @author ********
*
*/
public class ExcelUtil {
private static Log log = LogFactory.getLog(ExcelUtil.class);

public boolean DB2Excel(ResultSet rs,OutputStream os) {
boolean flag = false;
WritableWorkbook workbook = null;
WritableSheet sheet = null;
Label label = null;

// 创建Excel表
try {
// workbook = Workbook.createWorkbook(new File("d:/output.xls"));
workbook = Workbook.createWorkbook(os);
// 创建Excel表中的sheet
sheet = workbook.createSheet("First Sheet", 0);

// 定义表中的数据
// Label label = new Label(0, 0, "k k 中国人*");
// Label label1 = new Label(0, 1, "A label record");
// Label label3 = new Label(0, 2, "3.14159");
// Number number = new Number(1, 1, 3.1459);

// 向Excel中添加数据

ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
String colName = null;
int row = 0;
// 添加标题
for (int i = 0; i < columnCount; i++) {
colName = rsmd.getColumnName(i + 1);
label = new Label(i, row, colName);
// log.info("标题:"+i+"---"+row +"---"+ colName);
sheet.addCell(label);
}
row++;
log.info("写入标题成功");
while (rs.next()) {
for (int i = 0; i < columnCount; i++) {
label = new Label(i, row, rs.getString(i+1));
// log.info("行:"+i+"---"+row +"---"+ rs.getString(i+1));
sheet.addCell(label);
}
row++;
}
log.info("写入内容成功");

// 关闭文件
workbook.write();
workbook.close();
log.info("数据成功写入Excel");
flag = true;
} catch (SQLException e) {
log.info(e.getMessage());
} catch (RowsExceededException e) {
log.info(e.getMessage());
} catch (WriteException e) {
log.info(e.getMessage());
} catch (IOException e) {
log.info(e.getMessage());
} finally{
try {
workbook.close();
} catch (Exception e) {
}
}
return flag;
}

public static void main(String[] args) {
try {

Class.forName("net.sourceforge.jtds.jdbc.Driver");
Connection con = DriverManager
.getConnection(
"jdbc:jtds:sqlserver://localhost:1433/abc",
"sa", "sa");
Statement st = con.createStatement();
ResultSet rs = st
.executeQuery("select * from abc.dbo.sss");
// if (!new ExcelUtil().DB2Excel(rs)){
// log.info("数据写入失败");
// }
rs.close();
st.close();
con.close();

} catch (Exception e) {
e.printStackTrace();
}
}
}


在servlet中的使用

// 写入EXCEL
if (action != null && action.startsWith("excel.q")) {
try {
// response.setContentType("application/vnd.ms-Excel");
//设置文件输出成Excel文件,在网页上的点击链接,就会下载成report.xls
response.setHeader("Content-Disposition", "attachment; filename=report.xls");
st = con.createStatement();
rs = st.executeQuery(sql);
System.out.println(sql);
OutputStream os = response.getOutputStream();

if (!new ExcelUtil().DB2Excel(rs, os)) {
log.info("Excel写入失败");
}
os.flush();
os.close();
} catch (Exception e) {
log.info(e.getMessage());
}
}

content-type 的所有可选项

'ez' => 'application/andrew-inset',
'hqx' => 'application/mac-binhex40',
'cpt' => 'application/mac-compactpro',
'doc' => 'application/msWord',
'bin' => 'application/octet-stream',
'dms' => 'application/octet-stream',
'lha' => 'application/octet-stream',
'lzh' => 'application/octet-stream',
'exe' => 'application/octet-stream',
'class' => 'application/octet-stream',
'so' => 'application/octet-stream',
'dll' => 'application/octet-stream',
'oda' => 'application/oda',
'pdf' => 'application/pdf',
'ai' => 'application/postscript',
'eps' => 'application/postscript',
'ps' => 'application/postscript',
'smi' => 'application/smil',
'smil' => 'application/smil',
'mif' => 'application/vnd.mif',
'xls' => 'application/vnd.ms-Excel',
'ppt' => 'application/vnd.ms-Powerpoint',
'wbxml' => 'application/vnd.wap.wbxml',
'wmlc' => 'application/vnd.wap.wmlc',
'wmlsc' => 'application/vnd.wap.wmlscriptc',
'bcpio' => 'application/x-bcpio',
'vcd' => 'application/x-cdlink',
'pgn' => 'application/x-chess-pgn',
'cpio' => 'application/x-cpio',
'csh' => 'application/x-csh',
'dcr' => 'application/x-Director',
'dir' => 'application/x-director',
'dxr' => 'application/x-director',
'dvi' => 'application/x-dvi',
'spl' => 'application/x-futuresplash',
'gtar' => 'application/x-gtar',
'hdf' => 'application/x-hdf',
'js' => 'application/x-javascript',
'skp' => 'application/x-koan',
'skd' => 'application/x-koan',
'skt' => 'application/x-koan',
'skm' => 'application/x-koan',
'latex' => 'application/x-latex',
'nc' => 'application/x-netcdf',
'cdf' => 'application/x-netcdf',
'sh' => 'application/x-sh',
'shar' => 'application/x-shar',
'swf' => 'application/x-shockwave-flash',
'sit' => 'application/x-stuffit',
'sv4cpio' => 'application/x-sv4cpio',
'sv4crc' => 'application/x-sv4crc',
'tar' => 'application/x-tar',
'tcl' => 'application/x-tcl',
'tex' => 'application/x-tex',
'texinfo' => 'application/x-texinfo',
'texi' => 'application/x-texinfo',
't' => 'application/x-troff',
'tr' => 'application/x-troff',
'roff' => 'application/x-troff',
'man' => 'application/x-troff-man',
'me' => 'application/x-troff-me',
'ms' => 'application/x-troff-ms',
'ustar' => 'application/x-ustar',
'src' => 'application/x-wais-source',
'xhtml' => 'application/xhtml+xml',
'xht' => 'application/xhtml+xml',
'zip' => 'application/zip',
'au' => 'audio/basic',
'snd' => 'audio/basic',
'mid' => 'audio/midi',
'midi' => 'audio/midi',
'kar' => 'audio/midi',
'mpga' => 'audio/mpeg',
'mp2' => 'audio/mpeg',
'mp3' => 'audio/mpeg',
'aif' => 'audio/x-aiff',
'aiff' => 'audio/x-aiff',
'aifc' => 'audio/x-aiff',
'm3u' => 'audio/x-mpegurl',
'ram' => 'audio/x-pn-realaudio',
'rm' => 'audio/x-pn-realaudio',
'rpm' => 'audio/x-pn-realaudio-plugin',
'ra' => 'audio/x-realaudio',
'wav' => 'audio/x-wav',
'pdb' => 'chemical/x-pdb',
'xyz' => 'chemical/x-xyz',
'bmp' => 'image/bmp',
'gif' => 'image/gif',
'ief' => 'image/ief',
'jpeg' => 'image/jpeg',
'jpg' => 'image/jpeg',
'jpe' => 'image/jpeg',
'png' => 'image/png',
'tiff' => 'image/tiff',
'tif' => 'image/tiff',
'djvu' => 'image/vnd.djvu',
'djv' => 'image/vnd.djvu',
'wbmp' => 'image/vnd.wap.wbmp',
'ras' => 'image/x-cmu-raster',
'pnm' => 'image/x-portable-anymap',
'pbm' => 'image/x-portable-bitmap',
'pgm' => 'image/x-portable-graymap',
'ppm' => 'image/x-portable-pixmap',
'rgb' => 'image/x-rgb',
'xbm' => 'image/x-xbitmap',
'XPm' => 'image/x-xpixmap',
'xwd' => 'image/x-xwindowdump',
'igs' => 'model/iges',
'iges' => 'model/iges',
'msh' => 'model/mesh',
'mesh' => 'model/mesh',
'silo' => 'model/mesh',
'wrl' => 'model/vrml',
'vrml' => 'model/vrml',
'Css' => 'text/css',
'html' => 'text/html',
'htm' => 'text/html',
'asc' => 'text/plain',
'txt' => 'text/plain',
'rtx' => 'text/richtext',
'rtf' => 'text/rtf',
'sgml' => 'text/sgml',
'sgm' => 'text/sgml',
'tsv' => 'text/tab-separated-values',
'wml' => 'text/vnd.wap.wml',
'wmls' => 'text/vnd.wap.wmlscript',
'etx' => 'text/x-setext',
'xsl' => 'text/xml',
'xml' => 'text/xml',
'mpeg' => 'video/mpeg',
'mpg' => 'video/mpeg',
'mpe' => 'video/mpeg',
'qt' => 'video/quicktime',
'mov' => 'video/quicktime',
'mxu' => 'video/vnd.mpegurl',
'avi' => 'video/x-msvideo',
'movie' => 'video/x-sgi-movie',
'ice' => 'x-conference/x-cooltalk',

Wednesday, March 21, 2007

ant 使用总结

1,先从http://ant.apache.org/下个ant;
2.设置环境变量:添加ANT_HOME指向可以看到bin的文件夹设置path指向bin;
3.build.xml文件
包含定义变量,定义path,初始化,编译,布署,清理几个部分,每个部分都可以通过ant targetName 直接运行path大都用来定义lib path初始化用来建立生成文件时要用的文件夹编译是调用JAVAC来实现的布署是将所有的文件打包成jar 并copy到指定的web容器中清理是删除生成的文件以上的各个部分都是通过一个独立target元素来定义的具体设置和用法可参照http://ant.apache.org/manual/index.html
运行时在DOS下进行入可以看到build.xml的地方,直接键入ant 回车即可,ant 会看自动调用当前目录下的build.xml文件,如果要单独完成其中一个步骤可以用ant targetName 回车
研究了一天的ant,总算是学会怎么用了...
ant是个不错的工具,如果不用eclipse开发的话,这个工具在布署大型程序时是不可少的!!

我早前的收藏夹




Personal Toolbar Folder



Google

Workbench



Society for Design Administration
phpMyAdmin
PHP: Hypertext Preprocessor
PHP Classes - Browse the available classes
Seagull
PJ-wiki
Seagull Framework :: Home
Seagull test :: Home
Evane Zone - Journal
Society for Design Administration :: Home
Webmonkey | Reference: Special Characters
Society for Design Administration :: Home
192.168.100.6 / localhost / sdany / mynews | phpMyAdmin 2.7.0-pl2


Work



客齐集
前程无忧
中华英才网!
1010Job 精英招聘 | 好工作好生活 精英职位
欢迎光临国家职业资格工作网


News



中青网
上海热线欢迎您!
Shanghai Daily
人民网
凤凰网
ChineseTV.us - 美国中文电视台
美国网络电视 >> 网站首页
LatestNews.do
中文网络报刊----共收集了2000种中英文报刊的网址
世界经理人—世界第一商人门户 企业领袖互动平台


Study



语言交换社区 - 学习英语, 法语, 西班牙语 - 练习外语
旺旺英语学习网_免费学英语_优秀的学习英语网站
泡泡英语吧全球唯一齐全的英语免费学习和娱乐的网站!提供大量英语学习素材、视频、动画、文章、语音等等 >> 首页
英语通(in2english.com.cn)-中英合作,免费学英语,多媒体互动,商务英语,英语教学,雅思,四级考试,儿童英语,英语聊天、论坛博客
http://www.oxford.com.cn/
韩语学习第一站
KBS WORLD Radio
¼­°­´ëÇб³ Çѱ¹¾î °­ÁÂ
/korea/####
벅스 - 음악, 그 이상의 즐거움
看流行韩剧 简单学韩语
英语沙龙 >> 网站首页
洪恩在线 -> 轻松英语 -> 英语沙龙
每日一笑 - 洪恩在线
英语麦当劳-网络英文快餐杂志EnglishCN.com[北京]
Web 2.0 ECT: 台灣英語網 - 英語聊天室
我爱英语网_英语学习者的快乐家园_提供MP3英语听力下载


E-Mail



Personalize Your Homepage
Sign in to Yahoo!
雅虎免费邮箱


Technology



CSDN.NET


Temp



韩国网址大全 KrUrl.com 韩国设计资源素材下载_韩国网站导航_精选韩文酷站_网页素材_网页载图_欧美网页载图_韩国网页截图_Flash源文件下载_网页模板源文件_图片素材_网页源码下载_标志设计_商标设计_韩国网页PSD源文件下载_矢量图片_矢量插画源文件下载_设计酷站_韩国音乐_游戏_电影电视韩站_韩国时尚_旅游韩站_韩国服装_购物麻辣flash酷站欣赏大全
AltaVista 검색: love
韩国门户网站大全
Firefox - 什麼是「即時書籤」(Live Bookmarks)?
英文 看看你属于哪一种美女?
网络聊天常用英语
英语口语资料_英语面试问答小技巧_无忧考网 51Test.NET
中青网英语角englishcorner
美丽英语 每天学(1)
日语输入法:如何安装windows系统自带的日文输入法/韩文输入法 Global IME (HowTO: Howto Install the IME for the Janpese)
日文字体 下载
外语时空软件下载-www.langsky.com
index3.htm
user.websites.cuisinenet.cafe.bios
中国互联网络信息中心 (CNNIC)
徐薇英文==男生的診斷書
★::..中国集藏在线..::★--收藏品资料库
ICQ是什么?
精彩生活
Downloading Skype
中国十大免费电影网站排行 - *SIYIZHU'S WEBLOG™
狐谷娱乐小电影www.hugoo.cn--美女写真、激情热舞
Hello : Welcome
Serials & keys - unlocks the world


Tools



WorldLingo 免費線上與專業翻譯
AOL.com - Welcome to AOL
AIM Pro - Free Software Downloads and Software Reviews - Download.com
WINDOWS XP终极设置(呕心沥血版) - *SIYIZHU'S WEBLOG™
老鬼的blog
老丁网_RSS导航_RSS地址_免费格子尽在laoding.com
RSS邮天下 : RSS资源
OKRSS导航,最丰富的中文RSS导航和订阅网站
http://evane.squarespace.com/
爱词霸_免费在线查词翻译_英语学习社区
中国移动通信
51Testing软件测试网:vi使用手册
Headlines
书友榜
一些RSS资源 - *SIYIZHU'S WEBLOG™



ajax



A P R E S S . C O M
A9.com Maps
Ajaxian
digg
Google
Main Page - Ajax Patterns
Main Page - Ajax Patterns


apache



Apache Week. The essential free resource for users of the world's most popular web server.
Serverwatch's Apache Today
Welcome! - The Apache Software Foundation


bt



BitComet - 高效好用的BT软件 - 官方下载


download



Download.com下载页[英文]
华军软件园
天使在线
天空下载站
太平洋电脑下载基地
电脑之家软件下载
霏凡软件站
西安信息资源网|信息发布|电子书下载|E书下载|免费下载
E书下载,电子书下载,JAVA教程下载,教程下载,认证考试,教程下载,教育,培训,免费下载
Download.com


goodArticle



The Joel on Software Discussion Group - Why I Hate Frameworks


java



CN-JAVA-下载中心-分类下载
JDK 5 Documentation
小杨在线--Java爱好者 免费Java教程下载,Java电子书籍,Java技术文章


javascripts



http--www.cgiscript.net-site_javascripts.htm


database



SQL Manager | EMS SQL Manager for MySQL | Product Files
Database Journal The Knowledge Center for MySQL Professionals
MySQL AB The world's most popular open source database
searchOracle.com


joyo



四海交友网——全球华人的网上交友新天地


Links



Chinese-English Dictionary
CvsGui
CVS使用手册 WinCVS CVSWeb CVSTrac
Manual - ChinaUnix.net技术文档手册中心
freshmeat.net Welcome to freshmeat.net
Amazon.com
TWiki - Enterprise Collaboration Platform & Wiki
SourceForge.net Powerbar - Discover IBM WebSphere Application Community Server Edition based on Apache Geronimo
WorkflowSm.gif
致谢与译者声明 - Apache 2.2 中文版参考手册
Welcome! - The Apache HTTP Server Project
argouml.tigris.org
开源书签 - 提供自由软件和开放源码简体中文站点的链接
上海浦东软件园
WBSA官方网站
月光软件站-源程序代码下载网
婉兮清扬(java中文文档)
小杨在线--Java爱好者 免费Java教程下载,Java电子书籍,Java技术文章
源码下载 asp源码 flash源码 网站源码 源码之家 中国源码下载站 - 人贫穷的时候会成为国家、社会、家庭的负担
销售排行
SourceForge.net: Welcome to SourceForge.net
The world's largest development and download repository of Open Source code and applications
欢迎光临国家职业资格工作网
在Eclipse 2.0中使用版本控制系统CVS
2002年6月28日,Eclipse 2.0正式版已经正式完成,这将是Java开发工具历史上的一个重要事件,Eclipse开始步入成熟阶段。本文借此机会介绍在Eclipse中使用版本控制系统CVS的一些经验和技巧。首先介绍为什么Eclipse要使用CVS来作为自己的版本控制系统而放弃了有着很好口碑的Visual Age Java的ENVY,然后简要讲述CVS系统的背景及NT平台下CVS服务器的安装和设置。接下来,针对Eclipse,详细讲解了使用CVS进行团队开发时的开发流程以及在Eclipse中具体使用的重要操作方法。
清风网络
中国移动通信
中国硬笔书法在线→中国书法艺术专题网站[书法作品 书法欣赏 书法字体 钢笔书法函授]
《中国硬笔书法在线》www.yingbishufa.com是一个面向硬笔书法家和硬笔书法爱好者的书法艺术专题站点,网站不以盈利为目的,旨在继承祖国优秀传统文化,弘扬汉字硬笔书法艺术,并试图通过互联网这一现代媒体架起一座广大和硬笔书法爱好者学习、探讨、交流硬笔书法的桥梁。
中国书法
《唐诗宋词》
IT公司速查手册-IT人士求职参考
IT公司速查手册 IT公司评论与评价 IT人士求职参考 监督IT企业 让IT业主了解程序员的心声 让我们的程序员以及IT工作者生活的更美好
HTML and CSS Tutorials, References, Articles and News - HTML Dog
How to make web pages - A good practice guide to HTML and CSS.
css Zen Garden: The Beauty in CSS Design
A demonstration of what can be accomplished visually through CSS-based design.
货币符号表
世界各国货币名称
货币介绍篇 - 中国银行
Screensavers - The Very Best from screensaver.com: Free and Custom Developed Screen Savers
Screensavers and Desktop Themes for Windows. The Best collection of Screensavers and Desktop Themes anywhere!
屏保中国 - 中国屏幕保护第一网站! 大量免费屏保, 壁纸, 桌面主题及桌面工具下载, 每日更新!
屏保中国提供大量最新屏保,墙纸,桌面主题及桌面工具下载,内容包括自然风光,明星偶像,流行音乐,艺术经典,卡通动画,电影大片,优秀电视剧等,并有大量动态屏保及壁纸作品,全部免费下载.
Eric Meyer: CSS
Open Source Initiative OSI - Welcome
The Open Source Home Page
About.com: http://www.atomfilms.com/
Opera browser: Homepage
Opera - The Fastest Browser on Earth
字体精品网 - 字体下载


Media



Bloomberg
Capitol Records
CBS
CNBC Dow Jones Business Video
CNET Today - Technology News
CNN Videoselect
Disney
ESPN Sports
Fox News
Fox Sports
Hollywood Online
Internet Radio Guide
MSNBC
MUSICVIDEOS.COM
NBC VideoSeeker
TV Guide Entertainment Network
Universal Studios Online
Warner Bros. Hip Clips
What's On Now
Windows Media Showcase
中国DJ嗨嗨网 www.djkk.com DJ 舞曲 现场舞曲 中文舞曲 英文舞曲 流行音乐 迪吧 舞曲下载
MTV下载-免费MTV视听
Free Movie Downloads
Find free movie downloads, download a movie player, watch an online movie, or catch the latest movie premieres.


pear lib



DB_DataObject
HTML_Template_Flexy


uml



UMLChina--软件以用为本


works



Untitled Document


在线词典



0.金山词霸在线词典
1.Dr.eye 译典通在线词典
2.中华在线汉语词典
3.赢政成语字典
4.洪恩在线双向词典
6.Dict.CN在线词典


快速搜索


处理对地址栏的搜索


Google 快速搜索
在地址栏中输入 "g <搜索表达式>" 即可使用 Google 搜索
手气不错快速搜索
在地址栏中输入 "goto <表达式>" 即可使用 Google 搜索该表达式结果的顶级列表
Dictionary.com 快速搜索
在地址栏中输入 "dict <单词>" 即可搜索一个单词
字典快速搜索
在地址栏中输入 "webster <单词>" 即可搜索一个单词
股票代号快速搜索
在地址栏中输入 "quot <股票代号>" 即可搜索一个股票代号的信息
使用VeryCD搜索eMule资源
在地址栏中输入 "emule <单词>" 即可在VeryCD资源库中搜索此资源


php



Seagull - Trac
SourceForge.net: Version 0.9.0 released
The world's largest development and download repository of Open Source code and applications
- 喜悦国际村 |php教程|免费php空间|php论坛|php源码| - www.phpx.com
喜悦国际村,php教程,免费php空间,php论坛,php文件,php mysql,php源码,mysql下载.
PHP源码-源码下载中心(第2页)-Code.knowsky.com
PHP Classes - Browse the available classes
Groups
中国最专业的开发资源搜索引擎,源码下载,毕业设计,注册机,网页模板,页面脚本,技术文档,文章,课件库,控件库,常用软件,开发辅助资源
源代码,Delphi,vb,vc,vf,PB,c\c++,ERP,asp,php,jsp,源码下载,CGI,Flash,oa,crm函数,教程,论文,技巧,算法,原创,文档,社区,交友,注册码,电影,免费,图片,系统,管理系统
大型软件下载注册sn:visio2004.matlab6.sql2000.oracle9.QQ2004显示IP
provide
PHP: Hypertext Preprocessor
中国PHP联盟
喜悦国际村,中国PHP联盟, php programming ,php templates , php encryption.
phpDocumentor The complete documentation solution for PHP
PriceRunner
PuTTY a free telnet-ssh client
Radio Station Guide
Exceed PHP - 在PHP世界中选择最合适的模板--比较PHPLIB Template和FastTemplate
在PHP世界中选择最合适的模板--比较PHPLIB Template和FastTemplate
Seagull API
SeagullDocs : Home Page(off line)
An OOP PHP Application Framework with CMS features
Seagull API(offline)
Smarty : Template Engine
osCommerce, Open Source Online Shop E-Commerce Solutions
[M] Channel M
codeexamples [Seagull]
codewalkers.com - main page - PHP Help
conceptscorelibs [Seagull]
heiyeluren的Blog
homepage [Seagull]
homepage cjcht
Hotscripts.com PHP
http--dev.csdn.net-
Open Source Web Development Tutorials - Dev Shed
PEAR Manual DB_DataObject
PEAR The PHP Extension and Application Repository
Philip and Alex's Guide to Web Publishing
PHP PHP 手册 - Manual
PHP 语言参考 - Manual
PHP5 - PHP Wiki
PHPClub.net
PHPEclipse.net
PHP-GTK
PX top
Seagull API
Seagull PHP Framework Overview
Security Web Application Security - Web Application Component Toolkit
The PHP Resource Index
The world of PHPWizard.net
tutorialscreatingyourownmodules040 [Seagull]
Tutorials-HelloWorld - Seagull - Trac
Webmonkey The Web Developer's Resource
osCommerce Knowledge Base(offline)


Linux



中国Linux公社
Scientific Linux - ChinaUnix下载频道
Scientific Linux - Welcome to Scientific Linux (SL)
How to use RPM Commands
Securing and Optimizing Linux
Fcitx──小企鹅输入法 2.x文档 | Linux中文输入法──Fcitx.Org
LinuxSir.Org | Linux、BSD、Solaris、Unix | 开源传万世,因有我参与~
Compiling and installing software from source in Linux

Distros



DistroWatch
Debian
Fedora
Gentoo
KNOPPIX
Mandriva
Ubuntu
openSUSE
RedHat
SUSE



JAVA



JSTL 入门: 表达式语言
JSP 标准标记库(JSP Standard Tag Library,JSTL)是一个实现 Web 应用程序中常见的通用功能的定制标记库集,这些功能包括迭代和条件判断、数据管理格式化、XML 操作以及数据库访问。在 developerWorks 上其新系列的第一篇文章中,软件工程师 Mark Kolb 向您展示了如何使用 JSTL 标记来避免在 JSP 页面中使用脚本编制元素。您还将了解如何通过从表示层删除源代码来简化软件维护。最后,您将了解 JSTL 经过简化的表达式语言,它允许在不必使用功能齐全的编程语言的情况下对 JSTL 操作指定动态属性值。
小杨在线-->Java爱好者 免费Java教程下载,Java电子书籍,Java技术文章
MyEclipse J2EE IDE - Easy and affordable eclipse plugin development tools
MyEclipse offers a complete Eclipse plugin resource center, including J2EE development tools, application server integration, support, know-how and Eclipse customization services.
DOM & JDOM
Java Technology
EclipsePlugins : plugin overview
Directory overview of available OTI Eclipse and IBM Websphere Studio Application Developer (WSAD) plugins, find your Eclipse plugin here!


Blog



欢迎来到天涯虚拟社区
天涯虚拟社区---天涯在线网络科技有限公司


RSS



新华网新闻



国内新闻
国际新闻
财经新闻
体育新闻
军事新闻
IT新闻
科技新闻
文娱新闻
教育新闻
图片新闻
法治新闻


百度新闻



百度国内新闻
百度国际新闻
百度体育新闻
百度娱乐新闻
百度互联网新闻
百度科技新闻
百度财经新闻
百度社会新闻


新浪新闻要闻
VeryCD资源更新
ChinaByte新闻总线
DoNews IT写作社区
Donews Blog
365Key 天天网摘
CNBlog: Blog on Blog


Mozilla Firefox 和 Mozilla 的信息


关于 Mozilla Firefox 和 Mozilla 的信息


Mozilla Firefox 主页
Mozilla Firefox 扩展
Mozilla Firefox 附加程序及扩展
Mozilla Firefox 主题
Mozilla Firefox 主题
Mozilla Firefox 帮助
Firefox 中文帮助站点