脱了裤子放屁代码:

<?php
$time = $_SERVER['REQUEST_TIME'];
echo $time = date('Y-m-d H:i:s',$time);
?>


PHP中函数int time ( void )返回自从 Unix 纪元(格林威治时间 1970 年 1 月 1 日 00:00:00)到当前时间的秒数。自 PHP 5.1 起在 $_SERVER['REQUEST_TIME'] 中保存了发起该请求时刻的时间戳。 计算差之前,需要利用函数mktime把参数转化为整数,函数格式为:int mktime ( [int hour [, int minute [, int second [, int month [, int day [, int year [, int is_dst]]]]]]] ),功能是根据给出的参数返回 Unix 时间戳。时间戳是一个长整数,包含了从 Unix 纪元(January 1 1970 00:00:00 GMT)到给定时间的秒数。参数可以从右向左省略,任何省略的参数会被设置成本地日期和时间的当前值。

如果你的日期是来源于数据库的字段,那么查询语句里面可以直接查询数据库服务器的当前日期,甚至把时间差一起计算出来,PHP无须编写程序,直接象使用普通字段变量一样使用。

【转】提高PHP性能的12条忠告 :
http://mosee.blogbus.com/logs/23319825.html
用js判断客户端的时区,然后写入cookie,然后php里根据cookie的时区来输出对应时间
为什么用js?因为只有js才能获得客户端的时间,主要就是获取时间,然后进行时区判断
var d = new Date();
var tos = 0 - d.getTimezoneOffset() * 60;
和格林威治时间的秒差



可以用JS取得客户端时间.    将JS放在PHP程序里面就可以了. 如下:
<form>  
  <div   ID=serverTime> </div>  
  <div   ID=localTime> </div>  
  </form>  
  <script>  
  var   serverTime   =   '<?php   print   date("Y-m-d   G:i:s");?>';  
  var   d   =   new   Date();  
  var   localTime   =   d.getYear()   +   '-'   +   (d.getMonth()   +   1)   +   '-'   +   d.getDate()   +   '   '   +   d.getHours()   +   ':'   +   d.getMinutes()   +   ':'   +   d.getSeconds();  
  document.all['localTime'].innerText   =   'LOCALTIME:'   +   localTime;  
  document.all['serverTime'].innerText   =   'SERVERTIME:'   +   serverTime;  
  </script>

或者:

  <script>  
  var   now   =   new   Date();  
  alert(now.getYear()+"-"+(now.getMonth+1)+"-"+now.getDate()+"   "+now.getHours()+":"+now.getMinutes()+":"+now.getSeconds());  
  </script>
getenv()用来取得参数name环境变量的内容.参数name为环境变量的名称,如果该变量存在则会返回指向该内容的指针.环境变量的格式为name=value.

$_SERVER 是一个包含诸如头部(headers)、路径(paths)和脚本位置(script locations)的数组

