当前位置: 首页 > 编程日记 > 正文

在CentOS 6.2上搭建vim开发环境

在CentOS 6.2上搭建vim开发环境
最后更新日期:2013-07-05

1.首先使用Ubuntu(所在ip为192.168.16.230)翻墙登陆http://www.vim.org/,下载其上面的vim相关插件到Ubuntu的下载目录下:
cd ~/下载/
http://ctags.sourceforge.net
http://cscope.sourceforge.net/
http://www.vim.org/scripts/script.php?script_id=273
http://www.vim.org/scripts/script.php?script_id=1581
http://www.vim.org/scripts/script.php?script_id=197
http://www.vim.org/scripts/script.php?script_id=95
http://www.vim.org/scripts/script.php?script_id=159
http://www.vim.org/scripts/script.php?script_id=31
http://www.vim.org/scripts/script.php?script_id=2620
http://www.vim.org/scripts/download_script.php?src_id=9679
http://www.vim.org/scripts/script.php?script_id=42
http://www.vim.org/scripts/script.php?script_id=311
使用sftp将这些压缩包上传到目标服务器CentOS 6.2上面
cd /usr/local/src
sftp root@192.168.16.237
ls
put a.vim ***
quit
退出sftp,下面开始安装。

2.在主目录下新建目录,开始安装
mkdir -p .vim/plugin
mkdir -p .vim/doc
mkdir -p .vim/tags
mkdir -p ~/.vim/syntax

将上述文件包转移到~/.vim/下面,逐个安装插件:
2.1 ctags插件(Exuberant Ctags)
生成tag文件的插件,从如下官网
http://ctags.sourceforge.net
下载到如下源码包ctags-5.8.tar.gz,下面使用源码安装方式
tar zxvf ctags-5.8.tar.gz
cd ctags-5.8
./configure
make
make install
cd ../
发现ctags是个可执行文件,被复制到/usr/local/bin下面了。你可以使用
ctags --help
来查看该执行文件的命令选项。

tags文件是由ctags程序产生的一个索引文件, ctags程序其实叫"Exuberant Ctags", 是Unix上面ctags程序的替代品, 并且比它功能强大, 是大多数Linux发行版上默认的ctags程序.


2.2 taglist插件
这个是浏览源代码的插件,直接将压缩包解压即可自动安装
unzip taglist_46.zip
会在plugin和doc中各生成一个文件taglist.vim和taglist.txt
相应地在我的.vimrc中如下配置:
let Tlist_Show_One_File = 1 "不同时显示多个文件的tag,只显示当前文件的
let Tlist_Exit_OnlyWindow = 1 "如果taglist窗口是最后一个窗口,则退出vim
let Tlist_Use_Right_Window = 0 "在右侧窗口中显示taglist窗口 (默认是0)
注意taglist插件需要tags文件,所以它需要ctags或cscope生成的tags文件。也就是说,这几个插件是紧密联系的。

2.3 Lookup插件
利用插入补全方式在项目中快速查找文件,缓存区,目录的插件,我们从
http://www.vim.org/scripts/scipt.php?script_id=1581
下载源码包lookupfile-1.8.zip进行安装
unzip lookupfile-1.8.zip
将在doc,plugin,autoload目录下分别生成lookupfile.txt,lookupfile.vim和lookupfile.vim
注意autoload目录是自动生成的。

Lookupfile插件还需最新的genutils插件支持,否则你打开vim时会有警告:
lookupfile: You need a newer version of genutils.vim plugin
从下面的地址下载
http://www.vim.org/scripts/script.php?script_id=197
得到genutils-2.5.zip,下面直接解压就可自动安装好
unzip genutils-2.5.zip
发现它在autoload和plugin目录中都放入了文件genutils.vim

Lookupfile在查找文件时,需要使用tags文件,它可以使用ctags命令生成的tag文件,不过效率比较低,我们专门给它生成了一个包含项目中所有文件名的tag文件。下面是具体步骤:

我编写了下面的shell脚本make_lookupfile_tag.sh,为trafficserver-3.2.4的源代码,生成一个文件名tag文件。

#!/bin/bash
# generate tag file for lookupfile plugin
echo -e "!_TAG_FILE_SORTED\t2\t/2=foldcase/" > filenametags
find . -not -regex '.*\.\(png\|gif\)' -type f -printf "%f\t%p\t1\n" | \
sort -f >> filenametags
回想一下我们在”使用标签(tag)文件“一文中介绍的tag文件的格式。再对照脚本命令来看:

echo命令用来生成filenametags文件中的”!_TAG_FILE_SORTED”行,表明此tag文件是经过排序的。
find命令用来查找所有类型为普通文件,文件后缀名不是.png和.gif的文件,找到的文件按”文件名\t文件路径\t1″的格式输出出来。
sort命令则把find命令的输出重新排序,然后写入filenametags文件中
在~/program_dev/trafficserver-3.2.4/目录下运行该脚本,
chmod +x make_lookupfile_tag.sh
/bin/bash make_lookupfile_tag.sh
会生成一个名为filenametags的文件,包含了trafficserver-3.2.4目录下的所有文件的名字及其所在目录,你可以打开该文件查看并验证。

