Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2412|回复: 2
打印 上一主题 下一主题

vim在c/c++开发中的使用

[复制链接]

165

主题

269

帖子

957

积分

认证用户组

Rank: 5Rank: 5

积分
957
跳转到指定楼层
楼主
发表于 2017-9-7 14:15:07 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 firemail 于 2017-9-7 15:10 编辑

ctags安装与配置
sudo apt-get install ctags
进入源码目录,如:/home/xxx/arm/linux-2.6.24.7目录下
输入命令ctags -R *,你会发现多了一个tags文件,这个就是索引文件
向vim注册索引文件tags的路径
vi ~/.vimrc
    "--ctags setting--
    " 按下F5重新生成tag文件,并更新taglist
    map <F5> :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR><CR> :TlistUpdate<CR>
    imap <F5> <ESC>:!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR><CR> :TlistUpdate<CR>
    set tags=tags
    set tags+=./tags "add current directory's generated tags file
    set tags+=~/arm/linux-2.6.24.7/tags "add new tags file,(不要将tags移动到别的目录,否则ctrl+]时,会提示找不到源码文件)


标签浏览器Taglist
Taglist用于列出了当前文件中的所有标签(宏, 全局变量, 函数名等)
安装
vim-addons install taglist
配置
vim ~/.vimrc
    "-- Taglist setting --
    let Tlist_Ctags_Cmd='ctags' "因为我们放在环境变量里,所以可以直接执行
    let Tlist_Use_Right_Window=1 "让窗口显示在右边,0的话就是显示在左边
    let Tlist_Show_One_File=0 "让taglist可以同时展示多个文件的函数列表
    let Tlist_File_Fold_Auto_Close=1 "非当前文件,函数列表折叠隐藏
    let Tlist_Exit_OnlyWindow=1 "当taglist是最后一个分割窗口时,自动推出vim
    "是否一直处理tags.1:处理;0:不处理
    let Tlist_Process_File_Always=1 "实时更新tags
    let Tlist_Inc_Winwidth=0

进入vim后用命令":Tlist"打开/关闭taglist窗口

文件浏览器和缓冲区管理器WinManager
安装
vim-addons install winmanager
配置
vi ~/.vimrc
    "-- WinManager setting --
    let g:winManagerWindowLayout='FileExplorer|TagList' " 设置我们要管理的插件
    "let g:persistentBehaviour=0 " 如果所有编辑文件都关闭了,退出vim
    nmap wm :WMToggle<cr>

按wm就可以打开/关闭WinManage
<enter>或双击  如果光标下是目录, 则进入该目录; 如果光标下文件, 则打开该文件
<tab>   如果光标下是目录, 则进入该目录; 如果光标下文件, 则在新窗口打开该文件
<F5> 刷新列表
-  返回上一层目录



quickfix命令集
通过quickfix命令集,你可在 Vim 内编译程序并直接跳转到出错位置进行修正。

vi ~/.vimrc
    "-- QuickFix setting --
    " 按下F6,执行make clean
    map <F6> :make clean<CR><CR><CR>
    " 按下F7,执行make编译程序,并打开quickfix窗口,显示编译信息
    map <F7> :make<CR><CR><CR> :copen<CR><CR>
    " 按下F8,光标移到上一个错误所在的行
    map <F8> :cp<CR>
    " 按下F9,光标移到下一个错误所在的行
    map <F9> :cn<CR>
    " 以上的映射是使上面的快捷键在插入模式下也能用
    imap <F6> <ESC>:make clean<CR><CR><CR>
    imap <F7> <ESC>:make<CR><CR><CR> :copen<CR><CR>
    imap <F8> <ESC>:cp<CR>
    imap <F9> <ESC>:cn<CR>