若是IIS,则ISAPI不支持getenv 。getenv("REMOTE_ADDR")得不到用户的IP,返回的是空值
用$_SERVER["REMOTE_ADDR"]却能正常得到。
魔术引用发生作用是在传递$_GET,$_POST,$_COOKIE时
下面是案例
代码:
1.
条件: magic_quotes_gpc=off
写入数据库的字符串未经过任何过滤处理。从数据库读出的字符串也未作任何处理。
数据:  $data="snow''''sun" ; (snow和sun之间是四个连续的单引号).
操作: 将字符串:"snow''''sun" 写入数据库,
结果: 出现sql语句错误,mysql不能顺利完成sql语句,写入数据库失败。
数据库保存格式:无数据。
输出数据格式:无数据。
说明: 对于未经处理的单引号在写入数据库时会使sql语句发生错误。
代码:
2.
条件: magic_quotes_gpc=off
写入数据库的字符串经过函数addslashes()处理。从数据库读出的字符串未作任何处理。
数据:  $data="snow''''sun" ; (snow和sun之间是四个连续的单引号).
操作: 将字符串:"snow''''sun" 写入数据库,
结果: sql语句顺利执行,数据成功写入数据库
数据库保存格式:snow''''sun (和输入一样)
输出数据格式:snow''''sun (和输入一样)
说明: addslashes()函数将单引号转换为\'的转义字符使sql语句成功执行,
但\'并未作为数据存入数据库,数据库保存的是snow''''sun 而并不是我们想象的snow\'\'\'\'sun
代码:
3.
条件: magic_quotes_gpc=on
写入数据库的字符串未经过任何处理。从数据库读出的字符串未作任何处理。
数据:  $data="snow''''sun" ; (snow和sun之间是四个连续的单引号).
操作: 将字符串:"snow''''sun" 写入数据库,
结果: sql语句顺利执行,数据成功写入数据库
数据库保存格式:snow''''sun (和输入一样)
输出数据格式:snow''''sun (和输入一样)
说明: magic_quotes_gpc=on 将单引号转换为\'的转义字符使sql语句成功执行,
但\'并未作为数据入数据库,数据库保存的是snow''''sun而并不是我们想象的snow\'\'\'\'sun。
代码:
4.
条件: magic_quotes_gpc=on
写入数据库的字符串经过函数addlashes()处理。从数据库读出的字符串未作任何处理。
数据:  $data="snow''''sun" ; (snow和sun之间是四个连续的单引号).
操作: 将字符串:"snow''''sun" 写入数据库,
结果: sql语句顺利执行,数据成功写入数据库
数据库保存格式:snow\'\'\'\'sun (添加了转义字符)
输出数据格式:snow\'\'\'\'sun (添加了转义字符)
说明: magic_quotes_gpc=on 将单引号转换为\'的转义字符使sql语句成功执行,
addslashes又将即将写入数据库的单引号转换为\',后者的转换被作为数据写入
数据库,数据库保存的是snow\'\'\'\'sun
总结如下:
1. 对于magic_quotes_gpc=on的情况,
我们可以不对输入和输出数据库的字符串数据作
addslashes()和stripslashes()的操作,数据也会正常显示。
如果此时你对输入的数据作了addslashes()处理,
那么在输出的时候就必须使用stripslashes()去掉多余的反斜杠。
2. 对于magic_quotes_gpc=off 的情况
必须使用addslashes()对输入数据进行处理,但并不需要使用stripslashes()格式化输出
因为addslashes()并未将反斜杠一起写入数据库,只是帮助mysql完成了sql语句的执行。
补充:
magic_quotes_gpc 作用范围是:WEB客户服务端;作用时间:请求开始时,例如当脚本运行时.
magic_quotes_runtime 作用范围:从文件中读取的数据或执行exec()的结果或是从SQL查询中得到的;作用时间:每次当脚本访问运行状态中产生的数据

  public function prepare($fromuid, $touid, $sid, $ctime = "Null")
  {
    /*
        $this->fromuid[] = $fromuid;
        $this->touid[] = $touid;
        $this->sid[] = $sid;
    */
    $arr_row ['fromuid'] = $fromuid;
    $arr_row ['touid'] = $touid;
    $arr_row ['sid'] = $sid;
    $arr_row ['ctime'] = $ctime;
    array_push ( $this->arr_data, $arr_row );
  }



例子 1. array_push() 例子

$stack = array ("orange", "banana");
array_push ($stack, "apple", "raspberry");
print_r($stack);


本例将使 $stack 具有如下单元: Array
(
    [0] => orange
    [1] => banana
    [2] => apple
    [3] => raspberry
)
current['record'][$j]['ctime'] 刚开始的时候等于:2009-02-27 16:40:26,然后通过:str_replace('-',current['record'][$j]['ctime']);变成:20090227 16:40:26,再通过:strtotime(20090227 16:40:26);再加上一个TimeFormatter::timeFormat(1235724026);变为了2009-2-27 16:40  呵呵:

for($j=0; $j<count($current['record']);$j++)
{
       $current['record'][$j]['ctime'] = strtotime(str_replace('-','',$    current['record'][$j]['ctime'])) ;
       $current['record'][$j]['ctime'] = TimeFormatter::timeFormat($current['record'][$j]['ctime']);  
       ...
}



获取当前时间如何判断大小:


$result = abs(strtotime(date("Y-m-d H:i:s")) - strtotime("08-11-2008 19:29:47"))/86400;

if($result>0){
echo "已经过目标时间"; //即今天的日期大
}elseif($result<0){
echo "还未过目标时间"; //即今天的日期小
}else{
echo "今天是目标日期"; //一样大
}
SNS中往往有什么好友呀什么的uid ,但是有些需求就需要通过好友的uid拼写为一个串来做一些特殊的用法,比如构造sql:
select * from userfollow where uid=1548940117 and followuid in (1584778420,1305619077,1305619077,1582003980,1584778420,1052833673,1052833673,1584778420,1584778420,1584778420,1584778420,1584778420,1584778420,1584778420,1584778420,1584778420,1584778420,1584778420,1584778420,1584778420)