现在我们需要让lookupfile插件知道到哪去找文件名tag文件。我们假定vim当前工作目录为~/program_dev/trafficserver-3.2.4/,执行下面的命令:
:let g:LookupFile_TagExpr = '"./filenametags"'
注:如果不设定g:LookupFile_TagExpr的值,那么lookupfile插件会以tags选项定义的文件作为它的tag文件。
当恢复前次会话时,就给lookupfile插件定义了tag文件。

现在我们就可以使用lookupfile来打开文件了,按”<F5>“或输入”:LookupFile“在当前窗口上方打开一个lookupfile小窗口,开始输入文件名(至少4个字符),随着你的输入,符合条件的文件就列在下拉列表中了。文件名可以使用vim的正则表达式,这大大方便了文件的查找。你可以用”CTRL-N“和”CTRL-P“(或者用上、下光标键)来在下拉列表中选择你所需的文件。选中文件后,按回车,就可以在之前的窗口中打开此文件。




2.4 cscope插件
标签跳转插件,从下面的网址下载
http://cscope.sourceforge.net/
得到源码包cscope-15.8a.tar.gz,下面进行源码包安装:
tar zxvf cscope-15.8a.tar.gz
cd cscope-15.8a
ll
./configure
make
make install
cd ../
注意使用下面的命令查看到
which cscope
可执行文件所在路径是/usr/local/bin/cscope
cscope的用法很简单,首先需要在你的工程目录,比如trafficserver-3.2.4下面生成一个cscope数据库,也就是一个索引文件。cscope只在第一次解析时扫描全部文件,以后再调用cscope时,它只扫描那些改动过的文件,这大大提高了cscope生成索引的速度。

2.5 BufExplore插件
缓冲区文件浏览插件,从下面的地址下载
http://vim.sourceforge.net/scripts/script.php?script_id=42
直接解压即可自动安装
unzip bufexplorer-7.3.6.zip
将在doc和plugin目录下分别安装bufexplorer.txt和bufexplorer.vim文件。


2.6 winmager插件
该插件控制各插件在vim窗口中的布局显示,从下面的地址下载
http://vim.sourceforge.net/scripts/script.php?script_id=95
得到winmanager.zip文件。
unzip winmanager.zip
把该文件在~/.vim/目录中解压缩,这会将如下文件解压到~/.vim/plugin和~/.vim/doc目录中:
plugin/winmanager.vim – winmanager插件
plugin/winfileexplorer.vim - 改良的Explorer插件
plugin/wintagexplorer.vim – winmanager提供的tag插件,用处不大
doc/winmanager.txt – 帮助文件

注意:winmanager插件需要与BufExplorer插件一起才能使用

2.7 直接是*.vim的插件
这样的插件目前有
a.vim, //将.h文件与.c文件来回切换
minbufexpl.vim //快速浏览和操作Buffer,自如切换
直接复制到~/.vim/plugin/下面就可以了

2.8 vim自带插件
QuickFix 编译纠错,显示查询结果窗口
new-omni-completion 全能补全

2.9 NeoComplCache插件
自动补全插件,下载地址:
http://www.vim.org/scripts/script.php?script_id=2620
将下载下来的压缩包neocomplcache-8.0.zip使用如下命令解压
unzip neocomplcache-8.0.zip
其解压后文件夹里面的文件,好像是四个,autoload、doc、plugin、vest、README.MD,会自动放到.vim相应的文件夹下面。
在~/.vimrc文件里加入自动启动的命令:
let g:neocomplcache_enable_at_startup = 1。



2.10 查看插件自带的文档
注意到上面各步骤中已经把插件自带的文档放入$HOME/.vim/doc目录下了,现在
进入vim,输入命令:helptags $HOME/.vim/doc,vim就会自动读取$HOME/.vim/doc目录下的文档,
输入:help local-additions即可跳转到$HOME/.vim/doc中的所有文档列表处,用选择要看的文档即可。
我们可以看到,当前我们已经安装的插件有taglist,lookupfile,bufexplorer,winmanager插件等。

2.11 安装vim中文帮助文档
vim中文文档的主页是:
http://vimcdoc.sourceforge.net/
它将vim的help文件翻译成为中文,已经支持目前最新的vim 7.3。
如果想使用vim中文文档(.cnx文件),可以遵循以下步骤:
cd ~/.vim/
$wget http://nchc.dl.sourceforge.net/sourceforge/vimcdoc/vimcdoc-1.8.0.tar.gz(注意这不是真实的地址,仅作示例)
tar zxvf vimcdoc-1.8.0.tar.gz
ll
cd vimcdoc-1.8.0
sudo ./vimcdoc.sh -i
cd ../
将会将这些文档安装在/usr/share/vim/,/usr/share/doc等几个目录下面。
启动vim,输入:help,看看帮助文档是否已经便成中文了?

