欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

[Linux] - 將vim打造成source insight

程序员文章站 2022-07-14 09:18:53
...

转载自https://ivan7645.github.io/2016/07/12/vim_to_si/

vim是套在Linux上非常好用的編輯軟體,但在trace code的能力上卻比不上Windows上的source insight,但我們可以另外安裝套件,讓vim接近於source insight的使用方式

以下使用了ctags + cscope + taglist + nerdtree + srcexpl + trinity來達成此目標
ctags

ctags可以在函式、變數之間*進行切換,例如某主函式call了funca(),ctags可以直接跳到funca的函式裡面、也可使用在變數上

安裝

第一步先安裝ctags

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

使用

進入程式目錄當中,若是多層的目錄則進到最上層的目錄,接著輸入

ctags -R

接著必須讓vim知道tags需要到哪裡找到,先用vim打開vimrc,之後把下面第二段的資訊加進去

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

用vim進到.c .h檔之後移到函式或變數上即可使用快捷鍵找到該函式或變數的定義,也可跳回到使用此函式的地方

“跳至該函式或變數定義
Ctrl + ]
“跳回使用此函式或變數處
Ctrl + t

cscope

cscope可以查詢函式或變數在哪些地方被使用過,或是函式當中使用了哪些函式

安裝

第一步先安裝cscope

sudo apt-get install cscope

使用

進入程式目錄當中,若是多層的目錄則進到最上層的目錄,接著輸入

cscope -Rbqk

參數說明如下

R : 將目錄及子目錄底下的所有文件都建立索引
b : 僅建立關聯數據庫,不導入使用者介面
q : 建立cscope.in.out和cscope.po.out,可增快搜尋速度
k : 不搜尋預設會include進來的函式(/usr/include)

進入vim的一般指令模式之後必須將cscope.out加入

:cs add cscope.out

為了避免每次使用都必須重複輸入,因此可將此段加入vimrc裡,讓vim自動執行,另外cscope的官方網站也提供了建議的vimrc設定
http://cscope.sourceforge.net/cscope_maps.vim

我挑了部分較常使用的加入vimrcvim ~/.vimrc,將以下設定加入vimrc,另外建議自行將註解加入

set cscopetag
set csto=0

if filereadable(“cscope.out”)
cs add cscope.out
elseif CSCOPEDB!=csaddCSCOPE_DB
endif
set cscopeverbose

nmap zs :cs find s =expand(“”)
nmap zg :cs find g =expand(“”)
nmap zc :cs find c =expand(“”)
nmap zt :cs find t =expand(“”)
nmap ze :cs find e =expand(“”)
nmap zf :cs find f =expand(“”)
nmap zi :cs find i ^=expand(“”)$
nmap zd :cs find d =expand(“”)

其中最後的nmap部分為快捷鍵,其中的第一行指的是可使用zs取代在vim裡輸入:cs find s {name}的指令,後面依此類拖
官網給的設定檔快捷鍵為Ctrl+/+s的組合,不過我是用VIM7.4,對於三個以上的組合鍵似乎有使用上的問題,這部分還沒找到解決方式,因此就先用兩個的組合鍵

最後附上各指令的用途

:cs find s {name} : 找出C語言name的符號
:cs find g {name} : 找出name定義的地方
:cs find c {name} : 找出使用name的地方
:cs find t {name} : 找出name的字串
:cs find e {name} : 相當於egrep功能,但速度更佳
:cs find f {name} : 尋找檔案
:cs find i {name} : 尋找include此檔案的檔案
:cs find d {name} : 尋找name裡面使用到的函式

taglist

taglist可在切出一區塊,顯示此檔案裡的macro,global variable,函式等資訊,且會隨著瀏覽到哪個地方便以不同顏色標示

安裝

下載plugin file,下載地址如下,請自行選擇最新版本下載

http://sourceforge.net/projects/vim-taglist/files/vim-taglist

將plugin/taglist.vim複製到~/.vim/plugin/,doc/taglist.txt複製到~/.vim/doc

使用

可在~/.vimrc裡配置相關設定,其他配置選項請參考官網說明

nmap :TlistToggle
let Tlist_Show_One_File=1
let Tlist_Exit_OnlyWindow=1
set ut=100

nmap : 將F8設為開啟taglist的快捷鍵
Tlist_Show_One_File : 只顯示當下瀏覽檔案的func,不顯示之前瀏覽的檔案
Tlist_Exit_OnlyWindow : 如果taglist區塊是最後一個,則退出vim
ut=100 : taglist會標示目前在操作哪個function or variable,但更新速度很慢,這裡把更新速度設成100ms

nerdtree

NERD tree可切出一區塊,顯示根目錄開始的檔案結構,且可由list直接跳到選取的檔案

安裝

下載plugin file,下載地址如下,請自行選擇最新版本下載

http://www.vim.org/scripts/script.php?script_id=1658

將plugin/NERD_tree.vim複製到~/.vim/plugin/,doc/NERD_tree.txt複製到~/.vim/doc
剩下的資料夾autoload, lib, nerdtree_plugin, syntax全部複製到~/.vim底下

使用

可在~/.vimrc裡配置相關設定,其他配置選項請參考官網說明

nmap :NERDTreeFind
let NERDTreeWinPos=1