开始拼类似in(1,2,3,4,5)里面的串:

for($j=0; $j<count($current['record']);$j++)
{
      $uidstr .=  $current['record'][$j]['uid'] . ',';
}

$uidstr 的结果如下:
1584778420,1305619077,1305619077,1582003980,1584778420,1052833673,1052833673,1584778420,1584778420,1584778420,1584778420,1584778420,1584778420,1584778420,1584778420,1584778420,1584778420,1584778420,1584778420,1584778420,

发现多一个,(逗号)

$uidstr = trim($uidstr , ',') ;

经过trim($uidstr,',');后echo $uidstr;如下:
778420,1584778420,1584778420,1584778420,1584778420,1584778420,1584778420,1584778420,1584778420,1584778420,1584778420,1584778420

放入下面的函数中:
$arr_follow_list = $obj_userfollow->CheckUserFollowInList($uid, $uidstr);

CheckUserFollowInList的原型:
public function CheckUserFollowInList($uid, $followuids) {
        $sql = "select * from {$this->table_name} where uid={$uid} and followuid in ({$followuids})";
        echo $sql;

        $result = $this->objPdo->Select($sql);
        if ($result)
        {
            $rs_array = $this->objPdo->FetchAll();
            return $rs_array;
        } else
        {
            return FALSE;
        }
    }





        public function CheckParam(&$errstr)
        {
                $errstr = '';
                $this->_par ['page'] = isset($_GET ['page']) ? intval ( $_GET ['page'] ) : 1;
                if(!$this->_par ['page']){

                        $this->_par ['page'] = 1;
                }

                $this->_par ['fuid'] = isset($_GET ['fuid'])  ? intval($_GET ['fuid']) : 0;          
                return true;
        }
http://tieba.baidu.com/f?kz=197552621
开始→运行→输入的命令集锦(ctrl+r命令)
开始→运行→输入的命令集锦(补充版)

wmimgmt.msc----打开windows管理体系结构(WMI)

  wupdmgr--------windows更新程序

  wscript--------windows脚本宿主设置

  write----------写字板

  winmsd---------系统信息

  wiaacmgr-------扫描仪和照相机向导

  winchat--------XP自带局域网聊天

  mem.exe--------显示内存使用情况

  Msconfig.exe---系统配置实用程序

  mplayer2-------简易widnows media player

  mspaint--------画图板

  mstsc----------远程桌面连接

  mplayer2-------媒体播放机

  magnify--------放大镜实用程序

  mmc------------打开控制台

  mobsync--------同步命令

  dxdiag---------检查DirectX信息

  drwtsn32------ 系统医生

  devmgmt.msc--- 设备管理器

  dfrg.msc-------磁盘碎片整理程序

  diskmgmt.msc---磁盘管理实用程序

  dcomcnfg-------打开系统组件服务

  ddeshare-------打开DDE共享设置

  dvdplay--------DVD播放器

  net stop messenger-----停止信使服务

  net start messenger----开始信使服务
gpedit.msc-------------------------组策略

sndrec32-------------------------录音机

nslookup-------------------------ip地址侦测器

explorer-------------------------打开资源管理器

logoff--------------------------注销命令

tsshutdn-------------------------60秒倒计时关机命令

lusrmgr.msc-------------------------本机用户和组

services.msc-------------------------本地服务设置

oobe/msoobe /a----------------------检查xp是否激活

notepad--------------------------打开记事本

cleanmgr-------------------------垃圾整理

net start messenger-----------------开始信使服务

compmgmt.msc-------------------------计算机管理

net stop messenger-----------------停止信使服务

conf-------------------------启动

dvdplay-------------------------dvd播放器

charmap-------------------------启动字符映射表

diskmgmt.msc-------------------------磁盘管理实用程序

calc-------------------------启动计算器

dfrg.msc-------------------------磁盘碎片整理程序

chkdsk.exe-------------------------chkdsk磁盘检查

devmgmt.msc--- ----------------------设备管理器

regsvr32 /u *.dll-------------------停止dll文件运行

drwtsn32------ -------------------系统医生

rononce -p ------------------------15秒关机

dxdiag-------------------------检查directx信息

regedt32-------------------------注册表编辑器

msconfig.exe-------------------------系统配置实用程序

rsop.msc-------------------------组策略结果集

mem.exe-------------------------显示内存使用情况

regedit.exe-------------------------注册表