2.12 grep插件
工程中正则查找插件,从下面的地址下载
http://www.vim.org/scripts/script.php?script_id=311
将得到的grep.vim直接放到~/.vim/plugin/下面就可以了。


一些注意事项:
1)vim中文文档不会覆盖原英文文档,安装后vim默认使用中文文档。若想使用英文文档,可在vim中执行以下命令:
:set helplang=en
同理,使用以下命令可重新使用中文文档:
:set helplang=cn
2)使用以下命令可以卸载vim中文文档:
sudo ./vimcdoc.sh -u
3)帮助文件的文本是utf-8编码的, 如果想用vim直接查看, 需要在~/.vimrc中设置:
:set encoding=utf-8

2.12语法高亮
普通一些的要求是更改色彩方案,设置如下:
首先要在你的 ~/.vimrc 文件中增加下面几句话:
syntax enable
syntax on
选中你喜欢的配色方案,在.vimrc文件中做设置,比如
colorscheme desert

更个性化的需求
让运算符号, 各种括号, 函数名, 自定义类型等也高亮起来
对各种语言的源文件(比如c,c++,php,python等)新建一个语法文件,分别存放到
/usr/share/vim/vim72/syntax/c.vim
下面,以C语言为例,新建一个文件~/.vim/syntax/c.vim
加入以下内容
"========================================================
" Highlight All Function
"========================================================
syn match cFunction "/<[a-zA-Z_][a-zA-Z_0-9]*/>[^()]*)("me=e-2
syn match cFunction "/<[a-zA-Z_][a-zA-Z_0-9]*/>/s*("me=e-1
hi cFunction gui=NONE guifg=#B5A1FF

"========================================================
" Highlight All Math Operator
"========================================================
" C math operators
syn match cMathOperator display "[-+/*/%=]"
" C pointer operators
syn match cPointerOperator display "->/|/."
" C logical operators - boolean results
syn match cLogicalOperator display "[!<>]=/="
syn match cLogicalOperator display "=="
" C bit operators
syn match cBinaryOperator display "/(&/||/|/^/|<</|>>/)=/="
syn match cBinaryOperator display "/~"
syn match cBinaryOperatorError display "/~="
" More C logical operators - highlight in preference to binary
syn match cLogicalOperator display "&&/|||"
syn match cLogicalOperatorError display "/(&&/|||/)="

" Math Operator
hi cMathOperator guifg=#3EFFE2
hi cPointerOperator guifg=#3EFFE2
hi cLogicalOperator guifg=#3EFFE2
hi cBinaryOperator guifg=#3EFFE2
hi cBinaryOperatorError guifg=#3EFFE2
hi cLogicalOperator guifg=#3EFFE2
hi cLogicalOperatorError guifg=#3EFFE2

再打开你的C文件看看, 是不是又明亮了许多. 还有一个压箱底的要告诉你, 如果你自己增加了一个类型或者结构之类的, 怎么让它也象"int", "void"这样高亮起来呢? 再在上面的文件~/.vim/syntax/c.vim中添加下面的东东:
"========================================================
" My Own DataType
"========================================================
syn keyword cType My_Type_1 My_Type_2 My_Type_3
这样你自己的类型My_Type_1, My_Type_2, My_Type_3就也可以向"int"一样高亮起来了, 这样的缺点是每增加一个类型, 就要手动在这里添加一下, 如果有人知道更简单的方法请一定一定要告诉我


3.配置.vimrc文件
当vim在启动时,如果没有找到vimrc或gvimrc,它缺省工作VI兼容的模式。这意味着,你只能使用VI所具备的功能,而vim中的大量扩展功能将无法使用。也许这就是你的vim如此难用的原因。

vim中自带了一个vimrc例子,以我所在的CentOS 6.2上的为例,使用下面的命令找到这个文件
locate vimrc_example.vim
发现它的真实目录在
/usr/share/vim/vim72/vimrc_sample.vim
将其拷贝到我的主目录下面
cp -f /usr/share/vim/vim72/vimrc_sample.vim ~/.vimrc
或者你在vim中执行下面的命令,和上面的shell命令完成相同的功能:
:!cp $VIMRUNTIME/vimrc_example.vim ~/.vimrc
现在,你退出vim后再进入,你的vim和刚才已经不一样了。

你可以先读一下你的vimrc,看看它都设定了什么:
:e ~/.vimrc
这是一个注释良好的文件,不需要多解释。
在今后使用vim的日子里,你会频繁的更改你的vimrc。所以我们需要设置一些快捷方式,使我们能快速的访问vimrc。

把下面这段内容拷贝到你的vimrc中:
1 "Set mapleader
2 let mapleader = ";"
3
4 "Fast reloading of the .vimrc
5 map <silent> <leader>ss :source ~/.vimrc<cr>
6 "Fast editing of .vimrc
7 map <silent> <leader>ee :e ~/.vimrc<cr>
8 "When .vimrc is edited, reload it
9 autocmd! bufwritepost .vimrc source ~/.vimrc

