Vim浏览linux kernel代码的环境搭建
来源:互联网 发布:绝食知乎 编辑:程序博客网 时间:2024/06/06 10:56
0x1 概述
前一段时间下载了linuxkernel 4.1的源码,用sourceinsight创建工程进行同步,每次都会报错,以前的工程都没问题,更重要的一点是我越来越反感windows系统,所以就想用vim完全代替sourceinsight,vim其实很强大,一直使用却从来没有深入过,正好趁机研究一下。
主机环境:ubuntu14.04 + vim 8.0.69
实现功能:目录树、当前文件符号列表、全局符号索引、自动补全、文件索引、自动缩进、历史文件列表、代码编译
0x2 安装vim
安装vim的新版本出于ycm(youcompleteme)插件的要求,这个插件提供强大的自动补全功能,如果不需要这个插件,或者你的vim版本已经符合ycm的要求,本节可以直接略过,对vim的版本要求可以在ycm的README.md中可以找到。
0x21 vim下载解压
下载地址
http://www.vim.org/download.php
删除系统自带的vim:
sudo apt-get purge vim
解压vim源码:
tar -jxvf vim-8.0.tar.bz2
0x22 配置编译
进入源码目录:
cd vim80/src/
打开Makefile文件,添加对python的支持,配置已经写好,去掉下面四项注释即可
CONF_OPT_PYTHON =--enable-pythoninterpCONF_OPT_PYTHON =--enable-pythoninterp=dynamicCONF_OPT_PYTHON3 =--enable-python3interpCONF_OPT_PYTHON3 =--enable-python3interp=dynamic
配置编译:
make
sudo make install
0x23 查看vim版本
vim --version
0x3 常用插件
0x31 ctags
作用
生成tag文件用于宏定义、变量、函数等符号跳转。
下载地址
https://sourceforge.net/projects/ctags/files/latest/download?source=files
遇到的问题
taglist需要使用ctags,但是与vim自带的ctags不兼容,当配置taglist插件后,打印如下错误:
ctags: unrecognized option'--format=2'^@^ITry `ctags --help'
必须通过安装exuberant-ctags解决
sudo agt-get installctags-exuberant
同时在.vimrc中为taglist设置该工具的二进制文件路径
let Tlist_Ctags_Cmd ='/usr/bin/ctags-exuberant'
生成符号文件
linux内核代码根目录执行下面命令
cd ~/src/kernel/linux-3.16$
~/src/kernel/linux-3.16$ maketags
使用方法
vim默认会在当前目录查找名字为”tags”的tag文件。一旦建立了tag文件,运用下面的命令索引tag:
vim –t tag
打开当前目录下tag所在的定义位置,如果没有则进入vim后报错
:ta tag
查找tag
ctrl + ]
查找光标下的tag
ctrl + T
返回之前的位置
0x32 NERDTree
作用
建立源码目录树
下载地址
http://www.vim.org/scripts/script.php?script_id=1658
安装
unzip解压NERD_tree.zip,copydoc/NERD_tree.txt到目录~/.vim/doc/下,copyNERD_tree.vim到~/.vim/plugin/下,copyautoload/,lib/, nerdtree_plugin/, syntax/几个目录到~/.vim/目录下
使用方法
运行vim,输入:NERDTree命令,即可列出当前目录的目录树,如图:
图3.1 NERDTree运行效果
适配winmanager插件
此处有一个问题,NERDTree加入winmanager多一个空白窗口,所以NERDTree_Start函数先执行一个退出命令
let g:NERDTree_title ="\/[NERDTree\/]"function! NERDTree_Start() exe 'q' exe 'NERDTree'endfunction“ never change, return 0function! NERDTree_IsValid() return 0endfunction
常用操作
ctrl + w + h 光标focus左侧树形目录
ctrl + w + l 光标focus右侧文件显示窗口
ctrl + w + w 光标自动在左右侧窗口切换
ctrl + w + r 移动当前窗口的布局位置
O 递归打开选中结点下的所有目录
x 合拢选中结点的父目录
X 递归合拢选中结点下的所有目录
P 跳到根结点
p 跳到父结点
K 跳到当前目录下同级的第一个结点
J 跳到当前目录下同级的最后一个结点
k 跳到当前目录下同级的前一个结点
j 跳到当前目录下同级的后一个结点
0x33 TagList
作用
显示当前文件的tag列表
下载地址
http://www.vim.org/scripts/script.php?script_id=273
安装
解压后copytaglist.txt到~/.vim/doc/下,copytaglist.vim到~/.vim/plugin/下
vimrc配置
"设置ctags二进制文件路径
let Tlist_Ctags_Cmd ='/usr/bin/ctags-exuberant'
"只显示当前buffer的tags信息
let Tlist_Show_One_File = 1
"vim退出时,一并退出
let Tlist_Exit_OnlyWindow = 1
"自动关闭非焦点窗口的tag信息
let Tlist_File_Fold_Auto_Close= 1
"taglist在vim右侧,加入winmanager后,位置由winmanager管理
let Tlist_Use_Right_Window = 1
"显示tags menu
"let Tlist_Show_Menu = 1
"在vim运行时打开
"let Tlist_Auto_Open = 1
使用方法
<CR> 回车键,跳转到光标下的tag的定义处
o 跳转到光标下的tag的定义处,在新窗口中显示
P 跳转到tag处,在上一个窗口中显示
p 在文件中显示tag的定义位置,光标停留在taglist中原位置
t 在新标签页中跳转到tag。如果tag所在的文件已经打开了,则移动到该文件
Ctrl-t 在新标签页中跳转到tag
<Space> 显示光标处tag的原型。如果是文件名,则显示文件的完整路径,文件类型和tags数量。如果是tag类型,则显示tag类型和tags数量
u 更新tags列表
s 改变tags排列顺序(按名称或按文件中出现的次序)
d 移除光标处文件的tags
x 放大或缩小taglist窗口
+ 打开一个折叠
- 关闭一个折叠
* 打开所有的折叠
= 关闭所有的折叠
q 关闭taglist窗口
<F1> 显示帮助
图3.2 taglist运行效果
0x34 bufexplorer
作用
buffer列表,查看历史打开文件
下载地址
http://www.vim.org/scripts/script.php?script_id=42
安装
同TagList
遇到的问题
bufexplorer会根据历史条目数量自适应窗口高度,但是taglist没有同样的实现,导致切换回taglist功能时,窗口高度无法恢复(此处涉及到taglist和bufexplorer功能重叠的问题,winmanager会讲到)
图3.3 bufexplorer自适应窗口高度
解决方法
目前不需要这个feature,所以干脆直接注释掉在bufexplorer.vim脚本中function!BufExplorer_ReSize()函数。
如果bufexplorer.vim的格式是dos,GNU/Linux下必须转换成unix文本格式,转换方法
sed 's/.$//' -i bufexplorer.vim
或者
vim bufexplorer.vim
:set fileformat=unix
:w
适配winmanager
bufexplorer.vim已经实现了BufExplorer_Start、BufExplorer_IsValid、BufExplorer_Refresh三个函数。
0x35 winmanager
作用
管理多个插件的显示布局
下载解压
http://www.vim.org/scripts/script.php?script_id=1440
bunzip2 winmanager.vmb.bz2
安装
执行~/tftp_root$vim winmanager.vmb后弹出如下提示:
图3.4 vimball运行
输入:so%完成安装:
图3.5 vimball安装winmanager
vimrc配置
"winmanager
"设置窗口布局
let g:winManagerWindowLayout ='NERDTree|TagList,BufExplorer'
"所有文件关闭,只剩资源管理窗口时,退出vim
let g:persistentBehaviour = 0
"设置子窗口的宽为30,默认25
let g:winManagerWidth = 30
let g:defaultExplorer = 0
"映射winmanager开关
nmap wm :WMToggle<cr>
"直接移动焦点到左上角窗口
nmap fw:FirstExplorerWindow<cr>
"直接移动焦点到右下角窗口
nmap bw:BottomExplorerWindow<cr
使用方法
cd~/src/linux/kernel/linux-3.16$
vim
打开winmanager
:wm
移动到左上角窗口
:fw
图3.6 winmanager运行效果图
特别注意:TagList和BufExplorer在同意区域显示,切换功能的方法是ctrl+n
0x36 YouCompleteMe
作用
自动补全
下载
cd ~/.vim/plugin/
git clone --recursive https://github.com/Valloric/YouCompleteMe.git
确认仓库的完整性
git submodule update --init --recursive
系统要求
在ycm根目录的README.md中UbuntuLinux x64部分写明了对vim和python的版本要求最新的ycm要求Vim7.4.143版本及以上,并且支持Python2或Python3,在第一节已经介绍过了
安装依赖的软件包
sudo apt-get install build-essential cmake
sudo apt-get install python-dev python3-dev
手动安装
下载clang地址
http://releases.llvm.org/3.9.0/clang+llvm-3.9.0-x86_64-linux-gnu-ubuntu-14.04.tar.xz
解压
tar -xvfclang+llvm-3.9.0-x86_64-linux-gnu-ubuntu-14.04.tar.xz
cd ~
mkdir ycm_build
cd ycm_build
生成makefile
cmake -G "Unix Makefiles"-DPATH_TO_LLVM_ROOT=~/ycm_temp/llvm_root_dir . ~/.vim/plugin/YouCompleteMe/third_party/ycmd/cpp
编译
make
快速安装
只针对c家族语言的语义支持
cd ~/.vim/plugin/YouCompleteMe
./install.py–clang-completer
正确安装后如下:
图3.7 ycm安装完成
打开~/.vim/plugin/YouCompleteMe/third_party/ycmd/cpp/ycm/.ycm_extra_conf.py文件,做如下修改
注释掉gmock相关配置
#'-isystem',#'./tests/gmock/gtest',#'-isystem',#'./tests/gmock/gtest/include',#'-isystem',#'./tests/gmock',#'-isystem',#'./tests/gmock/include',
增加linux内核的配置
'-isystem','/usr/arm-linux-gnueabi/include','-isystem','~/src/linux/kernel/linux-3.16/include','-isystem','~/src/linux/kernel/linux-3.16/include/linux',
vimrc配置
"让Vim的补全菜单行为与一般IDE一致(参考VimTip1228)
set completeopt=longest,menu
set completeopt-=preview
"配置ycm_extra_conf.py路径
letg:ycm_global_ycm_extra_conf='~/.vim/plugin/YouCompleteMe/third_party/ycmd/cpp/ycm/.ycm_extra_conf.py'
"开启语义补全
letg:ycm_seed_identifiers_with_syntax = 1
" 禁止缓存匹配项,每次都重新生成匹配项
let g:ycm_cache_omnifunc=0
"ycm首先通过ultisnips进行代码块补全,这里没有该插件,并且默认为1,所以要设置为0关掉功能
letg:ycm_use_ultisnips_completer=0
"开启基于tag的补全,可以在这之后添加需要的标签路径
let g:ycm_collect_identifiers_from_tags_files= 1
" 输入第2个字符开始补全
let g:ycm_min_num_of_chars_for_completion= 2
" 不进行错误诊断
let g:ycm_show_diagnostics_ui= 0
回车即选中
inoremap <expr> <CR> pumvisible() ? "\<C-y>" : "\<CR>"
0x37 cscope
作用
全局符号和文件查找
安装
sudo apt-get install cscope
cscope命令
s 查找C符号,包括函数名、宏、变量名、枚举等
g 全局范围内查找符号定义位置
d 查找本函数调用的函数
c 查找调用本函数的函数
t 查找字符串
e 查找egrep匹配字符串,egrep命令等同于grep -E,利用此命令可以使用扩展的正则表达式对文本进行搜索
f 查找并打开文件
i 查找包含本文件的文件
生成符号文件
cd ~/src/kernel/linux-3.16
make cscope
ls -l cscope* 多了scope开头的几个文件
vimrc配置
在vim打开时加载cscope索引文件
if has("cscope") setcsprg=/usr/local/bin/cscope set csto=0 set cst set nocsverb " add any database incurrent directory if filereadable("cscope.out") cs add cscope.out " else add databasepointed to by environment elseif $CSCOPE_DB != "" cs add $CSCOPE_DB endif set csverbendif
按键功能映射
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>nmap <C-_>a :cs find a <C-R>=expand("<cword>")<CR><CR>
按键方法是把光标停留在要查找的关键字或文件名处,先按"Ctrl+Shift+-",然后再按对应的字母。
0x4 针对linux内核codingstyle的配置
filetype plugin indent on
syn on se title
set tabstop=8
set softtabstop=8
set shiftwidth=8
set noexpandtab
0x5 在vim中进行编译
vimrc中添加如下函数:
func! CompileLK() exec "w" exec "makeCROSS_COMPILE=arm-linux-gnueabi- ARCH=arm zImage"endfunc
该函数先保存当前文件,然后执行编译
映射编译命令:
map mk :call CompileLK()<CR>
输入:mk命令执行保存编译动作
0x6 完整的.vimrc
"set mouse=a"if you are using ycm,backspace can't be used normally, so set backspace as"belowset backspace=2set syntax=on" codeing style settingfiletype plugin indent onsyn on se titleset tabstop=8set softtabstop=8set shiftwidth=8set noexpandtab" taglist settinglet Tlist_Ctags_Cmd ='/usr/bin/ctags-exuberant'let Tlist_Show_One_File = 1let Tlist_Exit_OnlyWindow = 1let Tlist_File_Fold_Auto_Close= 1let Tlist_Use_Right_Window = 1"let Tlist_Show_Menu = 1"let Tlist_Auto_Open = 1" winmanager settinglet g:winManagerWindowLayout ='NERDTree|TagList,BufExplorer'let g:persistentBehaviour = 0let g:winManagerWidth = 30let g:defaultExplorer = 0nmap wm :WMToggle<cr>nmap fw:FirstExplorerWindow<cr>nmap bw:BottomExplorerWindow<cr>" compilation settingfunc! CompileLK() exec "w" exec "makeCROSS_COMPILE=arm-linux-gnueabi- ARCH=arm zImage"endfuncmap mk :call CompileLK()<CR>" ycm settingset completeopt=longest,menuset completeopt-=previewlet g:ycm_global_ycm_extra_conf='~/.vim/plugin/YouCompleteMe/third_party/ycmd/cpp/ycm/.ycm_extra_conf.py'let g:ycm_seed_identifiers_with_syntax=1let g:ycm_cache_omnifunc=0let g:ycm_use_ultisnips_completer=0let g:ycm_collect_identifiers_from_tags_files=1let g:ycm_min_num_of_chars_for_completion=2let g:ycm_show_diagnostics_ui =0autocmd InsertLeave * ifpumvisible() == 0|pclose|endifinoremap <expr> <CR>pumvisible() ? "\<C-y>" : "\<CR>""cscope settingif has("cscope") set csprg=/usr/bin/cscope set csto=1 set cst set nocsverb "add any database incurrent directory if filereadable("cscope.out") cs add cscope.out endif set csverbendifnmap <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>
参考资料
vim插件安装及配置
http://www.cnblogs.com/ifys/archive/2010/10/24/1860610.html
http://blog.csdn.net/bokee/article/details/6633193
linux内核浏览编辑器及环境设置
https://kernelnewbies.org/FAQ/CodeBrowsing
https://kernelnewbies.org/KernelHackingTools
https://kernelnewbies.org/FirstKernelPatch#head-17dd753ec497c8f7e2305ce78be8c6ca7cd1c92c
ycm安装配置
http://www.linuxidc.com/Linux/2014-04/99719.htm
http://blog.csdn.net/houzhuoming1/article/details/49990739
http://www.cnblogs.com/Suzzz/p/4071880.html
http://www.tuicool.com/articles/QBnAr2
- Vim浏览linux kernel代码的环境搭建
- 在ubuntu下搭建简单的代码浏览环境
- Linux Vim 环境搭建
- Linux VIM增加代码浏览功能
- vim环境的搭建
- vim ctags 浏览代码
- Ubuntu编译Linux kernel环境搭建
- vim+global+ctags搭建高效的编程环境(Windows/Linux)
- Windows下用Cygwin,VIM搭建Mainframe开发环境(九)---更强的文件浏览和自动完成
- 搭建vim的IDE环境
- vim集成环境的搭建
- Linux 环境使用vim搭建php IDE -- 提高代码编写数度数倍!手把手教你打造程序员的上古神器VIM!
- 转:Linux 环境使用vim搭建php IDE -- 提高代码编写数度数倍!手把手教你打造程序员的上古神器VIM!
- Linux 环境使用vim搭建php IDE
- Linux程序设计(搭建开发环境--vim)
- Linux centos下VIM开发环境搭建
- Linux环境搭建(vim,makefile,gdb...)
- QEMU模拟vexpress-a9 搭建Linux kernel运行环境
- [ACM] POJ 1753 Flip Game (枚举,BFS,位运算)
- 深度学习之Windows下安装caffe及配置Python和matlab接口
- Android Fragment 示例
- async-http 的封装
- Nginx反向代理、CORS、JSONP等跨域请求解决方法总结
- Vim浏览linux kernel代码的环境搭建
- 给大家一个我的QQ群
- Framework VS Library
- JSON
- HDU1059 Dividing (多重背包)
- 确定windows系统是32bit还是64bit
- java设计模式之单例模式
- 博为峰JavaEE技术文章 ——MyBatis Mapper $与#的区别
- Objective-C @protected @private @public @package