winchat-------------------------xp自带局域网聊天

progman-------------------------程序管理器

winmsd-------------------------系统信息

perfmon.msc-------------------------计算机性能监测程序

winver-------------------------检查windows版本

sfc /scannow-----------------------扫描错误并复原

winver-------------------------检查windows版本

wmimgmt.msc-------------------------打开windows管理体系结构

wupdmgr-------------------------windows更新程序

w脚本---------------------------windows脚本宿主设置

write-------------------------写字板

winmsd-------------------------系统信息

wiaacmgr-------------------------扫描仪和照相机向导

winchat-------------------------xp自带局域网聊天

mem.exe-------------------------显示内存使用情况

msconfig.exe-------------------------系统配置实用程序

mplayer2-------------------------简易

mspaint-------------------------画图板

mstsc-------------------------远程桌面连接

mplayer2-------------------------媒体播放机

magnify-------------------------放大镜实用程序

mmc-------------------------打开控制台

mobsync-------------------------同步命令

dxdiag-------------------------检查directx信息

drwtsn32------------------------- 系统医生

devmgmt.msc--- ----------------------设备管理器

dfrg.msc-------------------------磁盘碎片整理程序

diskmgmt.msc-------------------------磁盘管理实用程序

dcomcnfg-------------------------打开系统组件服务

ddeshare-------------------------打开dde共享设置

dvdplay-------------------------dvd播放器

net stop messenger-----------------停止信使服务

net start messenger-----------------开始信使服务

notepad-------------------------打开记事本

nslookup-------------------------网络管理的工具向导

ntbackup-------------------------系统备份和还原

narrator-------------------------屏幕"讲述人"

ntmsmgr.msc-------------------------移动存储管理器

ntmsoprq.msc-------------------------移动存储管理员操作请求

netstat -an------------------------(tc)命令检查接口

syncapp-------------------------创建一个公文包

sysedit-------------------------系统配置编辑器

sigverif-------------------------文件签名验证程序

sndrec32-------------------------录音机

shrpubw-------------------------创建共享文件夹

secpol.msc-----====================本地安全策略

syskey---------================系统加密,一旦加密就不能解开,保护windows xp系统的双重密码

services.msc---======================本地服务设置

sndvol32-------==================音量控制程序

sfc.exe--------=================系统文件检查器

sfc /scannow---======================windows文件保护

tsshutdn-------==================60秒倒计时关机命令

tourstart------===================xp简介(安装完成后出现的漫游xp程序)

taskmgr--------=================任务管理器

eventvwr-------==================事件查看器

eudcedit-------==================造字程序

explorer-------==================打开资源管理器

packager-------==================对象包装程序

perfmon.msc----=====================计算机性能监测程序

progman--------=================程序管理器

regedit.exe----=====================注册表

rsop.msc-------==================组策略结果集

regedt32-------==================注册表编辑器

rononce -p ----====================15秒关机

regsvr32 /u *.dll----===============停止dll文件运行

regsvr32 /u zipfldr.dll------=====取消zip支持

cmd.exe--------=================cmd命令提示符

chkdsk.exe-----====================chkdsk磁盘检查

certmgr.msc----=====================证书管理实用程序

calc-----------==============启动计算器

charmap--------=================启动字符映射表

cliconfg-------==================sql server 客户端网络实用程序

clipbrd--------=================剪贴板查看器

conf-----------==============启动

compmgmt.msc---======================计算机管理

cleanmgr-------==================垃圾整理

ciadv.msc------===================索引服务程序

osk------------=============打开屏幕键盘

odbcad32-------==================odbc数据源管理器

oobe/msoobe /a----==================检查xp是否激活

lusrmgr.msc----=====================本机用户和组

logoff---------================注销命令

iexpress-------==================木马捆绑工具,系统自带

nslookup-------==================ip地址侦测器

fsmgmt.msc-----====================共享文件夹管理器