为了方便解释,我给每一行都加了一个行号。
在vimrc中,双引号开头的行,将被当作注释忽略。
第2行,用来设置mapleader变量,当mapleader为未设置或为空时,使用缺省的”\”来作为mapleader。mapleader变量是作用是什么呢?看下面的介绍。
第5行定义了一个映射(map),这个映射把<leader>ss,映射为命令:source ~/.vimrc<cr>。当定义一个映射时,可以使用<leader>前缀。而在映射生效时,vim会把<leader>替换成mapleader变量的值。也就是说,我们这里定义的<leader>ss在使用时就变成了”,ss“,当输入这一快捷方式时,就会source一次~/.vimrc文件(也就是重新执行一遍.vimrc文件)。
第7行,定义了<leader>ee快捷键,当输入,ee时,会打开~/.vimrc进行编辑。
第9行,定义了一个自动命令,每次写入.vimrc后,都会执行这个自动命令,source一次~/.vimrc文件。
有了上面的快捷键,我们就能快速的打开vimrc文件编辑,快速重新source vimrc文件,方便多了。

相关的配置文件参见赵攀提供的.vimrc文件的内容。

注意:最后的源码结构类似如下:
~--|--.vimrc
|--.vim --|-plugin--
|-doc--
|-autoload
|-vest

4.实战体验
4.1下载一个trafficserver的源码,并以此为例来阐释使用vim开发的方法
登陆192.168.16.237上,并在当前主目录上新建一个program_dev目录
ssh root@192.168.16.237
cd ~/
mkdir program_dev
wget http://mirror.esocc.com/apache/trafficserver/trafficserver-3.2.4.tar.bz2
下载完成后,解压缩
tar jxvf trafficserver-3.2.4.tar.bz2
ll

注意:使用首先生成3种类型的标签,分别是ctags,cscope和lookupfile插件需要用到的标签。

4.2生成ctags标签(请参照下一种方法来生成tags并设置)
ctags -R trafficserver-3.2.4
将在trafficserver-3.2.4同级目录生成一个名为tags的文件
现在进入vim环境,输入以下命令
:cd ~/program_dev/trafficserver-3.2.4 "切换到当前源码目录
:set tags=~/program_dev/tags "设置tags选项为当前目录下的tags文件
注意这里设置tags需要明确写出绝对路径,否则将会导致很多函数找不到。tags文件是个纯文本文件,你可以使用vim打开它看一下。

另外,根据.vimrc中的配置,使用下面的快捷键来分别生成tags文件和cscope文件
cd trafficserver-3.2.4
find 'pwd' -name "*.cpp" -o -name "*.cc" -o -name "*.c" -o -name "*.h" > cscope.files
cscope -bqk -i cscope.files
ctags和cscope会自动区分和处理各自的索引。
这里注意使用cscope的方法,cscope在生成索引文件时,只搜索c,lex和yacc的文件(后缀名为.c,.h,.l,.y),要生成c++的文件索引,就得使用上面的方法,先产生一个文件列表cscope.files,然后让cscope为这个列表中的每个文件都生成索引。

将上述内容写成一个脚本make_cscope_ctags_index.sh,其内容如下:
#!/bin/bash

find . -name "*.h" -o -name "*.c" -o -name "*.cc" > cscope.files
cscope -bkq -i cscope.files
ctags -R
保存在~/.vim/中,现在将其复制到trafficserver-3.2.4下面,并运行下面的命令
/bin/bash make_cscope_ctags_index.sh
命令在trafficserver-3.2.4下面生成如下文件
cscope.files
cscope.in.out
cscope.out
cscope.po.out
tags
经过分析cscope.files,我们看到了很多文件。现在更新tags设置项
:set tags=~/program_dev/trafficserver-3.2.4/tags

至此,我们设置好了tags选项,接下来开始使用它:
在当前命令行输入
vim -t main
这个命令将打开定义“main”(变量或函数或其它)的文件,并把光标定位到这一行。
在浏览源码时,当要查询某个函数的定义时,将光标放在该函数上,按<C-]>键,就会跳转到该函数的定义处,按<C-t>键是返回。

注意:运行vim的时候,必须在“tags”文件所在的目录下运行。否则,运行vim的时候还要用“:settags=”命令设定“tags”文件的路径,这样vim才能找到“tags”文件。
在完成编码时,可以手工删掉tags文件(帚把不到,灰尘不会自己跑掉^_^)。

现在打开编号为43的文件中的main函数
按F9打开winmanager,这时按照设置,将会出现3部分窗口布局。如果打开了多个文件(多缓冲区),将在最上角出现第四个窗口,MiniBufExplorer窗口。现在按住Ctrl,再连续按W,将在各个窗口之间按照逆时针顺序来回切换。当然,按照赵攀的文档,使用F2也一样起到该作用。再按一次F9将关闭winmanager窗口布局。

