wordpress query_posts()

This item was filled under [ wordpress tips ]

将query_posts()放在LOOP之前限定你所需要的条件,wp_query会产生一个新的使用你的参数的SQL查询,而忽视通过URL接收到的其它的参数,如果想不忽略,可以在调用中使用$query_string。

query_posts($query_string . “&order=ASC”)

设置文章显示的顺序,但是不干扰其余的查询字符串,参数前须有“&”符号

其他还有N多用途~~

* 主页不显示某一分类下的日志

if (is_home()) {
query_posts("cat=-3");
}
?>

* 获得特定的日志

query_posts('p=5');
?>

* 获得特定的页面

query_posts('page_id=7'); //只返回网页7
?>

query_posts('pagename=about'); //只返回关于网页
?>

query_posts('pagename=parent/child'); // 返回母网页的子网页
?>

* 创建所有文章列表,并且提供分页功能

query_posts($query_string.'posts_per_page=-1');
while(have_posts()) { the_post();
put your loop here ;
}
?>

==========================================
类别 参数

显示属于某个类别的文章

* cat
* category_name

根据ID显示一个类别

只显示来自一个类别ID的文章

query_posts(‘cat=4′);

根据名称显示一个类别

只显示属于某个类别名的文章

query_posts(‘category_name=Staff Home’);

显示几个类别及ID

显示属于几个类别ID的文章

query_posts(‘cat=2,6,17,38′);

删除某个类别的文章

显示所有的文章,但是类别ID前面有个’-’(负号)负号的类被除外。

query_posts(‘cat=-3′);

删除属于类别3的所有文章。有一个限制性条款:会删除只属于类别3的所有文章。如果一个类别也同时属于其它的类别,这个类别仍然不会被删除。
标签参数

显示与某个标签相关的文章

* tag

为某个标签提取文章

query_posts(‘tag=cooking’);

获得拥有任何这样的标签的文章

query_posts(‘tag=bread,baking’);

获取拥有这三个标签的文章

query_posts(‘tag=bread+baking+recipe’);

作者参数

你也可以根据作者限制文章数目

* author_name=Harriet
* author=3

author_name在 user_nicename区操作, 同时作者 在作者id上操作。
文章 & 网页参数

返回一篇单独的文章或者一个单独的网页

* p=1 – 使用文章 ID来显示第一篇文章
* name=first-post – 使用 post Slug 显示第一篇文章
* page_id=7
* pagename=about
* showposts=1 (你可以使用 showposts=3,或者其它的任何数字显示一定数目的文章)

由于 模板层级方面的原因, home.php先执行了。这意味这你可以编写一个home.php,home.phh调用query_posts()重新得到一个特别的网页并且将那个网页设置为你的首页。没有任何插件或者hacks,你需要运行一个机制,并且显示和维护一个非博客的首页。

更有用的方法,可能是利用WP的网页功能并且为你的首页使用这个功能。你可以将”关于网页”设置为entry point或者设置为站点的末页。你可能执行一些更动态的步骤,设置一个自定义网页,显示最近的评论,文章,类别,存档。请看看下面的例子。
时间参数

得到某个特别的时间段内发表的文章

* hour=
* minute=
* second=
* day= – 一个月中的每一天; 显示,例如,十五号发表的所有文章。
* monthnum=
* year=

网页参数

* paged=2 -显示使用”以前发表的文章”链接时,通常在网页2上显示的文章。

* posts_per_page=10 -每个网页显示的文章数目;-1这个值,会显示所有的文章。

* order=ASC -按时间顺序显示文章,以相反的顺序显示DESC(默认)

Offset 参数

你不能转移或者忽视一个或者更多的原始文章,这些文章一般是你的query同时使用offset参数收集到的。

下面的函数会显示(1)最近的5篇文章

query_posts(’showposts=5&offset=1′);

根据参数排序

根据这个区给得到的文章排序

* orderby=author
* orderby=date
* orderby=category
* orderby=title
* orderby=modified
* orderby=modified
* orderby=menu_order
* orderby=parent
* orderby=ID
* orderby=rand

同时考虑”ASC”或者的”DESC”的排序参数
联合参数

你可能从上面的例子中注意到,你使用一个&(&符号)将参数组合在一起,像:

query_posts(‘cat=3&year=2004′);

类别13,关于当前月份显示在主页上的文章:

if (is_home()) {
query_posts ($query_string . ‘&cat=13&monthnum=’ . date(‘n’,current_time(‘timestamp’))); }

