做人呢,最紧要就系开心啦

ubuntu20.04 用vim+ctags+cscope搭建符合sourceinsight习惯的IDE

1,702次阅读
没有评论

1. 安装 vim

sudo apt install vim

按自己习惯配置

vim ~/.vimrc
set nocompatible
set nu
filetype on
set history=1000
set background=dark
syntax on
set autoindent
set smartindent
set tabstop=4
set shiftwidth=4
set showmatch
set guioptions-=T
set ruler
set hls
set incsearch
set cursorline
set fencs=utf-8,ucs-bom,euc-jp,gb18030,gbk,gb2312,cp936

vim 一些快捷方法

[I 查找全局标识符定义。这个命令不依赖 ctags,而是在当前文件和 include 的文件中搜索。[<Tab> 查找全局标识符定义并直接跳转到第一个匹配的。3[<Tab> 跳转到第 3 个匹配的。[i 只列出第一个匹配的。]I 只列出当前光标之后的匹配项。]i 只列出当前光标之后的第一个匹配项。[D 只查找以 "#define" 定义的宏。[d 只列出第一个匹配。]D 只列出当前光标之后的匹配。]d 只列出当前光标之后的第一个匹配。gD 与 [I 类似,但只搜索当前文件,不搜索 include 的文件。gd 只在当前函数中查找。[# 跳转到 #if 或#ifdef。]# 跳转到 #else 或#endif。

vim 的折叠

 可在 Vim 配置文件中设置 set fdm=XXX
可直接在文件中使用注释调用 vim 命令 /* vim: set fdm=XXX: */

有 6 种方法来选定折叠:1    manual          手工定义折叠         
2    indent           更多的缩进表示更高级别的折叠         
3    expr              用表达式来定义折叠         
4    syntax           用语法高亮来定义折叠         
5    diff                对没有更改的文本进行折叠         
6    marker           对文中的标志折叠

我习惯用 indent
在可折叠处(大括号中间):zr    打开所有折叠
zR    打开所有折叠, 包含嵌套
zc      折叠
zC     对所在范围内所有嵌套的折叠点进行折叠
zo      展开折叠
zO     对所在范围内所有嵌套的折叠点展开
[z       到当前打开的折叠的开始处。]z       到当前打开的折叠的末尾处。zj       向下移动。到达下一个折叠的开始处。关闭的折叠也被计入。zk      向上移动到前一折叠的结束处。关闭的折叠也被计入。

2.ctags

建立文件索引,实现函数或变量的跳转功能;
缺点:只能跳转到函数定义,不能查找那些地方调用了该函数;

(1) 安装

sudo apt-get install ctags
or
sudo apt-get install exuberant-ctags

(2) 生成 tags 文件

ctags -R

查看 linux 内核代码的话,可以直接

make tags ARCH=arm64

在当前目录生产索引文件

(3) 指定 tags 文件目录

vim ~/.vimrc
set tags=./tags,./TAGS,tags;~,TAGS;~

“./tags”:当前目录查找 tags 文件
如果要运用多个不同目录,可以用 "," 隔开,或则

set tags+=path1
set tags+=path2

如果需要在不同工程查阅代码,可以添加

set tags+=path1;
set autochdir

注:第一个分号不能少,如果当前目录没找到,就到父目录查找,一直递归;

(4) 跳转到指定函数或变量

tag func_name   #可以 tab 键补全
tag /xxx              #不完全匹配搜索 xxx

CTRL+] : 跳转一次
CTRO+o:返回一次跳转
CTRL+T:返回到最初跳转

]]: 向后跳到下一个函数头
[[:上一个函数头 

ctags 不会生产局部变脸的索引
:tags 可以列出查找 / 跳转过程

3.cscope

可以查找函数的定义,调用栈等;

(1) 安装

sudo apt-get install cscope

(2) 使用

cscope -Rbqk

参数说明:

R : 递归所有子目录,建立索引;
b : 建立关联数据库,不导入使用者界面;
q : 建立 cscope.in.out 和 cscope.po.out,加快搜索速度
k : 不搜索预设的 include 目录不搜尋 (/usr/include)

内核代码可以用

make cscope ARCH=arm64

手动加载 cscope.out 文件

:cs add cscope.out

设置自动加入

注意:使用相对路径生产 cscope.out,可能出现查找结果无法跳转问题;
用 "cs add $PWD/cscope.out“指定绝对路径;

vim ~/.vimrc

if has("cscope")
set csprg=/usr/bin/cscope
    " 指定:cstag 的搜索顺序。0 表示先搜索 cscope 数据库,若不匹配,再搜索 tag 文件,1
    " 则相反
    set csto=0
    ":tag/Ctrl-]/vim - t 将使用:cstag,而不是默认的:tag
    set cst
    "+(将结果追加到 quickfix 窗口)、-(清空上一次的结果)、0(不使用 quickfix。没有指定也相当于标志为 0)))
    "set cscopequickfix=s-,c-,d-,i-,t-,e- " 使用 QuickFix 窗口来显示 cscope 查找结果
    set nocsverb        " 增加 cscope 数据库时,将不会打印成功或失败信息
    set cspc=3          " 指定在查找结果中显示多少级文件路径, 默认值 0 表示显示全路径,1 表示只显示文件名 "
    if filereadable("cscope.out")
        cs add $PWD/cscope.out $PWD
        "cs add cscope.out
    else" 子目录打开,向上查找
        let cscope_file=findfile("cscope.out", ".;")
        let cscope_pre=matchstr(cscope_file, ".*/")
        if !empty(cscope_file) && filereadable(cscope_file)
            exe "cs add" cscope_file cscope_pre
        endif
    endif
    set nocsverb
endif

补充一点,vim 可能走系统默认的 /etc/vimrc 配置,如果有权限可以直接注掉,如果没有(公用服务器),将

alias vim="vim -u ~/.vimrc" 

写入.bashrc , 引用自己定义的配置

添加 cscope 符号索引数据库后,可以调用 "cscope find" 命令进行查找,vim 支持 8 种 cscope 的查询功能

:cs find x {name} 

s: 查找 C 语言符号,即查找函数名、宏、枚举值等出现的地方
g: 查找函数、宏、枚举等定义的位置,类似 ctags 所提供的功能
d: 查找本函数调用的函数
c: 查找调用本函数的函数
t: 查找指定的字符串
e: 查找 egrep 模式,相当于 egrep 功能,但查找速度快多了
f: 查找并打开文件,类似 vim 的 find 功能
i: 查找包含本文件的文件 

快捷搜索方法:

ctrl-\ c:查找调用本函数的函数
ctrl-\ d:查找本函数调用的函数
.ctrl-\ s:查找 C 语言符号出现的地方。ctrl-\ g:查找 C 语言符号定义的地方。ctrl-\ t:查找指定的字符串。ctrl-\ e:egrep 模式,相当于 egrep 功能,但比 egrep 快多了。ctrl-\ f:查找并打开文件,类似于 vim 的 find 功能。ctrl-\ i:查找包含本文件的文件。

定义快捷键

vim .vimrc

nmap zs :cs find s <C-R>=expand("<cword>")<CR><CR>
nmap zg :cs find g <C-R>=expand("<cword>")<CR><CR>
nmap zc :cs find c <C-R>=expand("<cword>")<CR><CR>
nmap zt :cs find t <C-R>=expand("<cword>")<CR><CR>
nmap ze :cs find e <C-R>=expand("<cword>")<CR><CR>
nmap zf :cs find f <C-R>=expand("<cfile>")<CR><CR>
nmap zi :cs find i ^<C-R>=expand("<cfile>")<CR>$<CR>
nmap zd :cs find d <C-R>=expand("<cword>")<CR><CR>

其他插件

vim 支持很多插件,为方便管理,这里先安装插件管家,通过这个插件管家自动安装、卸载、更新其他插件;
vim 常用的管家有 vundle 和 vim-plug,这里用 vundle

1. 安装 vundle 插件管家

git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim

在.vimrc 开启 vundle


vim ~/.vimrc

set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()

    Plugin 'VundleVim/Vundle.vim'

call vundle#end()

Vundle 支持的命令(vim 命令行模式下)

PluginList: 列出安装的插件
PluginInstall: 根据配置文件安装插件
PluginUpdate: 更新插件
PluginSearch [name]: 查找名为 [name] 的插件 

2. 安装 NERD 插件

切出一块区域,用来显示从根目录开始的文件结构,可从该索引区直接打开文件;

在.vimrc 添加插件

    call vundle#begin()
    Plugin 'VundleVim/Vundle.vim'
    Plugin 'The-NERD-Tree'
    call vundle#end()

安装

:PluginInstall

在 vim 命令行模式下用

:NERDTree 目录名 "

启动,默认当前目录。通过 j k 上下移动光标,o 或回车打开文件。
配置:

nmap <F2> :NERDTreeFind<CR><CR> " 设置 F2(我电脑刚好 f2 闲置) 为开启 nerdtree 的快捷键
let NERDTreeWinPos=1  " 将 nerdtree 区域设置在右边 

3.taglist 插件:

屏幕切出一块区域显示宏、变量名、函数名的索引;
安装 (要系统预先安装 vim,ctags)

Plugin 'taglist.vim'
:PluginInstall

安装后,在命令行启动

:TlistOpen/TlistClose

可以用 CTRL+ W 快捷键在 Taglist 窗口和编辑窗口切换;

在.vimrc 配置自动启动

" ----------------------------- plugin taglist start -----------------------------
"let Tlist_Use_Right_Window = 1
let Tlist_Show_One_File=1   " 仅显示一个文件的 tag
let Tlist_Exit_OnlyWindow=1 "taglist 为最后一个窗口时,退出 vim
let Tlist_Auto_Open = 1     " 设置打开 vim 时,自动启动 taglist

4.YouCompleteMe 插件

强大的代码自动补全

Plugin 'Valloric/YouCompleteMe'

手动安装:

git clone https://github.com/Valloric/YouCompleteMe.git ~/.vim/bundle/YouCompleteMe
cd ~/.vim/bundle/YouCompeteme

git submodule update --init --recursive

sudo apt install clang
sudo apt install build-essential cmake
sudo apt-get install python-dev python3-dev
#--clang-completer 支持 C 语言,其他语言选择 all
./install.py --clang-completer

在.vimrc 添加配置:

"YouCompletMe
" 自动补全配置
set completeopt=longest,menu " 让 Vim 的补全菜单行为与一般 IDE 一致 (参考 VimTip1228)
autocmd InsertLeave * if pumvisible() == 0|pclose|endif " 离开插入模式后自动关闭预览窗口
inoremap <expr> <CR>       pumvisible() ? "\<C-y>" : "\<CR>" " 回车即选中当前项
" 上下左右键的行为 会显示其他信息
inoremap <expr> <Down>     pumvisible() ? "\<C-n>" : "\<Down>"
inoremap <expr> <Up>       pumvisible() ? "\<C-p>" : "\<Up>"
inoremap <expr> <PageDown> pumvisible() ? "\<PageDown>\<C-p>\<C-n>" : "\<PageDown>"
inoremap <expr> <PageUp>   pumvisible() ? "\<PageUp>\<C-p>\<C-n>" : "\<PageUp>"
"youcompleteme  默认 tab  s-tab 和自动补全冲突
"let g:ycm_key_list_select_completion=['<c-n>']
"let g:ycm_key_list_select_completion = ['<Down>']
"let g:ycm_key_list_previous_completion=['<c-p>']
"let g:ycm_key_list_previous_completion = ['<Up>']
let g:ycm_confirm_extra_conf=0 " 关闭加载.ycm_extra_conf.py 提示
let g:ycm_collect_identifiers_from_tags_files=1 " 开启 YCM 基于标签引擎
let g:ycm_min_num_of_chars_for_completion=1 " 从第 2 个键入字符就开始罗列匹配项
let g:ycm_cache_omnifunc=0 " 禁止缓存匹配项, 每次都重新生成匹配项
let g:ycm_seed_identifiers_with_syntax=1 " 语法关键字补全
nnoremap <F5> :YcmForceCompileAndDiagnostics<CR> "force recomile with syntatic
"nnoremap <leader>lo :lopen<CR> "open locationlist
"nnoremap <leader>lc :lclose<CR> "close locationlist
inoremap <leader><leader> <C-x><C-o>
" 在注释输入中也能补全
let g:ycm_complete_in_comments = 1
" 在字符串输入中也能补全
let g:ycm_complete_in_strings = 1
" 注释和字符串中的文字也会被收入补全
let g:ycm_collect_identifiers_from_comments_and_strings = 0
nnoremap <leader>jd :YcmCompleter GoToDefinitionElseDeclaration<CR>
let g:clang_library_path='/usr/lib/llvm-10/lib/libclang.so'

如果打开 vim 出现如下错误:

NoExtraConfDetected: No .ycm_extra_conf.py file detected

在 home 目录创建文件.ycm_extra_conf.py

import os
import ycm_core

flags = [
    '-Wall',
    '-Wextra',
    '-Werror',
    '-Wno-long-long',
    '-Wno-variadic-macros',
    '-fexceptions',
    '-DNDEBUG',
    '-std=c++11',
    '-x',
    'c++',
    '-I',
    '/usr/include',
    '-isystem',
    '/usr/lib/gcc/x86_64-linux-gnu/5/include',
    '-isystem',
    '/usr/include/x86_64-linux-gnu',
    '-isystem'
    '/usr/include/c++/5',
    '-isystem',
    '/usr/include/c++/5/bits'
  ]

SOURCE_EXTENSIONS = ['.cpp', '.cxx', '.cc', '.c',]

def FlagsForFile(filename, **kwargs):
  return {
    'flags': flags,
    'do_cache': True
  }

在.vimrc 添加

let g:ycm_global_ycm_extra_conf='~/.ycm_extra_conf.py'
let g:ycm_confirm_extra_conf = 0

5. 侧边栏显示 git 修改

Plugin 'airblade/vim-gitgutter

6. 目录树显示文件的 git 修改

Plugin 'Xuyuanp/nerdtree-git-plugin'

正文完
 
admin
版权声明:本站原创文章,由 admin 2022-08-22发表,共计7316字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)