当选中某个窗口时,都可以使用vim通常的移动鼠标的方式来选择不同的标签等,比如gg,G等快捷键。

将光标定位到main函数所在的文件中,将光标定位到某个函数上,按住Ctrl+]键,将会跳转到该函数的定义位置。

4.3快速浏览和操作Buffer
用vim打开多个文件时,vim最上方会出现一个MiniBufExplorer窗口,其中列出了当前所有已经打开的buffer,当你把光标置于这个窗口时(当你处于winmanager窗口布局中时,使用Ctrl+W来轮流切换), 有下面几个快捷键可以用:
<Tab> 向前循环切换到每个buffer名上
<S-Tab> 向后循环切换到每个buffer名上
<Enter> 在打开光标所在的buffer
d 删除光标所在的buffer
当你只编辑一个buffer的时候MiniBufExplorer派不上用场, 当你打开第二个buffer的时候, MiniBufExplorer窗口就自动弹出来了,

4.4bufexplorer插件用法
打开vim,输入\be在当前窗口浏览缓存,\bs水平打开一个窗口浏览缓存,\bv垂直打开一个窗口浏览缓存。

但是在Filelist和taglist的窗口内,你可以移动上下移动光标,使用ghjk这四个键

附注:
:cw change-word 改变到下一个词的尾部,不含词后面的空格

4.5Taglist窗口的快捷键操作
在taglist窗口中,可以使用下面的快捷键:
<CR> 跳到光标下tag所定义的位置,用鼠标双击此tag功能也一样
o 在一个新打开的窗口中显示光标下tag
<Space> 显示光标下tag的原型定义
u 更新taglist窗口中的tag
s 更改排序方式,在按名字排序和按出现顺序排序间切换
x taglist窗口放大和缩小,方便查看较长的tag
+ 打开一个折叠,同zo
- 将tag折叠起来,同zc
* 打开所有的折叠,同zR
= 将所有tag折叠起来,同zM
[[ 跳到前一个文件
]] 跳到后一个文件
q 关闭taglist窗口
<F1> 显示帮助
可以用”:TlistOpen“打开taglist窗口,用”:TlistClose“关闭taglist窗口。或者使用”:TlistToggle“在打开和关闭间切换。在我的vimrc中定义了下面的映射,使用<F9>键就可以打开/关闭taglist窗口:
map <silent> <F8> :TlistToggle<cr>

按照"typedef", "variable", "function"等进行了分类. 将光标移到VimMain上, 如图中左边红色的方框, 按下回车后, 源程序会自动跳转到VimMain的定义处, 如图中右边的红色方框. 这就是TagList最基本也是最常用的操作。在浏览TagList窗口时, 如果还不想让源码跳转, 但是想看看tag在源码中完整的表达, 可以将光标移到你想要看的tag上, 如图中上边黄色的方框, 然后按下空格键, 在下面的命令栏中, 如图下边黄色的方框, 会显示该tag在源码中完整的写法, 而不会跳转到源码处.

4.6cscope插件用法
在vim中使用cscope非常简单,首先调用”cscope add“命令添加一个cscope数据库,然后就可以调用”cscope find“命令进行查找了。vim支持8种cscope的查询功能,如下:

s: 查找C语言符号,即查找函数名、宏、枚举值等出现的地方
g: 查找函数、宏、枚举等定义的位置,类似ctags所提供的功能
d: 查找本函数调用的函数
c: 查找调用本函数的函数
t: 查找指定的字符串
e: 查找egrep模式,相当于egrep功能,但查找速度快多了
f: 查找并打开文件,类似vim的find功能
i: 查找包含本文件的文件
例如,我们想在vim 7.0的源代码中查找调用do_cscope()函数的函数,我们可以输入:”:cs find c do_cscope“,回车后发现没有找到匹配的功能,可能并没有函数调用do_cscope()。我们再输入”:cs find s do_cscope“,查找这个C符号出现的位置,现在vim列出了这个符号出现的所有位置。

我们还可以进行字符串查找,它会双引号或单引号括起来的内容中查找。还可以输入一个正则表达式,这类似于egrep程序的功能,但它是在交叉索引数据库中查找,速度要快得多。

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 查找包含本文件的文件

vim提供了一些选项可以调整它的cscope功能:

cscopecscopeprg选项用于设置cscope程序的位置。
cscopecscopequickfix设定是否使用quickfix窗口来显示cscope的结果,详情请”:help cscopequickfix“;
如果你想vim同时搜索tag文件以及cscope数据库,设置cscopecscopetag选项;
cscopecscopetagorder选项决定是先查找tag文件还是先查找cscope数据库。设置为0则先查找cscope数据库,设置为1先查找tag文件。我通常设置为1,因为在tag文件中查找到的结果,会把最佳匹配列在第一位。
vim的手册中给出了使用cscope的建议方法,使用命令”:help cscope-suggestions“查看。