在2.3版本中,这个参数组合会返回属于类别1同时属于类别3的文章,只显示两篇(2)文章,根据标题,按降序排列:

query_posts(array(‘category__and’=>array(1,3),’showposts’=>2,’orderby’=>title,’order’=>DESC));

在2.3和2.5版本中,你可能期待下面的内容,返回属于类别1并且标签为”苹果”的所有文章

query_posts(‘cat=1&tag=apples’);

一个bug阻止这个运行。请看看Ticket #5433,一个工作区要搜索几个使用+的标签

query_posts(‘cat=1&tag=apples+apples’);

对于先前的查询,这个会产生期待的结果。注意使用’cat=1&tag=apples+oranges’能够产生期待的结果。

Bookmark and Share

ubuntu 更换软件主程序

This item was filled under [ 一步一步学习中 ]

sudo update-alternatives –config 程序名

更换主程序

Bookmark and Share

python socket.error: (98, 'Address already in use')

This item was filled under [ 一步一步学习中 ]

Traceback (most recent call last):
File “google_appengine/dev_appserver.py”, line 60, in <module>
run_file(__file__, globals())
File “google_appengine/dev_appserver.py”, line 57, in run_file
execfile(script_path, globals_)
File “/home/a/google_appengine/google/appengine/tools/dev_appserver_main.py”, line 474, in <module>
sys.exit(main(sys.argv))
File “/home/a/google_appengine/google/appengine/tools/dev_appserver_main.py”, line 453, in main
static_caching=static_caching)
File “/home/a/google_appengine/google/appengine/tools/dev_appserver.py”, line 3209, in CreateServer
return BaseHTTPServer.HTTPServer((serve_address, port), handler_class)
File “/usr/lib/python2.5/SocketServer.py”, line 330, in __init__
self.server_bind()
File “/usr/lib/python2.5/BaseHTTPServer.py”, line 101, in server_bind
SocketServer.TCPServer.server_bind(self)
File “/usr/lib/python2.5/SocketServer.py”, line 341, in server_bind
self.socket.bind(self.server_address)
File “<string>”, line 1, in bind
socket.error: (98, ‘Address already in use’)

这个问题,主要是没把上一个项目关闭

解决方法,把终端关了,再开,或者把用户注销下下

Bookmark and Share
Tagged with: [ , ]

被GAE的yaml电到。。。

This item was filled under [ 一步一步学习中 ]

额额,配yaml的时候发现要位置匹配正确才ok,连空格都是必须的。。。

Bookmark and Share

imagetoolbar

This item was filled under [ 一步一步学习中 ]

在HEAD中加入
<META   HTTP-EQUIV=”imagetoolbar”   CONTENT=”no”>

可以使用户浏览网页图片时不出现复制的按钮

Bookmark and Share

PHP做Linux/Unix守护进程

This item was filled under [ php技巧 ]

[ 起源 ]Linux/Unix下守护进程(Daemon)大家都知道,比如我们常用的httpd、mysqld等等,就是常驻内存运行的程序,类似于Windows下的服务。一般守护进程都是使用C/C++来写,就是通过fork生成子进程,当前台shell下的父进程被杀掉,子进程就转到后台运行,为了不在终端产生输出信息,就通过syslog等函数来写日志文件。

我们知道php是脚本语言,通过php的脚本引擎来执行,所以要做成守护进程比较麻烦,我们今天就来结合Unix/Linux的命令来实现我们守护进程的功能。

[ 原理 ]Unix中的nohup命令的功能就是不挂断地运行命令,同时nohup把程序的所有输出到放到当前目录的nohup.out文件中,如果文件不可写,则放到<用户主目录>/nohup.out 文件中。那么有了这个命令以后,我们的php程序就写程shell脚本,使用循环来让我们的脚本一直运行,那么不管我们终端窗口是否关闭,都能够让我们的php脚本一直运行。当然,当我们的php进程被杀或者我们的操作系统重启了,自然就会中止了。

[ 功能 ]肯定会问,让我们的php脚本做了守护进程又有什么用处呢?当然有,比如最典型的作用,能够基本的替代cron的功能,比如我们需要定期实行的某些操作,完全可以交给它来做,不再需要cron,当然,如果服务器重启就没有办法了,不过,一般的Unix服务器不是那么容易重启的。另外,我们还可以做一个简单的服务器端的功能,比如做一个能够Telnet过去的服务器,嘿嘿,可以做成一个小后门,不过这样实现稍微有点复杂。

[ 实践 ]例子一:自动生成文件

我们现在来做两个例子来证明我们上面的说法。首先第一个是每个三十秒自动生成一个文件,永远执行下去。

