分享一个用于生成tags文件的脚本

在Linux下面只需要用find 命令即可生成一个包含特定后缀文件路径的文件列表文件。相比之下win下的dir命令就功能不怎么样了。
因此此脚本主要用于Win,因为Linux下有更简单的办法。

在_vimrc中添加:

1
2
" TAGS SETTINGS
set tags=./tags,tags,$HOME/tags

这样当在当前目录找不到tags文件时,就会去$HOME目录找。
这也就是我用这个脚本的目的,当做某个项目时,无论你在项目目录下面的哪个文件夹里用vim打开文件,都可以用ctags功能查找函数的定义等。因为上述脚本生成的tags.list文件中的内容都是绝对路径,这样能使ctags生成的tags文件中的路径信息也是绝对路径,在查找标记时便不会发生问题。

再配合以下脚本:
genctags.bat 内容如下( D:\software\util\gen_ctags_flist.php是gen_ctags_flist.php的全路径):

1
2
3
4
5
6
7
8
9
10
@echo off
color 08
php D:\software\util\gen_ctags_flist.php ./
::ctags -R --sort=yes --totals=yes --verbose --tag-relative=no
color 3f

ctags -R --sort=yes --totals=yes --verbose --tag-relative=no -L tags.list

copy /Y tags %UserProfile%\tags
echo .

此脚本需要在当前路径使用,也就是你要生成哪个目录及其子目录下面的文件列表就在哪里执行。

gen_ctags_flist.php内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
<?php
/*=============================================================================
#     FileName: gen_ctags_flist.php
#         Desc:
#       Author: 荒野无灯
#        Email: admin#ihacklog.com
#     HomePage: http://ihacklog.com
#      Version: 0.0.1
#   LastChange: 2011-09-28 04:38:20
#      History:
=============================================================================*/


if($argc <= 1 || !isset($argv[1]))
{
    die("Error: please give me a dir param!\n");
}

// current directory
//echo getcwd() . "\n";
if( '.' == $argv[1] || './' == $argv[1] )
{
    $dir = getcwd();
}
else
{
    $dir = $argv[1];
}

$dir = str_replace("\",'/',$dir);

if(!is_dir($dir) )
{
    die(sprintf("
Error: %s is not a dir!\n", $dir));
}

$tags_list_file = rtrim($dir,'/') . '/tags.list';

$dir = rtrim( $dir , '/') . '/' ;

$dir_iterator = new RecursiveDirectoryIterator($dir);
$iterator = new RecursiveIteratorIterator($dir_iterator, RecursiveIteratorIterator::LEAVES_ONLY);
// could use CHILD_FIRST if you so wish
    /*LEAVES_ONLY will only return leaves and not the containers.
    SELF_FIRST will list the containers first and then each of their proceeding children.
    CHILD_FIRST will reverse the way the current results look. Processing the recursive array from the inside out.*/
if(file_exists( $tags_list_file ) )
{
unlink( $tags_list_file );
echo sprintf("
Notice: file %s exists.Delete it!\n",$tags_list_file);
}
$fp = fopen( $tags_list_file ,'ab');
if(!$fp)
{
    die(sprintf("
Error: can not create file %s!\n", $tags_list_file));
}
$n = 0;
foreach ($iterator as $file) {
    $ext = substr($file,-4);
    if( '.php' == $ext )
    {
    $file = str_replace("
\",'/',$file);
    echo $file, "
\n";
    fwrite($fp,$file. "
\n");
    $n++;
    }
}
fclose($fp);

echo 'Current dir: '. $dir."
\n";
echo sprintf("
OK: write %d files to file %s successfully!\n",$n, $tags_list_file);

ctags-php-win-bat.zip (163.1 KB)


依云说可以装一个find,是的,装find无疑是省事的办法了,我也装了个。
这find是gnuwin32项目中的一个包,可去这里下载:
http://gnuwin32.sourceforge.net/downlinks/findutils.php
完了之后把win到死那个c:\windows\system32\find.exe 给重命名吧。

更多
5 Responses Post a comment
  1. 荒野无灯

    @shamas
    不是,这个是用于生成tags文件的。目前我主要用它给vim生成tags文件。

  2. shamas

    这个也是用到wp上面的吗?

Leave a Reply

Note: You may use basic HTML in your comments. Your email address will not be published.

Subscribe to this comment feed via RSS