下面是我的vimrc中关于cscope接口的设置:

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" cscope setting
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
if has("cscope")
set csprg=/usr/bin/cscope
set csto=1
set cst
set nocsverb
" add any database in current directory
if filereadable("cscope.out")
cs add cscope.out
endif
set csverb
endif

nmap <C-@>s :cs find s <C-R>=expand("<cword>")<CR><CR>
nmap <C-@>g :cs find g <C-R>=expand("<cword>")<CR><CR>
nmap <C-@>c :cs find c <C-R>=expand("<cword>")<CR><CR>
nmap <C-@>t :cs find t <C-R>=expand("<cword>")<CR><CR>
nmap <C-@>e :cs find e <C-R>=expand("<cword>")<CR><CR>
nmap <C-@>f :cs find f <C-R>=expand("<cfile>")<CR><CR>
nmap <C-@>i :cs find i ^<C-R>=expand("<cfile>")<CR>$<CR>
nmap <C-@>d :cs find d <C-R>=expand("<cword>")<CR><CR>

先在~/vimrc中增加一句:
:set cscopequickfix=s-,c-,d-,i-,t-,e- 这个是设定是否使用 quickfix 窗口来显示 cscope 结果, 用法在后面会说到。
我想查找vim_strsave()到底在那些地方被调用过了, 用命令:
:cs find c vim_strsave 按下回车后vim会自动跳转到第一个符合要求的地方, 并且在命令栏显示有多少符合要求的结果, 如图:
如果自动跳转的位置你不满意, 想看其他的结果, 可以用下面的命令打开QuickFix窗口:
:cw 如图:

4.7 quickfix窗口
QuickFix窗口的主要作用就是上面看到的那个功能: 输出一些供选择的结果, 可以被很多命令调用, 更详细的介绍和使用方法请用下面的命令打开QuickFix的手册来学习吧:
:help quickfix
可以用下面的命令来跳转:
:cn // 切换到下一个结果
:cp // 切换到上一个结果 如果你经常使用这两个命令, 你还可以给他们设定快捷键, 比如在~/.vimrc中增加:
nmap <F6> :cn<cr>
nmap <F7> :cp<cr>



5.产生的疑问
5.1 cscope和ctags有啥区别?
两者能并存,前者更强大,特别是查找字符串,前者威力更大。ctags是跳转到标签定义的地方,但如果想查找函数在哪里被调用,或者标签在哪些地方出现过,就需要使用更为强大的cscope。

Cscope是一个交互式的屏幕下使用的工具,它被设计用来回答以下的问题:
* 什么地方用到了这个符号?
* 这是在什么地方定义的?
* 这个变量在哪里被赋值?
* 这个全局符号的定义在哪里?
* 这个函数在源文件中的哪个地方?
* 哪些函数调用了这个函数?
* 这个函数调用了哪些函数?
* 信息 "out of space" 从哪来?
* 这个源文件在整个目录结构中处于什么位置?
* 哪些文件包含这个头文件?



相关文章:

python基础(三元运算+深浅拷贝+函数参数)

三元运算 三元运算&#xff0c;又称三目运算&#xff0c;主要作用是减少代码量&#xff0c;是对简单的条件语句的缩写。 1 书写格式&#xff1a; 2 result 值1 if 条件 else 值2 3 即如果条件成立&#xff0c;则将值1赋给result变量&#xff0c;如果不成立&#xff0c;将值2赋…

pythonapi是什么_python接口自动化(一)--什么是接口、接口优势、类型(详解)...

简介经常听别人说接口测试&#xff0c;接口测试自动化&#xff0c;但是你对接口&#xff0c;有多少了解和认识&#xff0c;知道什么是接口吗&#xff1f;它是用来做什么的&#xff0c;测试时候要注意什么&#xff1f;坦白的说&#xff0c;笔者之前也不是很清楚。接下来先看一下…

【阶段小结】协同开发——这学期的Git使用小结

【阶段小结】协同开发——这学期的Git使用小结一、Git简介1. Git简单介绍2. Git工作流程以及各个区域3. Git文件状态变化二、Git安装&Git基本配置三、个人踩坑1. xcode project“抽风式”问题2. 如何拯救git仓库一、Git简介 1. Git简单介绍 Git是一个分布式版本控制软件&…

PHP函数printf()、sprintf()的用法

printf()函数优点在于可以格式化输出 格式: %[padding_character][-][width][.precision]type 所有的转换说明都是以%开始,如果想打印一个%符号,必须用%% &#xff1b; 参数“padding_character”是可选&#xff0c;它将被用来填充变量直至所指定的宽度&#xff0c;该参数的作用…

20150411--Dede二次开发-01

20150411--Dede二次开发-01 目录 一、目前市场流行的电子商城系统 1 二、ecshop的介绍 1 三、安装 2 四、echsop 的目录结构 5 五、分析ecshop里面程序的架构 5 六、小试牛刀把面包屑导航改成两个大于号 6 1、根据php页面找出该页面对应的模板。 6 2、找到category.dwt模板文件…