首必须确保操作系统是Unix或者Linux,比如可以是FreeBSD、Redhat、Fedora或者SUSE什么的。然后我们必须确保我们的php 脚本引擎是在 /usr/local/php/bin/php,具体路径可以按照你实际路径来写,如果没有脚本引擎,请自行安装。

比如当前目录是 /home/heiyeluren/,那么我们使用vi或者其他编辑器编写一个叫做php_daemon1.php的文件:

$ vi php_daemon1.php

然后写入如下代码:

#! /usr/local/php/bin/php
set_time_limit(0);
while(1)
{
@fopen("test_".time().".txt","w");
sleep(30);
}
?>

然后保存并且退出vi,然后赋予php_daemon1.php文件可执行权限:

$ chmod +x /home/heiyeluren/php_daemon1.php

然后再让我们的脚本再后台执行,执行如下命令:

$ nohup /home/heiyeluren/php_daemon1.php &

记得最后加上 & 符号,这样才能够跑到后台去运行,执行上述命令后出现如下提示:

[1] 82480

appending output to nohup.out

再回后车后将出现shell提示符。那么上面的提示就是说,所有命令执行的输出信息都会放到 nohup.out文件中,这个上面已经讲了。然后执行上面命令后,我们每个三十秒在当前目录就会看到多出以test_开头的文件,比如:test_1139901144.txt test_1139901154.txt等等文件,那么就证明我们的程序已经再后台运行了。

那么我们如何终止程序的运行呢?最好办法就是重启操作系统,呵呵,当然,这是不可取的,我们可以使用kill命令来杀掉这个进程,杀进程之前自然后知道进程的PID号,就是Process ID,使用ps命令就能够看到了。

$ ps
PID TT STAT TIME COMMAND
82374 p3 Ss 0:00.14 -bash (bash)
82510 p3 S 0:00.06 /usr/local/php/bin/php /home/heiyeluren/php_daemon1.php
82528 p3 R+ 0:00.00 ps

上面我们已经看到了我们的php的进程id是:82510 ,于是我们再执行kill命令:

$ kill -9 82510
[1]+ Killed nohup /home/heiyeluren/php_daemon1.php

看到这么提示就明白这个进程被杀了,再ps,就会发现没有了:

$ ps
PID TT STAT TIME COMMAND
82374 p3 Ss 0:00.17 -bash (bash)
82535 p3 R+ 0:00.00 ps

如果直接ps命令无法看到进程,那么就使用 ps & apos 两个结合命令来查看,一定能够看到进程。
再上面的基础上进程扩展,能够做成属于自己的cron程序,那就不需要cron啦,当然,这只是一种方式 例子二:服务器端的守护进程

这个例子跟网络有关,大致就是模拟使用php做服务器端,然后一直后台运行,达到服务器端Daemon的效果。

继续在我们的主目录下:/home/heiyeluren,编辑文件php_daemon2.php:

$ vi php_daemon2.php

输入如下代码(代码来自PHP手册,我进行了修改注释):

#! /usr/local/php/bin/php
/* 设置不显示任何错误 */
error_reporting(0);
/* 脚本超时为无限 */
set_time_limit(0);
/* 开始固定清除 */
ob_implicit_flush();
/* 本机的IP和需要开放的端口 */
$address = '192.168.0.1';
$port = 10000;
/* 产生一个Socket */
if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) {
echo "socket_create() failed: reason: " . socket_strerror($sock) . "n";
}
/* 把IP地址端口进行绑定 */
if (($ret = socket_bind($sock, $address, $port)) < 0) {
echo "socket_bind() failed: reason: " . socket_strerror($ret) . "n";
}
/* 监听Socket连接 */
if (($ret = socket_listen($sock, 5)) < 0) {
echo "socket_listen() failed: reason: " . socket_strerror($ret) . "n";
}
/* 永远循环监接受用户连接 */
do {
if (($msgsock = socket_accept($sock)) < 0) {
echo "socket_accept() failed: reason: " . socket_strerror($msgsock) . "n";
break;
}
/* 发送提示信息给连接上来的用户 */
$msg = "==========================================rn" .
" Welcome to the PHP Test Server. rnrn".
" To quit, type 'quit'. rn" .
" To shut down the server type 'shutdown'.rn" .
" To get help message type 'help'.rn" .
"==========================================rn" .
"php> “;
socket_write($msgsock, $msg, strlen($msg));
do {
if (false === ($buf = socket_read($msgsock, 2048, PHP_NORMAL_READ))) {
echo “socket_read() failed: reason: ” . socket_strerror($ret) . “n”;
break 2;
}
if (!$buf = trim($buf)) {
continue;
}
/* 客户端输入quit命令时候关闭客户端连接 */
if ($buf == ‘quit’) {
break;
}
/* 客户端输入shutdown命令时候服务端和客户端都关闭 */
if ($buf == ’shutdown’) {
socket_close($msgsock);
break 2;
}
/* 客户端输入help命令时候输出帮助信息 */
if ($buf == ‘help’) {
$msg = ” PHP Server Help Message rnrn”.
” To quit, type ‘quit’. rn” .
” To shut down the server type ’shutdown’.rn” .
” To get help message type ‘help’.rn” .
“php> “;
socket_write($msgsock, $msg, strlen($msg));
continue;
}
/* 客户端输入命令不存在时提示信息 */
$talkback = “PHP: unknow command ‘$buf’.rnphp> “;
socket_write($msgsock, $talkback, strlen($talkback));
echo “$bufn”;
} while (true);
socket_close($msgsock);
} while (true);
/* 关闭Socket连接 */
socket_close($sock);
?>
保存以上代码退出。