utilman--------=================辅助工具管理器
命令行编辑快捷键

  history 显示命令历史列表

  ↑(Ctrl+p) 显示上一条命令

  ↓(Ctrl+n) 显示下一条命令

  !num 执行命令历史列表的第num条命令

  !! 执行上一条命令

  !?string? 执行含有string字符串的最新命令

  Ctrl+r 然后输入若干字符,开始向上搜索包含该字符的命令,继续按Ctrl+r,搜索上一条匹配的命令

  Ctrl+s 与Ctrl+r类似,只是正向检索

  Alt+< 历史列表第一项

  Alt+> 历史列表最后一项

  Ctrl+f 光标向前移动一个字符,相当与->

  Ctrl+b 光标向后移动一个字符,相当与<-

  Alt+f 光标向前移动一个单词

  Alt+b 光标向后移动一个单词

  ls !$ 执行命令ls,并以上一条命令的参数为其参数

  Ctrl+a 移动到当前行的开头

  Ctrl+e 移动到当前行的结尾

  Esc+b 移动到当前单词的开头

  Esc+f 移动到当前单词的结尾

  Ctrl+l 清屏

  Ctrl+u 剪切命令行中光标所在处之前的所有字符(不包括自身)

  Ctrl+k 剪切命令行中光标所在处之后的所有字符(包括自身)

  Ctrl+d 删除光标所在处字符

  Ctrl+h 删除光标所在处前一个字符

  Ctrl+y 粘贴刚才所删除的字符

  Ctrl+w 剪切光标所在处之前的一个词(以空格、标点等为分隔符)

  Alt+d 剪切光标之后的词

  Esc+w 删除光标所在处之前的字符至其单词尾(以空格、标点等为分隔符)

  Ctrl+t 颠倒光标所在处及其之前的字符位置,并将光标移动到下一个字符

  Alt+t 交换当前与以前单词的位置

  Alt+u 把当前词转化为大写

  Alt+l 把当前词转化为小写

  Alt+c 把当前词汇变成首字符大写

  Ctrl+v 插入特殊字符,如Ctrl+v+Tab加入Tab字符键

  Esc+t 颠倒光标所在处及其相邻单词的位置

  Ctrl+c 删除整行

  Ctrl+(x u) 按住Ctrl的同时再先后按x和u,撤销刚才的操作

  Ctrl+s 挂起当前shell

  Ctrl+q 重新启用挂起的shell
linux常用解压,压缩命令总结


.tar
解包: tar xvf FileName.tar
打包:tar cvf FileName.tar DirName
(注:tar是打包,不是压缩!)
---------------------------------------------
.gz
解压1:gunzip FileName.gz
解压2:gzip -d FileName.gz
压缩:gzip FileName
.tar.gz
解压:tar zxvf FileName.tar.gz
压缩:tar zcvf FileName.tar.gz DirName
---------------------------------------------
.bz2
解压1:bzip2 -d FileName.bz2
解压2:bunzip2 FileName.bz2
压缩: bzip2 -z FileName
.tar.bz2
解压:tar jxvf FileName.tar.bz2
压缩:tar jcvf FileName.tar.bz2 DirName
---------------------------------------------
.bz
解压1:bzip2 -d FileName.bz
解压2:bunzip2 FileName.bz
压缩:未知
.tar.bz
解压:tar jxvf FileName.tar.bz
压缩:未知
---------------------------------------------
.Z
解压:uncompress FileName.Z
压缩:compress FileName
.tar.Z
解压:tar Zxvf FileName.tar.Z
压缩:tar Zcvf FileName.tar.Z DirName
---------------------------------------------
.tgz
解压:tar zxvf FileName.tgz
压缩:未知
.tar.tgz
解压:tar zxvf FileName.tar.tgz
压缩:tar zcvf FileName.tar.tgz FileName
---------------------------------------------
.zip
解压:unzip FileName.zip
压缩:zip FileName.zip DirName
---------------------------------------------
.rar
解压:rar a FileName.rar
压缩:r ar e FileName.rar


rar请到:http://www.rarsoft.com/download.htm 下载!
解压后请将rar_static拷贝到/usr/bin目录(其他由$PATH环境变量指定的目录也可以):
[root@www2 tmp]# cp rar_static /usr/bin/rar
---------------------------------------------
.lha
解压:lha -e FileName.lha
压缩:lha -a FileName.lha FileName

lha请到:http://www.infor.kanazawa-it.ac.jp/.../lhaunix/下载!
>解压后请将lha拷贝到/usr/bin目录(其他由$PATH环境变量指定的目录也可以):
[root@www2 tmp]# cp lha /usr/bin/
---------------------------------------------
.rpm
解包:rpm2cpio FileName.rpm | cpio -div
---------------------------------------------
.tar .tgz .tar.gz .tar.Z .tar.bz .tar.bz2 .zip .cpio .rpm .deb .slp .arj .rar .ace .lha .lzh
.lzx .lzs .arc .sda .sfx .lnx .zoo .cab .kar .cpt .pit .sit .sea
解压:sEx x FileName.*
压缩:sEx a FileName.* FileName