修改cpu型号重启不变_猫头鹰展示D系列新款140毫米CPU散热器:更大散热片,能压400瓦...

猫头鹰一直以超强的CPU风冷散热器在电脑配件市场闻名遐迩&#xff0c;在台北电脑展期间&#xff0c;除了展出了概念性的无风扇CPU散热器&#xff0c;还宣布了发布D系列新款CPU散热器的计划。新的未命名的散热器相比与目前的NH-D15和NH-D15S型号要多一根热管&#xff0c;性能进一…

管理虚拟机的艺术——有备无患

随心前言&#xff1a;求求你们多多给虚拟机做一下备份~~ 超前预告&#xff1a;下一次分享一下linux/window to go的小玩意&#xff08;把系统安装到U盘&#xff0c;即插即用&#xff09; 接下来的博客尝试一下用随笔的形式&#xff0c;来写写自己感兴趣的一些玩意&#xff0c;比…

coreseek最大检索数只有1000的问题!

在 测试中发现&#xff0c;综艺视频只能看33页&#xff0c;每页10条&#xff0c;始终不得其解。经仔细分析&#xff0c;是csft.conf中的配置&#xff0c;下面修改说明如下&#xff1a;先将csft.conf中的searchd部分&#xff0c;将1000默认值改为10000max_matches 10000然后在调…

iframe怎么用_怎么样减少无效URL的爬行和索引