上面的代码大致就是完成一个类似于Telnet服务器端的功能,就是当服务器端运行该程序的时候,客户端能够连接该服务器的10000端口进行通信。

加上文件的可执行权限:

$ chmod +x /home/heiyeluren/php_daemon2.php

在服务器上执行命令:

$ nohup /home/heiyeluren/php_daemon2.php &

就进入了后台运行,我们通过Windows的客户端telnet上去:

C:>telnet 192.168.0.1 10000

如果提示:

正在连接到192.168.0.188…不能打开到主机的连接, 在端口 10000: 连接失败

则说明服务器端没有开启,或者上面的程序没有正确执行,请检查php是否 –enable-sockets 功能。如果提示:

==========================================
Welcome to the PHP Test Server.
To quit, type ‘quit’.
To shut down the server type ’shutdown’.
To get help message type ‘help’.
==========================================
php>
则说明顺利连接上了我们的PHP写的服务器端守护进程,在php>提示符后面能够执行help、quit、shutdown等三个命令,如果命令输入不是这三个,则提示:

php> asdf
PHP: unknow command ‘asdf’.
执行help命令可以获取帮助

php> help
PHP Server Help Message
To quit, type ‘quit’.
To shut down the server type ’shutdown’.
To get help message type ‘help’.
这个服务器端就不介绍了,可以自行扩展。

杀进程跟例子一类似。

[ 总结 ]通过以上学习,我们知道php也可以做守护进程,如果设计的好,功能也会比较强大,不过我们这里只是学习而已,可以自行研究更新。

本文参考了php中文手册,多看手册,对自己非常有好处。

Bookmark and Share

普通人的编辑利器——VIM (for windows)

This item was filled under [ 写程序工具 ]
FROM linxuelin
2005年5月,我开始用VIM。此后渐入佳境,原来因版权自律而放弃盗版UltraEdit的遗憾一扫而空。并且,从VIM我才体会到,什么才是真正的编辑利器。在
善用佳软或其他论坛发文,我都是先在VIM中输入,并方便高效地编辑好格式,再贴到网上。而我的通讯录、记事、读书笔记、工作

记 录也是在VIM中完成的。包括一些文档、数据的处理,让VIM过一下,也会提高不少效率。一句话,自用VIM以来,对它迷恋日深,几乎要超过 Total Commander。但是,正如善用佳软及论坛发文所提,我大力推荐“用IrfanView/XnView代替ACDSee、用7-zip代 替 WinRar/WinZip、用GIMP代替PhotoShop”,但并未推荐VIM代替UltraEdit。这并不意味着VIM不能胜任,恰恰相 反,如果说IrfanView等替代品比原共享软件还有些差距的话,VIM则远胜UltraEdit。不推荐的唯一原因是,VIM对初学者有点难。