sEx只是调用相关程序,本身并无压缩、解压功能,请注意!
sEx请到: http://sourceforge.net/projects/sex下载!
解压后请将sEx拷贝到/usr/bin目录(其他由$PATH环境变量指定的目录也可以):
[root@www2 tmp]# cp sEx /usr/bin/


参考文献:Linux 文件压缩工具指南
(其实看帮助是最好的方法,一般各个命令都可以用“--help”参数得到常用使用方法!)
发布人:会游泳的鱼 来自:LinuxByte

http://hi.baidu.com/netcoffeehuang/blog/item/97f570193d539a7ddab4bd9c.html
http://www.ibm.com/developerworks/cn/opensource/os-php-xdebug/
一:CTags PHP5 函数查找及一些快捷键介绍
ctags 常用快捷键 :

{ 转到上一个空行
} 转到下一个空行
gd 转到当前光标所指的局部变量的定义
* 转到当前光标所指的单词下一次出现的地方
# 转到当前光标所指的单词上一次出现的地方


tags内不包含调用点,只包含函数定义的位置信息,所以不能查找所有调用。


二:Grep用-P参数的Perl正则查找函数原型的使用示例:

这个在linux下使用shell命令:大写P是正则的意思,否则匹配会有问题,n是行号。
find . -name "*.php"|xargs grep -Pn 'setPlayCache\s*\('
实践查找smodifyData函数原型:

进一步过滤去掉jack备份目录,并只在models下找(因为有可能其它目录也有相同函数):

显示行数-i:
find . -name "*.php"|xargs grep -Pin "function\smodifyData\s\("|grep models|grep -v jack
./application/models/play.php:70:    public function setPlayCache($cacheKey, $data = array())


实践如下:

例外情况,有时不是\s能查到的,是任何字符才能查,如下:
find . -name "*.php"|xargs grep  -Pir ".*Token.*"

$app = new Token('user_token_'.$this->user_id);
$app = new Token('hostw');
——————————————————————————————————————————————
vim里查找函数原型,和平时查找一样的,只是多了个\s,(也不用像grep那样转意:
vi index.php 输入左斜杠开始查找:

查找某个文件里的函数原型:
cat session.php |grep -P function

查看被调用的位置,就需要使用cscope了




如果grep时出现下面问题,解决方法如下:
[root@iZ25dcp92ckZ]# grep -rinP  "checkPass" ./
grep: this version of PCRE is compiled without UTF support
Linux 查看内存的插槽数,已经使用多少插槽。每条内存多大,已使用内存多大
# dmidecode|grep -P -A5 "Memory\s+Device"|grep Size|grep -v Range
查看内存支持的最大内存容量
# dmidecode|grep -P 'Maximum\s+Capacity'
查看内存的频率
dmidecode|grep -A16 "Memory Device"|grep 'Speed'
开始查询遇到这个错误:
grep: this version of PCRE is not compiled with PCRE_UTF8 support
看来是PCRE扩展没有开启支持UFT8格式,重新下载个新版http://iweb.dl.sourceforge.net/project/pcre/pcre/8.36/pcre-8.36.tar.gz 编译,参数./configure --enable-utf8。
装完后还是不行,因为grep也要重新编译。。。
好吧继续下grep:
http://ftp.gnu.org/gnu/grep/grep-2.21.tar.xz
来自:http://www.shentou.org/hacker/166.html


附录:
其实最简单的就是:把光标移动到某个元素上,CTRL+],就会跳转到对应的定义啦。CTRL+o可以回退到原来的地方。
Howto patch ctags 5.6 to work with php5 class member variable features (private, public, protected). ??
早些时候下载了 GVIM Taglist 插件,用来显示 PHP 文件的结构,Taglist 需要 Ctags 的支持,但是 Ctags 目前尚不支持 PHP5 的类限制符(Public/Protected/Private),所以无法识别类中的方法。问题暴露出来了,总会有人去摆平它的,经过一番搜索,找到了一个老外放出的支持 PHP5 的 Ctags Patch,但只能在 Linux 下面使用,Windows 的用户需要自己下载源码重新编译 ctags.exe 文件,所幸的是这个东东也有人编译好了,还是最新的 Ctags 5.6 版本。所以善用搜索,几乎没有解决不了的问题哈,呵呵 :)
Ctrl+]的返回应该是Ctrl+t
Ctrl-O是返回前一个打开的文件,所以看起来结果相同。