少年老成的云晨守望同学(题外话&#xff1a;少年老成是好事哈。我20多岁时人家说我像40岁&#xff0c;我40多岁时好多人说我像30多&#xff0c;男人20到50岁可以做到基本一个样子)在网络营销实战密码网站贴了个帖子&#xff1a;《透过京东商城看国内一线B2C网站SEO通病》。建议…

502 Server dropped connection

在本地电脑上开启了&#xff0c;全局VPN代理后&#xff0c;出现 502 报错。 502 Server dropped connection The following error occurred while trying to access http://localhost/invo/:502 Server dropped connection. 出现这种情况的原因是&#xff0c;vpn 链接挂了&…

【OpenCV】在Linux上使用OpenCvSharp

OpenCvSharp是一个OpenCV的 .Net wrapper,应用最新的OpenCV库开发,使用习惯比EmguCV更接近原始的OpenCV,该库采用LGPL发行,对商业应用友好。

DNS轮询解析是什么?

在其最简单的实现中,轮回DNS的工作方式是,不仅用一个潜在的IP地址来响应DNS请求,而且用一个潜在的IP地址列表来响应承载相同服务的几个服务器。传统的负载均衡技术通常需要专门的硬件或软件,但DNS轮询解析是一种负载分配、负载平衡或容错技术,通过管理域名系统(DNS)对来自客户计算机的地址请求的响应,按照适当的统计模型,提供多个冗余的互联网协议服务主机,将流量分散到多个服务器上。因此,虽然轮询DNS是一种简单有效的负载平衡方法,但它也存在一些限制和潜在的问题,需要根据实际情况进行选择和使用。

自建WIN10 FTP无法访问的解决方法

由于博主使用的是校园网&#xff0c;具体NAS方案比较复杂&#xff0c;主体上是用KodCloudWin10自带FTP&#xff0c;最近发现好像自带的FTP搭建不了。 废话不多说&#xff0c;说说解决方案&#xff1a; ①首先看看防火墙设置&#xff0c;用同一局域网下的主机ping一下测试是否能…

weiss数据结构和算法书的使用说明

《数据结构与算法分析 C语言描述》Mark Allen Weiss著&#xff0c;冯舜玺译&#xff0c;机械工业出版社。Weiss教授的经典教材三部曲之一&#xff0c;其中的C语言描述版本&#xff0c;也就是本书&#xff0c;被称为20世纪最重要的30本计算机教材之一。Mark Allen Weiss&#xf…

Bootstrap 栅格系统 理解与总结

Bootstrap 栅格系统 学习总结 Bootstrap框架是如今最流行的前端框架之一&#xff0c;Bootstrap功能强大&#xff0c;简单易学&#xff0c;很符合实际应用场景。 只是Bootstrap的内容较多&#xff0c;新手往往不能很快的熟练运用Bootstrap。 这里&#xff0c;我就对Bootstrap中非…

java抛出自定义异常_10 个深恶痛绝的 Java 异常。。

异常是 Java 程序中经常遇到的问题&#xff0c;我想每一个 Java 程序员都讨厌异常&#xff0c;一 个异常就是一个 BUG&#xff0c;就要花很多时间来定位异常问题。什么是异常及异常的分类请看这篇文章&#xff1a;一张图搞清楚 Java 异常机制。今天&#xff0c;栈长来列一下 Ja…

mac删除键很慢

关闭辅助功能-慢速键 重复延迟、等待调到最低

不相交集类以及应用迷宫生成

简单介绍&#xff1a; 考虑一个迷宫的生成&#xff0c;一个简单算法就是从各处的墙壁开始&#xff08;除入口和出口之外&#xff09;。此时&#xff0c;不断地随机选择一面墙&#xff0c;如果被该墙分割的单元彼此不联通&#xff0c;那么就把这面墙拆掉。重复这个过程直到开始单…

Ajax 完整教程

转载&#xff1a;http://www.cnblogs.com/Garden-blog/archive/2011/03/11/1981778.html Ajax 完整教程第 1 页 Ajax 简介Ajax 由 HTML、JavaScript™ 技术、DHTML 和 DOM 组成&#xff0c;这一杰出的方法可以将笨拙的 Web 界面转化成交互性的 Ajax 应用程序。本文的作者是一位…

python嵩天课后思考题_Python语言程序设计基础(第二版)嵩天等课后习题答案

第一次博文 Time&#xff1a;2018年04月28日 星期六 11:37二次补充 2018年05月02日第一章 程序设计基本方法 P29# 1.1字符串的拼接str1 input("请输入一个人的名字&#xff1a;")str2 input("请输入一个地点&#xff1a;")print("世界这么大&#x…

mac OneNote恢复历史记录

由于mac OneNote是个废物&#xff0c;因此还是得通过网页版OneNote或者win版OneNote来操作 网页端OneNote-对应笔记本页面 然后复制过去就可以恢复了

【C#公共帮助类】10年代码,最全的系统帮助类

这个帮助类主要包含&#xff1a;对象转换处理 、分割字符串、截取字符串、删除最后结尾的一个逗号、 删除最后结尾的指定字符后的字符、 生成指定长度的字符串、 生成日期随机码、 生成随机字母或数、字 截取字符长度、 对象<-->JSON 4.0使用、 对象<-->JSON 2.0使…

三十之惑–面霸的八月(第一部分)

三十之惑 –面霸的八月 题记&#xff1a; 三十几岁了&#xff0c;从sina大学肄业后&#xff0c;在外面漂泊&#xff0c;不好不坏。 从好的角度讲&#xff0c;这几年自己的技术没有减退&#xff0c;偶尔也还能够略有深入&#xff0c;同时能够更多的接触到产品、运营、甚至营销&a…

python小工具封装_python接口自动化(二)——封装需要用到的工具类

封装需要用的工具类&#xff1a;1、封装读取Excel的工具类&#xff0c;这里选用的是pandas&#xff1a;importpandas as pdpath ‘test.xlsx‘sheet_name ‘test_data‘classwith_excel:#构造函数&#xff0c;调用类时就运行def __init__(self, pathNone, sheet_nameNone):if p…

三十之惑–面霸的八月(第二部分)

书接上回&#xff0c;今天叙述小米的面试经历。 这里可能有一些技术理解和技术方案&#xff0c;欢迎讨论。另昨天共计收入7笔共95元&#xff0c;够我喝几杯咖啡了&#xff0c;谢谢所有捐钱的朋友。 如果你心疼我码字辛苦&#xff0c;有钱朋友钱场&#xff0c;没钱的请拉朋友来捧…

Curator Cache

1.Curator Cache 与原生ZooKeeper Wacher区别 原生的ZooKeeper Wacher是一次性的&#xff1a;一个Wacher一旦触发就会被移出&#xff0c;如果你想要反复使用Wacher&#xff0c;就要在Wacher被移除后重新注册&#xff0c;使用起来很麻烦。使用Curator Cache 可以反复使用Wacher了…

程序可以在硬件之间发送吗_你知道硬件、软件工程师之间,还有一个固件工程师吗?...

软件跟硬件之间的界限已经越来越模糊了&#xff0c;那么处于这个灰色地带的&#xff0c;就是固件了。这就分成三类工作者。1、软件工程师一般指做图形界面的程序员&#xff0c;工作内容就是写C、JAVA、Web等。2、硬件工程师当然是指玩电路板的&#xff0c;工作内容就是画原理图…

悲催的跨平台文献管理能力

1.古老的TCP交互 邮箱、FTP、硬盘 2.用现成软件Zotero 免费、跨平台、导入后在Win福昕注释可实时同步mac看看 人生苦短&#xff0c;我用Zotero。。

Mastering Algorithms with C中文版附带源码说明

Mastering Algorithm with C是一本非常经典和独具个性的算法书,主要是从程序员的角度,对算法领域的基本内容,通过C语言进行源码实现,其附带的源码非常详细,对初接触这个领域的程序员很有参考价值.我特地将该书源码的使用方法做了笔记,放在这样,以便日后参考. 下面是该书的封面…

仿qq左滑删除listview_Java基于Swing和Netty仿QQ界面聊天小项目

点击上方 好好学java &#xff0c;选择 星标 公众号重磅资讯、干货&#xff0c;第一时间送达今日推荐&#xff1a;硬刚一周&#xff0c;3W字总结&#xff0c;一年的经验告诉你如何准备校招&#xff01;个人原创100W访问量博客&#xff1a;点击前往&#xff0c;查看更多来源&…