但今天仍写了此文推荐给大家。原因有二:其一,编辑大人选定了题目,要向大众宣讲VIM和Emacs,这种勇气鼓舞了我。其二,已发两位高手的文章(

王垠之《Emacs是一种信仰!世界最强编辑器介绍》Dieken之《程序员的编辑器——VIM》

)可能会吓住一些对它们产生了兴趣的人,对此我要做些修正。
因此本文内容有二:一是帮新手体验VIM。这部分有些象实验教程,多用实例,且行文风格尽量傻瓜化,以便于新手(包括以前从未听说过VIM)可以照我的操作,一步步体验VIM。二是介绍我的应用,即VIM如何便利我的日常工作和生活,而非编程。
1 对VIM的基本介绍
一句话介绍就是:VIM是一个超级超级强大的文本编辑器。它和Emacs是一个数量级;而我认为,比UltraEdit、Editpad、 EmEditor要高一个(至少半个数量级)。如果你有兴趣,不妨一读《程序员的编辑器——VIM》,以便于对VIM有更详尽全面的理论认识。
要点1:VIM及前身VI,历史悠久(可能比多数读者的年龄更大),经历了几十年的考验和发展,值得信赖。
要点2:VIM有模式。通俗地做一下对比。notepad无模式(或称为只有一种编辑模式),你按下j,就是在正文中输入j;要保存,就要ctrl+ s;要下移一行,就要↓或鼠标。而在VIM中,打开一个文件后,并不处在编辑模式,而是Normal模式,此时你按j,VIM并不认为你要在正文中输入 j,而是代表光标下移一行。此时按i表示进入insert模式,即编辑模式,即notepad的模式。编辑模式按Esc退回normal模式。 normal模式下按:进入命令行模式,用于输入较复杂的命令。比如:w代表保存文件,:e a.txt代表打开文件a.txt。即VIM可以不用鼠 标、方向键、菜单、Ctrl、alt……发出命令。因此,以下的体验中切记进入正确的模式:Esc 到Normal;Normal下i到编辑; Normal下:到命令行。再说明一点是:文中:打头的是命令行模式,此外多数Normal模式。
要点3:复杂对抗复杂。VIM有的命令行很吓人,长长一串字符恍若天书。这些貌似复杂,实际上无非是一些简单命令的组合而已。借助于此,VIM用户可以实现非常复杂的需求。如果你没有这样的需求,就无须理会它们。
要点4:一能百能。这一点是Unix或命令行风格软件的显著长处,经过实用可以深刻体会。本文尽管有一些例子,但它运用之妙,存乎一心的感觉,仍未能 充分展示。这里先打个比方,如果windows下某软件号称能炒菜,那意味着你点一下菜单,菜就做好了——这就是易用哲学。到底怎么做,你是没有多少发言 权的,而是由软件开发者固化。而如果VIM说能,那它就是有一个“炒菜”命令,你可以把这个命令与原有的“原料”“数量”“火候”“风味”“灶具”命令结 合在一起用,甚至在它前面加上“买菜”“洗菜”,后面加上“装盘”“洗碗”做成一个自动脚本,在合适的情况下自动执行。

要点5:无限灵活,个性由我。你只要有具体需求,VIM几乎都能满足。因此不同人的VIM是不一样的,即,把

下载来的VIM配置成自己的VIM。

就此打住,开始体验之旅吧!

2 下载和安装
VIM是跨平台的。在Windows下,我们用的是gVIM for windows版。最新的是7.0版,下载包约8MB,完全安装后约20MB。
注:体积太大?你如果是高手,完全可以把不用的文件删除(包括帮助文件,它是我见过的软件中最好的帮助),精简后的体积可以不到2MB。或反之,仅下 载一个gVIM.exe(1.5MB)就能运行。但对于这次体验,鉴于第一次使用,建议全部按默认项安装,这样才能达到文中预想的结果。

PCOnline下载官方下载

安装,基本上,一直Agree、Next就行了。我通常是装在d:\program files\VIM下。
可参见







3 体验之旅
3.1 初见界面

安装完成后,按提示打开readme,你将看到

或自行打开桌面的快捷方式,也可直接运行d:\program files\VIM\VIM70\gVIM.exe,你应该看到如此界面:

什么?难看?土?我第一次见到它也是这种感觉,现在却只觉得亲切。

再一点,你有没有奇怪它是中文界面?难道我给你下载的是汉化版?会不会捆绑流氓插件啊?你如果真这样想,我只能叹息无语了。

3.2 试读html
请把此网页保存为htm,比如test.htm,然后用VIM打开它。暂时用菜单吧!结果可能是这样:

平平无奇,是吧?因为它是一个标准的VIM,并且是性能优先,视效忽略的VIM。无妨,请进入命令行模式(就是按一下冒号,注意是英文冒号:),注意到最下面一行的变化了吧。再输入sy on再回车。是不是有颜色了?它应该看起来象这个样子

重要提醒:为简化起见,下文将用
:sy on
表示(先确认在Normal模式,如不确认,请按几次Esc)你先按:进入命令行模式,再输入sy on,再回车。