下载地址:windows版本的
http://untidy.net/blog/2006/10/04/ctags-php-5-support/
http://blog.chrisramsay.co.uk/2006/10/24/ctags-with-vim-for-php5/

安装位置如下:
cp ctags /usr/local/bin/ctags  &&  chmod 755 /usr/local/bin/ctags
cp ./ctags.1 /usr/local/share/man/man1/ctags.1  &&  chmod 644 /usr/local/share/man/man1/ctags.1
[root@localhost ctags-5.8]# whereis ctags
ctags: /usr/bin/ctags /usr/local/bin/ctags


Linux 用如下方法:

One of the features I have missed since starting using Vim as my main source code editor is the ability to navigate a source file by its classes, properties and methods. I am aware of the existence of Ctags as a program for mapping source files and creating indexes accessible for use by text editors, but my experience has been up until recently that Ctags cannot correctly index PHP5 files - Ctags does not seem to understand the Private, Protected and Public precursors to the function arguments. However I have come across a patch -  provided by Christian Stocker at bITFLUX that fixes this problem.

Patching and Installing Ctags

Christian says on his site that his patch works for Ctags 5.5.4 - I have tried it against version 5.6 and found no problems. Below is a brief run through of installing and patching Ctags on an Linux or Cygwin machine.

Firstly download and untar Ctags and Christian Stocker’s patch

# wget http://kent.dl.sourceforge.net/sourceforge/ctags/ctags-5.6.tar.gz
# tar -xvf ctags-5.6.tar.gz
# wget http://svn.bitflux.ch/repos/public/misc/ctags-php5.patch
# mv ctags-php5.patch ctags-5.6

Next, it’s time to apply the patch to the Ctags php.c file.

# cd ctags-5.6
# patch php.c ctags-php5.patch

Next, configure the build and make install. Note the optional --prefix="/" - this is because I ran this particular example in Cygwin.

# ./configure --prefix="/usr/local/ctags"
# make
# make install
# make clean
删除掉原来的不支持PHP的ctags,然后再做软链接到现在支持PHP的ctags:
rpm -ql ctags
/usr/bin/ctags
/usr/share/doc/ctags-5.8
/usr/share/doc/ctags-5.8/COPYING
/usr/share/doc/ctags-5.8/EXTENDING.html
/usr/share/doc/ctags-5.8/FAQ
/usr/share/doc/ctags-5.8/NEWS
/usr/share/doc/ctags-5.8/README
/usr/share/man/man1/ctags.1.gz

/usr/bin/ctags
If everything made ok, try running the following:

rpm -e ctags

替换原来的ctags。
cp /usr/local/bin/ctags /usr/bin

不用作软连接的办法:
vi /etc/profile 加上:
export PATH=/usr/local/ctags/bin/ctags:$PATH :
单独文件放profile.d文件夹里新建一文件,和上面一样的道理,在登录时会去刷这个文件夹:
cat /etc/profile.d/ctags.sh
export PATH=/usr/local/ctags/bin/ctags:$PATH
在vim里加载ctags:
ctags -R

在用-R直接生成的tags的时候,如果无关的文件太多,tags生成的会非常而且慢,比如cocos2d-x的项目。
解决的方法比较简单,参考了cscope生成 cscope.files的思路:

find . -name "*.h" -o -name "*.c" -o -name "*.cpp" -o -name "*.m" -o -name "*.mm" -o -name "*.java" -o -name "*.py" > src.files
ctags -R --c++-kinds=+px --fields=+iaS --extra=+q -L src.files

find . -name "*.h" -o -name "*.c" -o -name "*.cpp" -o -name "*.m" -o -name "*.mm" -o -name "*.java" -o -name "*.py" > src.files
ctags -R --c++-kinds=+px --fields=+iaS --extra=+q -L src.files
这样生成的速度就会快很多啦

自动加载ctags配置,vim 打开PHP文件后自动加载ctags,使用如下命令:
Set tags=tags的文件路径
Set tags=/data/htdocs/XXX.com/tags

vi ~/.vimrc    //vim打开就加载tags。
set tags=/data/htdocs/XXX.com/tags;
https://jackxiang.com/post/1635/


之后,才是使用前面的快捷键。



方案2 (这个是对这个ctags作脚本替换,并没有直接像方案1这样编译进去,所以,这个方法不是太好,我没有试,再就是这个.ctags能不能自动运行都是个问题。)
1. $ vim ~/.ctags
增加
alias phptags='/usr/local/ctags/ctags --langmap=php:.engine.inc.module.theme.php  --php-kinds=cdf  --languages=php'