nmap : 將F9設為開啟nerdtree的快捷鍵
NERDTreeWinPos : 將nerdtree區塊放在右邊

SrcExpl(Source Explorer)

SrcExpl可以將當下function的定義顯示出來,或是將當下的變數宣告處顯示出來

安裝

使用git下載plugin檔

git clone https://github.com/wesleyche/SrcExpl

將plugin/srcexpl.vim複製到~/.vim/plugin/,doc/srcexpl.txt複製到~/.vim/doc

使用

官方網站有詳細介紹在.vimrc可用的設定,這裡只列出我有用到的設定

nmap :SrcExplToggle
let g:SrcExpl_pluginList = [
\”Tag_List“,
\”NERD_tree
\
]

nmap : 將F10設為開啟srcexpl的快捷鍵
若有安裝taglist or nerdtree則需輸入

trinity

trinity用來整合taglist, nerdtree, srcexpl,使可以一鍵開啟三個plgin的功能

安裝

使用git下載plugin檔

git clone https://github.com/wesleyche/Trinity

將plugin/trinity.vim複製到~/.vim/plugin/

使用

接著設定vimrc

nmap :TrinityToggleAll

nmap : 將F7設為一次打開taglist, nerdtree, srcexpl的快捷鍵

一次打開之後,畫面如下
[Linux] - 將vim打造成source insight

ps:在此基础上将~/.vimrc文件改成:

map :call SaveInputData()
func! SaveInputData()
exec “tabnew”
exec ‘normal “+gP’
exec “w! /tmp/input_data”
endfunc
“colorscheme torte
“colorscheme murphy
“colorscheme desert
“colorscheme desert
“colorscheme elflord
colorscheme desert
“set fencs=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936
“set termencoding=utf-8
“set encoding=utf-8
“set fileencodings=ucs-bom,utf-8,cp936
“set fileencoding=utf-8
“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”
” 显示相关
“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”
“set shortmess=atI ” 启动的时候不显示那个援助乌干达儿童的提示
“winpos 5 5 ” 设定窗口位置
“set lines=40 columns=155 ” 设定窗口大小
set go= ” 不要图形按钮
“color asmanian2 ” 设置背景主题
“set guifont=Courier_New:h10:cANSI ” 设置字体
“syntax on ” 语法高亮
autocmd InsertLeave * se nocul ” 用浅色高亮当前行
autocmd InsertEnter * se cul ” 用浅色高亮当前行
“set ruler ” 显示标尺
set showcmd ” 输入的命令显示出来,看的清楚些
“set cmdheight=1 ” 命令行(在状态行下)的高度,设置为1
“set whichwrap+=<,>,h,l ” 允许backspace和光标键跨越行边界(不建议)
“set scrolloff=3 ” 光标移动到buffer的顶部和底部时保持3行距离
set novisualbell ” 不要闪烁(不明白)
set statusline=%F%m%r%h%w\ [FORMAT=%{&ff}]\ [TYPE=%Y]\ [POS=%l,%v][%p%%]\ %{strftime(\”%d/%m/%y\ -\ %H:%M\”)} “状态行显示的内容
set laststatus=1 ” 启动显示状态行(1),总是显示状态行(2)
set foldenable ” 允许折叠
set foldmethod=manual ” 手动折叠
set background=dark “背景使用黑色
set nocompatible “去掉讨厌的有关vi一致性模式,避免以前版本的一些bug和局限
” 显示中文帮助
if version >= 603
set helplang=cn
set encoding=utf-8
endif
” 设置配色方案
“colorscheme murphy
“字体
“if (has(“gui_running”))
” set guifont=Bitstream\ Vera\ Sans\ Mono\ 10
“endif
“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“””
“”“”“新文件标题
“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”
“新建.c,.h,.sh,.java文件,自动插入文件头
autocmd BufNewFile .cpp,.[ch],.sh,.java exec “:call SetTitle()”
“”定义函数SetTitle,自动插入文件头
func SetTitle()
“如果文件类型为.sh文件
if &filetype == ‘sh’
“call setline(1,”#########################################################################”)
“call append(line(“.”), “# File Name: “.expand(“%”))
“call append(line(“.”)+1, “# Author: ma6174”)
“call append(line(“.”)+2, “# mail: aaa@qq.com”)
“call append(line(“.”)+3, “# Created Time: “.strftime(“%c”))
“call append(line(“.”)+4, “#########################################################################”)
“call append(line(“.”)+5, “#!/bin/bash”)
“call append(line(“.”)+6, “”)
else
“call setline(1, “/***************************************************************”)
“call append(line(“.”), ” > File Name: “.expand(“%”))
“call append(line(“.”)+1, ” > Author: Robin.Wu”)
“call append(line(“.”)+2, ” > Mail: aaa@qq.com “)
“call append(line(“.”)+3, ” > Created Time: “.strftime(“%c”))
“call append(line(“.”)+4, ” **************************************************************/”)
“call append(line(“.”)+5, “”)
endif
if &filetype == ‘cpp’
call append(line(“.”)+6, “#include”)
call append(line(“.”)+7, “using namespace std;”)
call append(line(“.”)+8, “”)
endif
if &filetype == ‘c’
call append(line(“.”)+6, “#include