补充说明:sy表示语法加亮,on当然是打开。:sy clear表示取消加亮。

3.3 改头换面
体验VIM就要按VIM的思路,所以我们要把gVIM改回VIM的本来面目。
对了,如果你认为它的界面很土,请更要多看一眼当前的样子,因为下面的操作后可能会更土!
执行如下命令
:set go=
这时的VIM应该是

不要大惊小怪,不就是菜单和工具栏不见了嘛?VIM中是不应该用到它们的。
补充说明:set表示一般性设置;go是gui option的缩写,就是界面;等于空就是什么都没有
再输入半条命令(先不要回车)
:colo ev
然后,按一下tab键。是不是自动补全为evening了?VIM是非常聪明的(但是不会象MS Word那样自做聪明)。
然后你回车,看到了什么?

天色全黑了?没错,现在是evening嘛。

补充说明:colo就是设置调色方案。VIM自带了近十种调色方案,当然你还可以在网上下载更多,或改编自己的调色方案。你可以直接在:colo (加一个空格)就连续tab,选择不同的配色方案来体验一下。当然,evening是比较经典的一种。我一直就用它。

3.4 准备并打开范例文件
简化起见,请

下载test.txt并保存为d:\test.txt。然后,在VIM中输入半条命令
:tabnew d:\t
输到这里后不要回车,按一下tab,VIM会自动补全为test.txt的。如果不对,再按几次tab,直到正确为止。然后回车。

你会看到VIM打开了test.txt,并且是以多页签(tab page)的方式。你可以点击各页签在打开的文件中间切换(高手有更方便的
键盘命令做法)。在VIM6.3中,还没有此功能。当然了,这并不意味着VIM 的用户没办法享受多页签的便利,下载一个插件后——VIM有上千个插件——就可以了。面对多页签风格的流行(IE6→Maxthon→IE7), VIM7.0也新增了此功能。
我喜欢这种简单的页签。如果你认为此页签太难看,可试一下:set go=e
这时应如下效果

3.5 统一格式,下载vimrc
上面所操作的各种命令,都是对VIM的设置。把它们写到一个_vimrc文件中就成了默认选项。每个VIM用户的_vimrc文件都不一样,因为每个人的需求不同。
为了保证下面的操作得到预期的效果,请下载我的_vimrc。依次执行下述操作:
① 关闭所有的VIM
② 找到你的d:\program files\vim\vim7\_vimrc,复制一份。

右键点击此处,“另存为”覆盖你的d:\program files\vim\vim7\_vimrc。

注:这并不是标准做法,但对windows用户是比较方便的做法。

3.6 打开test.txt
再次就模式进行提醒:Esc到Normal;Normal下i到编辑;Normal下:到命令行。
运行VIM,并在命令行执行
:e d:\test.txt
接下来,我们把此文章排一下版。如果你认为可以手工排版,请把此文件复制到10000行再发表意见。

3.7 分段并保存
原文没有分段,观察一下,发现可以在“以下是……”前面加回车,于是
:%s/以下是/\r&/gc
输入后,界面如下

并提示,请回答y或a。如果回答y,则替换当前一个;到了下一个,VIM还会再问你。所以,你回答几个y后不妨一a了之,全部替换。
补充说明:s表示替换;s/a/b 表示把a换为b;上一命令是把“以下是”换为“\r&”,\r表示回车,&表示被替换的部分,即“以下是”;%则表示全文;/gc表示一直替换(不是仅替换第一个),并且要用户确认。
看一下文件,你或许想,空2行可能更好。很简单,再重复一下刚才的命令就好了。不过,对强大的VIM来说,无须笨笨地重复输入上次的命令。在命令行按下:后,再按一下↑(向上的方向键),看到刚才的命令了吧?直接回车,提问时输入a,任务完成。
既有变化,请及时保存。命令是
:w
当然,你也可以按ctrl+s。但ctrl+s之所以有效,是因为我在_vimrc中做了定义:当按下ctrl+s时,系统执行:w动作。因此,你完全可以定义其他热键,并把它映射到:w。

3.8 继续编辑
首先删除“坚持”两字,很简单,只要按gg2x就行了。为了看效果,你可以分开按:
gg,这时光标移到文章头。
2x,这时删掉了2个字符。
再一次体验VIM的神奇,比如按5x,于是5个字符消失了。当然,这5个字符是要保留的,没关系,你按一次u,就回来了吧?
再按一下Ctrl+r,是不是又没了?再来一次u,是不是又回来了?没错。u和Ctrl+r相当于(是相当于不是等同于)windows的undo和redo。