2. $ vim ~/.ctags
写入
--regex-php=/^[ \t]*[(private|public|static)( \t)]*function[ \t]+([A-Za-z0-9_]+)[ \t]*\(/\1/f, function, functions/
--regex-php=/^[ \t]*[(private|public|static)]+[ \t]+\$([A-Za-z0-9_]+)[ \t]*/\1/p, property, properties/
--regex-php=/^[ \t]*(const)[ \t]+([A-Za-z0-9_]+)[ \t]*/\2/d, const, constants/

3. $ phptags -R

方案二来自:http://web.hanzheng.info/lamp/tool-lamp/vim/vim-%E8%A7%A3%E5%86%B3ctags%E5%AF%B9php%E7%9A%84%E6%94%AF%E6%8C%81



# ctags --help

You’ll soon see that Ctags is a very powerful tool - there are many available arguments, though I’ll just use one of the two most commonly used commands here - the (-R) recursive command. There are several strategies for generating and using Ctags in projects, particularly when it comes to multi level directory hierarchies. You’ll find some help here on the Ctags Sourceforge FAQ here. I am using the ‘local tag file in each directory only for the source files in that directory’ method.

# cd /myprojects/project_a
# ctags -R

Once Ctags has finished generating the tags file, you are in business and ready to start editing in Vim. So fire up Vim and open a PHP file. To see what Ctags has generated for the file, type TlistToggle in command mode and hit CTRL + w twice to change focus to the Ctags window. You can then navigate up and down the tree and hit enter to go straight to that point in the source file.
说一下如何使用 Tab 键自动完成,按照习惯,Tab 键通常是用来缩进行的,如输入 4 个空格 如果要把 Tab 映射为自动完成,可能使用上稍微有点麻烦,下面会讲如何解决这个问题。

首先需要为 Vim 提供一个 PHP 的函数列表文件,这样 Vim 才能知道如何自动完成一个 PHP 函数。 函数列表不需要自己做,PHP 网站上有现成的,拿来用就可以了:

http://cvs.php.net/viewvc.cgi/phpdoc/funclist.txt

得到这个文件,直接拷贝到 Vim 目录中,比如根目录下面,然后在 vimrc 中加入如下代码, 告知 vim 在自动完成时,需要扫描这个文件来分析关键字。


"You can obtain the completion dictionary file from:
"  http://cvs.php.net/viewvc.cgi/phpdoc/funclist.txt
set dictionary-=/etc/vim/funclist.txt dictionary+=/etc/vim/funclist.txt

"Use the dictionary completion
set complete-=k complete+=k

那么如何解决缩进的问题呢?我们肯定不愿意在映射另外一个键来做缩进用,感觉会很别扭。 下面的函数会解决这个问题。


"Auto completion using the TAB key
"This function determines, wether we are on
"the start of the line text(then tab indents)
"or if we want to try auto completion
function! InsertTabWrapper()
    let col=col('.')-1
    if !col || getline('.')[col-1] !~ '\k'
        return "\"
    else
        return "\"
    endif
endfunction

"Remap the tab key to select action with InsertTabWrapper
inoremap =InsertTabWrapper()

这个函数的作用是判断当前光标前的一个字符是否为一个 Keyword 字符(:help iskeyword),vim 中用 \k 表示, 这个字符的范围大约是所有非空白的可打印的字符,但除开某些特殊字符,比如 @ * " 等等。

于是效果就出来了,当前导字符为空白或者 @ * 等字符时,Tab 就映射为 成为缩进键。 否则就映射为 ,也就是 CTRL+N 调用自动完成功能。

大约就是这样...

好像很多编辑器里都有括号自动完成这样的功能,比如,输入左边括号"("后自动完成")",并把光标定位到两个括号中间,vim通过简单的键映射也可以做到.
以下是我在 O'Reilly Network 看到的一篇文章里学到的,把以下代码拷贝到.vimrc文件里


:inoremap ( ()i
:inoremap ) =ClosePair(')')
:inoremap { {}i
:inoremap } =ClosePair('}')
:inoremap [ []i
:inoremap ] =ClosePair(']')

function ClosePair(char)
if getline('.')[col('.') - 1] == a:char
return "\"
else
return a:char
endif
endf
分页: 241/327 第一页 上页 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 下页 最后页 [ 显示模式: 摘要 | 列表 ]