我是一个比较喜欢折腾的人,我很喜欢把一样东西给玩坏了,再自己给它弄好,这样我就了解这个东西的大致组成原理了
公司的开发机由于大家都在用,想要在上边安装软件的话很容易影响到别人,又因为上边的软件都比较老,一些新的功能没有办法支持到,所以我一般在自己用的home目录里自己编译最新版本的软件,安装在home中的local目录下,在PATH环境变量中加上这个local目录,这样运行程序的时候系统会先去找这个local中的文件,如果找不到再去会去找系统的bin目录
先来看一下图
首先我们需要下列软件
vim / cscope/ctags search the fucking google 然后把最新的代码下载下来,上传到开发机上
taglist/ NERDTree 这几个是vim的插件下载下来先扔那,一会儿会用到
- 编译vim
解压后,进到根目录先./configure –h看看有什么配置项可以加上的,比较支持perl或者python等. 关键的配置项是 –prefix=$HOME/local –enable-cscope,让vim安装到home下的local目录里,并且支持cscope ,如果没有报错就可以make –j6 && make install了 ,cscope/ctags安装也同理
安装好之后,修改PATH环境变量,注意把$HOME/local/bin放到PATH的最前面(最左边)
export PATH=$HOME/local/bin:$PATH
保存之后记得source一下
之后vim –version看看当前用的vim是不是刚刚编译上去的版本
- 安装vim插件
NERDTree是一个在vim中显示目录文件的插件
taglist 是一个列出文件中函数名的插件,类似于outline的功能
解压,把其中的.vim文件拷贝到$HOME/.vim/plugin目录下,如果没有.vim目录自己就mkdir一个
- 生成cscope索引
cscope是一个辅助工具,可以根据代码生成一个索引文件,提供给vim进行函数定义跳转,所以前面需要vim支持cscope
为了方便管理,我们新建一个目录存放cscope索引
mkdir $HOME/cscope
接下来需要注意了,由于cscope生成的索引文件是静态的,所以如果代码发生变动或者是需要删除和新增文件需要手动运行cscope再次生成索引,这样灰常麻烦,于是我想了一个方法,
写一个脚本,功能是先找出工程下所有的.c .cpp .h之类的代码文件列表输出到一个文件里,再用cscope对这个文件列表中的文件进行重建索引.之后写一个crontab,5分钟执行一次这个脚本
#!/bin/bash
find -L \
absolute-path0 \
absolute-path1 \
-type f \
-name ‘*.c’ -o \
-name ‘*.cpp’ -o \
-name ‘*.h’ -o \
-name ‘*.hpp’ -o \
-name ‘*.py’ \
> ./src.files && cscope -b -q –i ./src.files
这里需要注意的是,查找的代码目录用的是绝对路径,输出的文件列表中的路径也是绝对路径,用cscope生成索引中记录的自然也是绝对路径了,这样的好处是,当你在任何路径下用vim打开文件然后进行tag跳转时,vim都能准确找到目标文件,而如果生成索引用的是相对路径的话,tag跳转时会以后打开vim时的路径为相对路径的根进行跳转,这样就不一定能准确跳转到目标文件了
之后,crontab加入早上9点到晚上12点,每5分钟执行一次这个脚本
但是这样粗暴的更新办法不是我们想要的,我们就想要的是,当代码工程中只要有一个文件的最后修改时间比生成的索引文件的修改时间大,我们就认为可以进行索引重建,否则什么也不做.最后脚本的版本是这样的
#!/bin/bash
source /home/herohuang/.profilefind_path=” absolute-path0 \
absolute-path1 ”
find_file=” -type f \
\( -name ‘*.c’ -o \
-name ‘*.cpp’ -o \
-name ‘*.h’ -o \
-name ‘*.hpp’ \) ”#重建索引
exec_cs(){
if [[ $1 -gt 0 ]]
then
cmd=”find -L $find_path $find_file > ./src.files”
eval $cmd && cscope -b -q -i ./src.files
fi
}
#索引文件
idx=”./cscope.out”
if [[ -e $idx ]]
then
#查找代码文件是否比索引文件新
cmd=”find -L $find_path -newer $idx $find_file -print -quit ”
ret=$(eval $cmd | wc -l)
echo $cmd
exec_cs $ret
else
exec_cs 1
fi
cscope会生成三个文件,默认情况下索引文件以.out结尾,其中.in.out和.po.out为加速索引生成的中间文件,具体细节可以google一下,只有cscope.out是最终我们需要的索引文件
- 配置vim
打开$HOME/.vimrc文件,如果没有就touch新建一个
这里只列出相关配置
“””””””””””””NERDTree”””””””””””””
“当打开vim且没有文件时自动打开NERDTree
autocmd vimenter * if !argc() | NERDTree | endif
“只剩 NERDTree时自动关闭
autocmd bufenter * if (winnr(“$”) == 1 && exists(“b:NERDTreeType”) && b:NERDTreeType == “primary”) | q | endif
“按下 F3 调出/隐藏 NERDTree
map <F3> :NERDTreeToggle<CR>
” 当打开 NERDTree 窗口时,自动显示 Bookmarks
let NERDTreeShowBookmarks=1
” NERDTree 窗口宽度
let g:NERDTreeWinSize = 40
“”””””””””””taglist”””””””””””””””””””
“只显示当前文件tag,其它文件的tag都被折叠起来
let Tlist_File_Fold_Auto_Close=1
“不同时显示多个文件的tag,只显示当前文件的
let Tlist_Show_One_File=1
“打开taglist窗口时,如果希望输入焦点在taglist窗口中
let Tlist_GainFocus_On_ToggleOpen=1
“如果taglist窗口是最后一个窗口,则退出vim
let Tlist_Exit_OnlyWindow=1
“窗口宽度
let Tlist_WinWidth=40
“使用tl快捷键调出taglist窗口
nmap tl :Tlist<cr>
“”””””””””””””””cscope”””””””””””””
“当tag查找到多个结果时,使用 quickfix 窗口来显示 cscope 结果
set cscopequickfix=s-,c-,d-,i-,t-,e-,g-
“vim启动的时候加上cs索引文件
cs add $HOME/cscope/cscope.out
“用cw快捷键调出快捷窗口
nmap cw :cw<CR>
“”””””以下配置是从cscope官方map文件中拷出””””””
” use both cscope and ctag for ‘ctrl-]’, ‘:ta’, and ‘vim -t’
set cscopetag
” check cscope for definition of a symbol before checking ctags: set to 1
” if you want the reverse search order.
set csto=0
” add any cscope database in current directory
if filereadable(“cscope.out”)
cs add cscope.out
” else add the database pointed to by environment variable
elseif $CSCOPE_DB != “”
cs add $CSCOPE_DB
endif
” show msg when any other cscope db added
set cscopeverbose
退出保存
- vim快捷键
ctrl-w [h,j,k,l] 向左,上,下,右窗口移动光标
ctrl-] tag查找跳转
ctrl-o 回到上一次光标所在的位置
cw 列出多个查找结果
F3 调出/隐藏 NERDTree
tl 调出/隐藏taglist窗口
在NERDTree窗口中
x 收缩当前目录
p 光标移到到父目录
o 打开文件/目录
I 水平分屏打开文件
s 竖直分屏打开文件
q 退出窗口
命令模式下 :cs find c|d|e|f|g|i|s|t name
s 查找本 C 符号(可以跳过注释)
g 查找本定义
d 查找本函数调用的函数
c 查找调用本函数的函数
t 查找本字符串
e 查找本 egrep 模式
f 查找本文件
i 查找包含本文件的文件
(ps:这里可以配置快捷键,详情请看官网cscope_maps.vim,或者直接把这个文件扔到$HOME/.vim/plugin里……)
在taglist窗口中
空格 显示函数定义细节
回车 光标移到函数位置