再试一下dd。是不是整行没有了?没关系,u回来就行了。
再试一下3dd。一下子删除了3行!没关系,u回来。
再来一个dG,哇,全文都没了?!仍然u回来啊。

3.9 更多编辑
任务a:把每一句分为一行,即达到如下效果

以**为荣、
以**为耻,
解决:如果你记得上面的替换命令,就会想到,可以用2次替换(“为荣、”换为“为荣、”加回车,“为耻,”换为“为耻,”加回车)。但这两次替换在VIM中完全可以一次完成,即用正则表达式,在“为”及后面2字符(“荣、”或“耻,”)后加入回车。怎么表示呢?
:%s/为../&\r/gc
看一下高亮,没问题,直接a

哇,是不是很壮观啊?没觉得?如果是一千行一万行呢?

任务b:把行末的标点去掉,即“荣”后的顿号和“耻”后的逗号。
解决:办法太多了,仍可以用替换。但此处还是展示一个新功能:列操作。
安全起见,按两下Esc,再gg$,这时光标应到了文章第一行最后一个字符,即顿号上。
再按ctrl+v,注意一下状态栏是否提示有“可视 块” 字样。(请确认你是采用了xbeta的_vimrc文件,如果没有,请试一下ctrl+q)
再15jx,是否标点全部删除了?因为15j表示向下选中15行,x表示删除。

任务c:错落有致
操作:这次演示一下宏的用法,请严格按本教程操作。
先做一下确认:输入法没有打开,并Esc到normal状态,gg到文首。
按qa(q表示开始录制宏,宏的名字为a)
再shift+>>(表示按住shift,连按两下>,再放开shift。此时第一行应当向后tab了一下)
再j^(此时下移一行,并置光标于行首)
再shift+>>再shift+>>(即第二行向后tab两下)
再j^(下移一行,并将光标置于行首,为后续操作做准备)
再q(表示宏录制结束,VIM会提示记录完成)
这样宏录完了,可以用了。
再@a,看到了效果了吧?宏执行了一次,即3、4行成功了。还剩下6段,但是你不用按6次@a,而是只要按下
6@a就行了!!!

太神奇了!回放一下?先u,再来一次
6@a。既然可以6,当然可以千千万万!

补充说明:高手使用VIM是千变万化的。上面的前2个操作(分行+删标点),完全可以合成一个:%s/\(为.\)./\1\r/gc;或再把第3个操作(错落有致)融合到前一个操作中。

3.10 自由体验
体验光标移动:请随意按几下j和k,看看反应;再多按几下l和h,看看反应;然后,当你的光标在英文时,请按几下w和b。
对了,gVIM的每一种功能,都有无限可能,因此,你也可以在上面几个字母前加上数字,比如 9w 2h,看它的反应。

体验自动补全:i进来吧,到目前为止还没写过字呢!为简单起见,你直接把用鼠标放到中文的下一行,我们把 Eight Do’s and Eight Don’ts 输入一遍。但是,输入一个E,先别动!按ctrl+p是不是自动补全了?

体验大小写(每次操作后,都用u恢复原状),试一下g~~和guu和gUU和g??(g??后可以不按u,再按一次g??也能恢复原状)
神奇吗?这还是VIM功能的单个表演,真正的高手是把它们组合在一起,完成你自己独特的编辑需求。

3.11 体验语法高亮和折叠
此部分讲起来太复杂。如果你有其他编辑器如UltraEdit基础,会有助于你理解。但VIM在此方面的强大灵活,UltraEdit是难忘其项背的。
仍然是我们编辑的原文件,为简化计,请下载
test2.txt;下载tx1.vim并保存在d:\program files\vim\vimfiles\syntax\tx1.vim
用VIM打开(比如要打开d:\test2.txt,请在VIM中:tabnew d:\test2.txt)它。平平无奇是吗?这是因为VIM并不 知道这个文件要加亮。键入一个命令:setf tx1,这就相当于告诉VIM此文件的类型是tx1,所以就按照刚下载的tx1.vim进行高亮和折叠。
此时你会发现test2.txt完全折起来了。如何打开?你可用鼠标点最左边的+,当然,也可以用命令zr或zR打开(zR打开全部;zr打开当前;zM折叠全部;zm折叠当前)。打开后,看到高亮效果了吧。可以对文字设定前景色、背景色、粗、斜、下划线风格。

3.12 加密文件