Cscope
Cscope是一个类似于ctags的工具,不过其功能比ctags强大很多
vi ~/.vimrc
    "-- Cscope setting --
    if has("cscope")
        set csprg=/usr/bin/cscope        " 指定用来执行cscope的命令
        set csto=0                        " 设置cstag命令查找次序:0先找cscope数据库再找标签文件;1先找标签文件再找cscope数据库
        set cst                            " 同时搜索cscope数据库和标签文件
        set cscopequickfix=s-,c-,d-,i-,t-,e-    " 使用QuickFix窗口来显示cscope查找结果
        set nocsverb
        if filereadable("cscope.out")    " 若当前目录下存在cscope数据库,添加该数据库到vim
            cs add cscope.out
        elseif $CSCOPE_DB != ""            " 否则只要环境变量CSCOPE_DB不为空,则添加其指定的数据库到vim
            cs add $CSCOPE_DB
        endif
        set csverb
    endif
    map <F4> :cs add ./cscope.out .<CR><CR><CR> :cs reset<CR>
    imap <F4> <ESC>:cs add ./cscope.out .<CR><CR><CR> :cs reset<CR>
    " 将:cs find c等Cscope查找命令映射为<C-_>c等快捷键(按法是先按Ctrl+Shift+-, 然后很快再按下c)
    nmap <C-_>s :cs find s <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR>
    nmap <C-_>g :cs find g <C-R>=expand("<cword>")<CR><CR>
    nmap <C-_>d :cs find d <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR>
    nmap <C-_>c :cs find c <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR>
    nmap <C-_>t :cs find t <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR>
    nmap <C-_>e :cs find e <C-R>=expand("<cword>")<CR><CR> :copen<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> :copen<CR><CR>

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  查找包含这个文件的文件
用法:
1.为源码建立一个cscope数据库
lingd@ubuntu:~/arm/linux-2.6.28.7$ cscope -Rbq
lingd@ubuntu:~/arm/linux-2.6.28.7$ ls cscope.*
cscope.in.out  cscope.out  cscope.po.out






回复

使用道具 举报

165

主题

269

帖子

957

积分

认证用户组

Rank: 5Rank: 5

积分
957
沙发
 楼主| 发表于 2017-9-7 14:23:57 | 只看该作者
本帖最后由 firemail 于 2017-9-14 10:06 编辑

1.当前文件中查询字符串 “user”

命令模式下,输入/user
查看下一个匹配呢?按下n(小写n)
如何跳转到上一个匹配呢?按下N(大写N)
从文件的结尾往开始处搜索呢?
使用?user
关闭高亮
noh或者set noh


2.查找函数定义-----------ctags--------
ctrl+]
Ctrl+O  返回上一个标签
Ctrl+T  返回上一个标签
----------cscope---------
cs find  g  name[要查询的定义的函数]
cs find  t  name[要查询的字符串]

在纯文本终端下:
(1)选定文本块,使用v进入可视模式;移动光标键选定内容
(2)复制选定块到缓冲区,用y;复制整行,用yy
(3)剪切选定块到缓冲区,用d;剪切整行用dd
(4)粘贴缓冲区中的内容,用p

在同一编辑窗打开第二个文件,用:sp [filename]
在多个编辑文件之间切换,用Ctrl+w

命令前面加数字表示重复次数,加字母表示使用的缓冲区名称。
获取帮助,用:help [内容或命令]


Vim 有12个粘贴板依次编号为:0、1、2、...、9、a、"、+,其中 + 号为系统粘贴板,” 为临时粘贴板。系统剪切板中的内容可在其他程序中使用。上面的复制指令都可以配合剪切板进行操作。
"nyw 复制当前单词到 n 号剪切板(双引号开始)
"np 粘贴 n 号剪切板内容到当前位置后
"+Y 复制当前行到系统剪切板
"+ny 复制当前行加下面 n 行到系统剪切板
"+p 粘贴系统剪切板内容到当前位置后



"+yy  // 复制当前行到剪切板
"+p   // 将剪切板内容粘贴到光标后面
"ayy  // 复制当前行到寄存器 a
"ap   // 将寄存器 a 中的内容粘贴到光标后面


1. `$ vim --version | grep clipboard`查看vim是否支持clipboard功能
2. 如果`+clipboard`则跳过这一步; 如果显示的是`-clipboard`说明不支持, 需要`$ sudo apt install vim-gtk`, 因为默认安装的vim有些功能不支持, 安装`vim-gtk`包可以`get the extra features`
3. 使用`+`寄存器与系统粘贴板互通数据, `"+yy`等操作
参数资料: How to make vim paste from (and copy to) system's clipboard?











回复 支持 反对

使用道具 举报

697

主题

1142

帖子

4086

积分

认证用户组

Rank: 5Rank: 5

积分
4086
板凳
发表于 2017-9-14 11:45:55 | 只看该作者
窗口切换
:ctrl+w+j/k,通过j/k可以上下切换,或者:ctrl+w加上下左右键,还可以通过快速双击ctrl+w依次切换窗口。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|firemail ( 粤ICP备15085507号-1 )

GMT+8, 2024-11-23 04:37 , Processed in 0.063962 second(s), 22 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表