文本文件打开最快,编辑起来最容易,并且在VIM中查找非常方便。因此,我用它来记日记,并作为通讯录。但是安全问题怎么办呢?很简单,VIM本身即 可加密(录然解密也要用VIM)。在上述打开的文件中键入:X(是大写X),VIM就提示你设定密码,安全起见要确认第2次。然后,保存(键入:w)。把 VIM或此文件关闭,再打开时,就要输入密码了。只有你输入正确的密码,才能得到正确的文件。

4 我的应用
VIM和Total Commander一样,我把它们都设定为开机自动运行,其应用不可胜数。
比如说通讯录管理,我未用任何软件,就用VIM管理一个address.txt。它可以实现:快速启动(我在VIM中定义了书签,键入`A就会打 开),加密(用VIM的:X),超强搜索(无须多说),分组折叠(fold),email和电话号的高亮显示(自定义语法文件)吧。
再比如,笔者会用VIM来辅助word, excel, bbs发文,安全删除文件,制作精简的五笔词库等。具体可参见 《
我常用的VIM功能》,《活学善用gVIM,提高工作效率:实例篇(合集)》,《用gVIM打造个性化记事本》等文章。
如下两图分别是我的个性化txt示例,和用VIM写此篇文章时的情况:

5 后记
这篇文章比最初计划写得长很多,但仍感觉很多非常优秀的功能没有提到。比如,眼下我写这篇文章,当然用VIM。但是因为有插图,所以用了htm格式。 在插入图片时,我只要输入img,VIM会自动换为“&lt;img src=”"&gt;”,并把光标放到两个引号中间,以便于我输入 图片名称。我输入lnk后,VIM会替换为“&lt;a href=”"&gt;&lt;/a&gt;”。当我想看一下 效果时,我只要:! g:\study\it\pconline\vim\xbeta-vim.htm 它就自动在浏览器中打开了。而这一个长长的路径, 因为有了自动补全和命令行历史,也非常容易。而当一些url还未确定,需要标注时,我就用一个`1,VIM就会以醒目的红色块标出来,一目了然。而下次再 打开此文件,它会记得我最后编辑的位置。
在用VIM之前,我曾试过几十种pad和editor,包括长期用Editpad,也曾经比较精通过UltraEdit,也曾经测过 EmEditor, EditPlus等。但用了VIM之后,我不再关心windows世界的成千上万的编辑器。因为使用它们的逻辑是“如果有新需求,只 能等软件升级或换一个软件”,而使用VIM的逻辑则是“如果有新需求,请做个性化配置或下载插件”。
VIM在手,夫复何求!
最后,向VIM所代表的追求卓越、开源共享的精神致敬!并希望有责任感的用户逐渐减少盗版!

————————————————————————————————————————————————————————

P.s:这篇文章的作者是善用佳软(xbeta)                      谢谢,calors的提醒
————————————————————————————————————————————————————————
Bookmark and Share
Tagged with: [ , ]

cscope 常用命令

This item was filled under [ 一步一步学习中 ]

cscope的主要功能是通过同的子命令”find”来实现的
“cscope find”的用法:
cs find c|d|e|f|g|i|s|t name

0 或 s 查找本 C 符号(可以跳过注释)
1 或 g 查找本定义
2 或 d 查找本函数调用的函数
3 或 c 查找调用本函数的函数
4 或 t 查找本字符串
6 或 e 查找本 egrep 模式
7 或 f 查找本文件
8 或 i 查找包含本文件的文件
Bookmark and Share
Tagged with: [ , ]

vim,Tlist使用要点

This item was filled under [ 一步一步学习中 ]

1、在查看源码前,需使用ctags生成函数和变量信息文件tags
#cd test
#ctags -R
#ls tags
tags
#vim test.c
2、在Vim下使用TlistToggle 或者说Tlist命令切换耿函数列表开关,按住ctrl键不放同时再按两下w键(^WW),在编辑区与tags区切换,在tags区使用方向键选择函数,再回车键就会在编辑区找到函数定义。
如果有tags区选择了不是打开程序中函数,可以用ctrl+]查看,按ctrl+O返回到原文件。

Bookmark and Share
Tagged with: [ , , ]

vim端运行python的两种方法

This item was filled under [ 一步一步学习中 ]

运行Python脚本
runscript.vim这个插件还不错,安装后直接按F11便可以运行当前的python文件。(不过,只能适用于windows下)

如果不想用插件,可以用 :pyfile % 这样的命令来运行当前文件(我常用的方法)。当然,命令行上也可以。

Bookmark and Share
Tagged with: [ , ]
Page 4 of 46« First...«23456»102030...Last »