vi编辑器的配置:http://blog.mcuol.com/User/fenghua/Article/17411_1.htm
******************************vim ~/.vimrc***************************
常用设置
"显示行号"
set nu
缩格数
set tabstop=4
"设置自动对齐"
set autoindent
"设定任何模式下鼠标都可用"
set mouse=a
"配色方案"
colorscheme desert
"设置帮助的语言
set helplang=cn
"设置魔术"
set magic
"关闭vi兼容模式,避免以前版本的一些bug和局限"
set nocompatible
"不设定的话在插入状态无法用退格键和 Delete"
set backspace=indent,eol,start
"设定光标离窗口下边界10行时自动滚动"
set scrolloff=5
"检测文件类型"
filetype on
"历史记录行数"
set history=1000
"语法高亮显示"
syntax on
"打开状态栏标尺"
set ruler
"再状态栏显示目前所执行的指令"
set showcmd
"智能对齐"
set smartindent
"自动匹配"
set showmatch
"定制c语言缩进风格"
set cindent
"查找对应文本"
set incsearch
"搜索时高亮显示被找到的文本"
set hlsearch
"搜索时忽略大小写"
set ignorecase
"智能大小写查找"
"set ignorecase smartcase
"开始折叠"
set foldenable
"设置语法折叠"
set foldmethod=syntax
"设置自动关闭折叠"
"set foldclose=all
" 用空格键来开关折叠"
nnoremap <space> @=((foldclosed(line('.')) < 0) ? 'zc' : 'zo')<CR>
"设置关闭备份文件"
set nobackup
"高亮当前行"
set cursorline
"设置标签
function GuiTabLabel()
let label = ''
let bufnrlist = tabpagebuflist(v:lnum)
"如果标签叶窗口多于1,加上窗口数目
let wincount = tabpagewinnr(v:lnum, '$')
if wincount > 1
let label .= wincount
endif
if label != ''
let label .= ' '
endif
"设置状态栏显示信息"
set laststatus=2
set statusline=%F%m%r,%Y,%{&fileformat}\ \ \ ASCII=\%b,HEX=\%B\ \ \ %l,%c%V\
%p%%\ \ \ [\ %L\ lines\ in\ all\ ]
"开启插件"
filetype plugin indent on
"附加缓冲区名
label . bufname(bufnrlist[tabpagewinnr(v:lnum) - 1])
endfunction
set guitablabel=%{GuiTabLabel()}
set guitablabel=%N\ %f
man 高亮显示:
vim ~/.bashrc
export LESS_TERMCAP_mb=$'\E[01;31m'
export LESS_TERMCAP_md=$'\E[01;31m'
export LESS_TERMCAP_me=$'\E[0m'
export LESS_TERMCAP_se=$'\E[0m'
export LESS_TERMCAP_so=$'\E[01;44;33m'
export LESS_TERMCAP_ue=$'\E[0m'
export LESS_TERMCAP_us=$'\E[01;32m'
1. vim基本用法:模式,光标移动,查找替换,复制粘贴删除
2. 配置:显示和编辑样式,配置文件
3. vim用法: 多行注释,多文件,多窗格编辑,保存会话
4. 浏览代码:ctags,Taglist,NERD_tree,cscope
5. 编译并修改代码错误
6. 调用gdb来debug:vimgdb
7. 其它
8. 我的vim
目前感觉vim浏览代码的效率是一流的。compile还行,debug还好,不太方便。
注意:这里的命令严格区分大小写,命令输入时看CapsLock有没有锁。
1. vim基本用法:模式,光标移动,查找替换,复制粘贴删除
1.1 帮助
:help
:help command
1.2 模式切换
命令模式 Esc, Ctrl-c, 配合光标移动可用Alt-h,Alt-j,Alt-k,Alt-l
编辑模式 i 在当前位置编辑 , a在当前位置后面插入,I在行首插入,A在行尾插入,o添加新行
可视化模式 v块模式,V行块模式,Ctrl-v列块模式
下面的操作方式和快捷键基本上都是在命令模式下的,编辑模式按键一般只能输入文字。
1.3 输入方式
直接按键盘编辑 如i
:command 如:set nu
执行shell命令 :!command 如:!pwd
1.4 撤销,重做
撤销上一次的编辑操作 u, U
撤销未保存的全部编辑操作,重新载入文件 :e!
重做上一次撤销的编辑操作 Ctrl-r
1.5 保存,退出
保存文件 :w
关闭文件 :q
保存并关闭文件 :wq
不保存强制关闭文件 :q!
关闭所有文件退出 :qa
1.6 移屏
下翻页 Ctrl-f
上翻页 Ctrl-b
下翻行 Ctrl-e
上翻行 Ctrl-y
1.7 光标定位快捷键
到指定行 :行号,行号G
到文件头 1G
到文件尾 G
左下上右 h,j,k,l
下一个字 w,上一个字 b
到行首 ^
到行尾 $
行尾插入 A,添加空行 o
1.8 在函数中定位光标
[[ 转到上一个位于第一列的“{”
]] 转到下一个位于第一列的“{”
{ 转到上一个空行
} 转到下一个空行
1.9 查找当前文件
n,N 查找到key后,n跳到后一个位置,N跳到前一个位置
* , # 当前光标所在的词key作为关键字,精确匹配查找,相当于/\<key\>
g*, g# 当前光标所在的词key作为关键字,忽略大小写查找,相当于/key
/key 从当前光标位置开始向后查找key
?key 从当前光标位置开始向前查找key
/\<key\>,?\<key\> 精确匹配查找key
1.10 批量替换:%s/要被取代的字串/新的字串/g
1.11 复制粘贴删除
复制行 yy 复制n行 nyy
粘贴行 p
删除行 dd 删除n行 ndd
删除字 dw 复制字 yw
可视块选择复制:
进入可视化模式 v,V,Ctrl-v
可视化模式下,方向键选择块
按y复制选择的块
2. 配置:显示和编辑样式,配置文件
2.1 显示和编辑样式
在状态行显示文件名set statusline+=%f,set laststatus=2
显示行号 :set nu 隐藏行号 :set nonu
自动缩进 :set autoindent
c风格的缩进 :set cindent
显示断行符等特殊符号 :set list
2.2 配置文件
vim自带的配置文件 /etc/vimrc
用户自定义的配置文件 ~/.vimrc,自己创建。把自己的配置都写这里。
语法高亮 syntax on
3. vim用法: 多行注释,多文件,多窗格编辑,保存会话
3.1 多行注释
多行注释按键操作:
注释:Ctrl-v 进入列编辑模式,向下或向上移动光标,把需要注释的行的开头标记起来,然后按大写的I,再插入注释符比如"#",按Esc,就会全部注释了。
删除:Ctrl-v 进入列编辑模式,向下或向上移动光标,选中注释部分,按d,就会删除注释符号。
多行注释使用替换命令:
:%s/^/\/\//g来在全部内容的行首添加//号注释
:2,50s/^/\/\//g在2~50行首添加//号注释
反过来替换既是删除操作。
3.2 编辑多个文件
打开多个文件 $ vim filename1 filename2
切换文件 :prev,:next,:prev!,:next!,first,last ,只要切换出来过,就在缓冲区里了
显示打开的文件列表 :args
打开新的缓冲区看别的文件 :e filename
切换最近的两个文件(缓冲区) :e# 或 Ctrl-^
显示缓冲区的文件列表 :buffers
关闭其中一个(当前)文件 :bd,:bd 1,:bd 2,序号按:buffers显示的
切换到某个文件 :b 1,:b 2,序号按:buffers显示的
切换到上一个文件 :bp,:bprev
切换到下一个文件 :bn,:bnext
3.3 多窗口编辑
分割窗口
水平分割
:sp //当前编辑的文件分割一个窗口再打开
:spfilename //分割一个窗口出来,打开文件filename
:split
:new
垂直分割
:vsplit
:vnew
切换窗口
Ctrl-w 上下左右键
Ctrl-w h,j,k,l //h左,j下,k上,l右 //Ctrl按下,按w松开,Ctrl松开,按h
移动窗口
Ctrl-W H,J,K,L //H左,J下,K上,L右 //锁定CapsLock就可以得到大写
改变窗口大小
水平最大化当前窗口 Ctrl-w Ctrl-- //这个是特殊的:Ctrl按下,按w松开,再按-松开,最后松开Ctrl
等分窗口 Ctrl-w =
调整窗口大小 Ctrl-w +增加窗口大小一行,Ctrl-w -减少窗口大小一行
显示命令历史窗口
q:或q/,退出:q
让当前文件占据整个窗口
Ctrl-w o
关闭其中一个(当前)窗口
Ctrl-w c //其实文件还在buffers中
让用缓冲区的文件来到分割窗口
Ctrl-w Ctrl-^ //保持Ctrl按下
3.4 保存所在目录的环境和状态,会话
如果在vim中已经打开了好多窗口,想要保持这个环境,等下次编辑浏览时再载入。
:help mksession 查看mksession的帮助
:mksession! 保存当前的vim状态,在当前目录会产生一个会话文件Session.vim。
$ vim -S vim会自动载入当前目录的会话文件Session.vim,之前:mksession! 保持的状态又回来啦。
:mksession! work.vim 保存当前的vim状态到会话文件work.vim
$ vim -S work.vim vim载入会话文件work.vim,之前:mksession! work.vim保持的状态又回来啦。
也可在vim中手动载入会话:
:source Session.vim 载入Session.vim保持的状态。
:source work.vim 载入work.vim保持的状态。
配置自动保存和载入会话
这个配置好后,第一次在要自动保持会话的目录下进入vim,用命令:mksession! project.vim。以后使用直接在当前目录$vim即可。
如果想打开和关闭vim时自动保存和载入会话,可以在配置文件~/.vimrc中加入:
" auto save and load session
let g:AutoSessionFile="project.vim"
let g:OrigPWD=getcwd()
if filereadable(g:AutoSessionFile)
if argc()==0
au VimEnter * call EnterHandler()
au VimLeave * call LeaveHandler()
endif
endif
function! LeaveHandler()
exec "mks! ".g:OrigPWD."/".g:AutoSessionFile
endfunction
function! EnterHandler()
exe "source ".g:AutoSessionFile
endfunction
参考vim中session自动保存及加载
4. 浏览代码:ctags,Taglist,NERD_tree,cscope
4.1 热门vim脚本
http://vim.sourceforge.net 下 scripts->browse all
4.2ctags跳转到定义处
ctags是一个用来产生代码索引文件的插件,支持很多语言。
可以用Ctrl-]命令跳转到函数的定义处,也可以用命令来搜索函数的定义,非常好用。
安装ctags
如果没有安装ctags,fedora的shell下可以用 # yum -y install ctags安装。
创建tags文件
shell下,在需要创建tags文件的目录下用 $ ctags -R,那么整个目录下的函数,宏,变量,类,结构等都加上了tags。
使用ctags
按键跳转Ctrl-],Ctrl-t,Ctrl-o
在创建tags文件的目录下,用vim打开的文件中,光标移到一个被调用的函数名上,按Ctrl-]就会自动跳转到该函数的定义处,Ctrl-t返回。
命令跳转 :tags functionname
在用vim打开的文件中,用命令:tags functionname。:ta functionname
打开时搜索并跳转
vim -t functionname
多个匹配tags时跳转
:tnext,:tprev,:tn,:tp
4.3Taglist函数和变量列表
Taglist是vim的源代码浏览插件,可以以窗口方式查看函数列表,变量列表等。
Taglist的实现依赖ctags。
安装Taglist
1. 在 http://www.vim-taglist.sourceforge.net/screenshots.html 下载最新版的Taglist软件包。
2. 在个人用户目录下创建 .vim目录,将taglist_**.zip中的内容解压到该目录。
3. 进入Vim,在命令模式下输入命令 " helptags ~/.vim/doc"即可完成Taglist的安装。
4. 输入命令“:Tlist”检查是否安装成功。
修改配置文件 vim .vimrc
let Tlist_File_Fold_Auto_Close=1 除了当前窗口显示的文件,其它文件折叠。
let Tlist_Exit_OnlyWindow=1 如果Tlist是最后一个窗口,自动退出vim。
let Tlist_Use_Right_Window = 1 “让taglist窗口出现在Vim的右边
let Tlist_File_Fold_Auto_Close = 1 “当同时显示多个文件中的tag时,设置为1,可使taglist只显示当前文件tag,其它文件的tag都被折叠起来。
let Tlist_Show_One_File = 1 “只显示一个文件中的tag,默认为显示多个
let Tlist_Sort_Type =‘name’ “Tag的排序规则,以名字排序。默认是以在文件中出现的顺序排序
let Tlist_GainFocus_On_ToggleOpen = 1 “Taglist窗口打开时,立刻切换为有焦点状态
let Tlist_Exit_OnlyWindow = 1 “如果taglist窗口是最后一个窗口,则退出vim
let Tlist_WinWidth = 32 “设置窗体宽度为32,可以根据自己喜好设置
let Tlist_Ctags_Cmd =‘/usr/local/Cellar/ctags/5.8/bin/ctags’ “这里比较重要了,设置ctags的位置,不是指向MacOS自带的那个,而是我们用homebrew安装的那个
使用 :Tlist
打开 Vim 之后,使用命令 :Tlist激活 Taglist窗口; 按Ctrl-w w在两个窗口来回跳转。
:Tlist
:TlistToggle
Tlist快捷键
在Tlist列表窗口中,以函数为例
看函数原型 空格
看函数定义 p
跳转到函数定义 移动到函数名处Enter
折叠/展开 - ,+
全部折叠/全部展开 =,*
更改列表排序方式 s
更新列表 u
放大缩小窗口 x
退出窗口 q
上/下一个文件 [[,]]
配置:Tlist快捷键
.vimrc中写:
nnoremap <silent><F2> :TlistToggle<CR>
Tlist帮助
在Tlist窗口按F1
:help Tlist 查看Tlist命令帮助
:help 'Tlist*' 查看Tlist选项帮助
:e ~/.vim/taglist.txt 直接打开文档看帮助
4.4 NERD_tree 目录树列表
安装NERD_tree
1.在vim.sourceforge.net 下载NERD_tree包。
2.把NERD_tree包解压到.vim下,之后会看到.vim下多了文件 doc/NERD_tree.txt,plugin/NERD_tree.vim。
3.进入vim,输入:NERDTree检查是否安装成功。
使用NERDTree
打开 vim 之后,使用命令 :NERDTree激活 NERDTree窗口; 按Ctrl-w w在两个窗口来回跳转。
:NERDTree
:NERDTreeToggle
NERDTree快捷键
o , Enter 展开/折叠目录
p 上一层目录
/ 查找文件
q 退出
帮助
?
:e ~/.vim/doc/NERD_tree.txt
忽略特定文件类型
配置文件中写:
let NERDTreeIgnore = ['.*\.o$','.*\.ko$','.*\.gz$'] 忽略后缀为.o,.ko,.gz的文件。
配置:NERDTree快捷键
.vimrc中写:
nnoremap <silent><F3> :NERDTreeToggle<CR>
4.5 bufexplorer 缓冲区文件列表
安装bufexplorer类似NERD_tree。
使用BufExplorer
:BufExplorer
配置:BufExplorer快捷键
.vimrc中写:
nnoremap <silent><F4> :BufExplorer<CR>
4.6cscope在整个目录查找函数被调用位置
cscope可以在整个目录查找函数定义,查找函数被调用位置等,非常好用。
安装cscope
fedora下,# yum -y install cscope
生成cscope数据库
在所要的目录下
$ find . -name '*.c' -or -name '*.h' -or -name '*.S' | cscope -Rbq
在当前目录会产生3个文件cscope.out,cscope.in.out,cscope.po.out。
载入cscope数据库
在当前目录进入vim
:cs add cscope.out
使用cscope查找整个目录
:cs help
:cs find g timer_interrupt 查找timer_interrupt的定义
:cs find c timer_interrupt 查找调用timer_interrupt的地方
:cs find e run_timer 查找关键字run_timer
find 可以简写为f
多个匹配间跳转
:cnext,cn
修改配置文件
set nocst 让跳转到定义的命令:ta 和 Ctrl-]调用ctags的tag,帮助:help nocst。
set csto=1 优先使用ctags的tag
"set cscopequickfix=s-,c-,d-,i-,t-,e- 使:cs find c 时直接跳转而不是列表,看个人喜好要不要设这个。
nnoremap <C-\> :cs find c <C-R>=expand("<cword>")<CR><CR> 光标放在函数上,快捷键Ctrl-\跳转到调用这个函数的地方。
nnoremap <C-_> :cs find g <C-R>=expand("<cword>")<CR><CR> 光标放在函数上,快捷键Ctrl-_跳转到函数定义处或列出多个定义
5. 编译并修改代码错误
quickfix模式内置在vim中,编译后记录了出错的位置信息,用来定位错误位置。
编译
调用当前目录下的Makefile文件编译 :make
改变编译调用的命令 :set makeprg=gcc\ -g\ test.c\ -o\ test ,没有写Makefile时用
快速定位代码错误
列出错误 :cl
下一个错误 :cn
上一个错误 :cp
从头开始 :cnew
打开错误列表窗口 :cw
关闭错误列表窗口 :ccl
新建一个新的窗口: vnew 如 vnew hello.h
退出Tlist :保存w 后quit
6. 调用gdb来debug:vimgdb
安装vimgdb
vimgdb需要以补丁形式打在vim版本上,下载vim的source,对应版本的vimgdb补丁,然后按vimgdb的说明文件安装即可。
配置按键映射
配置文件里加 map <F7> :run macros/gdb_mappings.vim<CR>
这样按F7,按键映射就可以在调试模式和普通模式切换了。
使用vimgdb
按键映射 <F7> 或 :run macros/gdb_mappings.vim
打开gdb命令窗格 空格
打开gdb输出窗格 在命令窗格键入gdb,按Enter
载入可执行文件 空格打开gdb命令窗格,file test,test就是编译后生成的可执行文件
设置断点 Ctrl-B
开始运行 R
继续执行 S,Ctrl-N,C
结束 F
退出 Q
变量监视窗口
创建变量监视窗 :bel 30vsplit gdb-variables
选中变量名到监视窗 v命令选中变量,Ctrl-P添加到变量监视窗格
输入变量名到监视窗 空格打开gdb命令窗格,输入createvar 变量名
在gdb输出窗格显示,查看
locals变量 L,info locals
函数stack W,where
断点位置 B,info breakpoints
寄存器 info registers
参考:vi/vim使用进阶: 在VIM中使用GDB调试 – 使用vimgdb
7. 其它
7.1 中文乱码问题
先安装运行zhcon
8. 我的vim
安装了插件ctags,cscope,脚本Taglist,NERD_tree,bufexplorer,
按这里配置好之后,F2弹出函数列表,F3弹出目录列表,Ctrle-],Ctrl--跳转到函数定义,Ctrl-\跳转到函数引用,很方便。
我的配置文件~/.vimrc
---------------------------------------------------------------------
1 syntax on
2
3 set nu
4 set autoindent
5 set cindent
6
7 " status line
8 set statusline+=%f
9 set laststatus=2
10
11 nnoremap <silent><F2> :TlistToggle<CR>
12 nnoremap <silent><F3> :NERDTreeToggle<CR>
13 nnoremap <silent><F4> :BufExplorer<CR>
14
15 " cscope
16 set nocst
17 set csto=1
18 nnoremap <C-\> :cscope find c <C-R>=expand("<cword>")<CR><CR>
19 nnoremap <C-_> :cscope find g <C-R>=expand("<cword>")<CR><CR>
20 "set cscopequickfix=s-,c-,d-,i-,t-,e-
21
22 " Tlist
23 let Tlist_File_Fold_Auto_Close=1
24 let Tlist_Exit_OnlyWindow=1
25 let Tlist_WinWidth=30
26 let Tlist_Inc_Winwidth=1
27
28 " NERDTree
29 let NERDTreeIgnore = ['.*\.o$','.*\.ko$','.*\.gz$']
30
31 " auto save and load session
32 let g:AutoSessionFile="project.vim"
33 let g:AutoViminfo="project.viminfo"
34 let g:OrigPWD=getcwd()
35 if filereadable(g:AutoSessionFile)
36 if argc()==0
37 au VimEnter * call EnterHandler()
38 au VimLeave * call LeaveHandler()
39 endif
40 endif
41 function! LeaveHandler()
42 exec "mks! ".g:OrigPWD."/".g:AutoSessionFile
43 endfunction
44 function! EnterHandler()
45 exe "source ".g:AutoSessionFile
46 endfunction
47
48 map <F7> :run macros/gdb_mappings.vim<CR>
--------------------------------------------------------------------
设置插件:ctags
安装:1,sudo apt-get install exuberant-ctags
2, 源码下载安装:
$ tar -xzvf ctags-5.6.tar.gz
./configure
$ cd ctags-5.6
$ make
#sudo make install // 需要root权限
使用:
1,在一个工程目录下面: cd /home/alex/test
ctags -R 生成tag文件
2,打开源文件: vim /home/alex/test/src/main.c
在vim编辑器运行命令 :set tags=/home/alex/test/tags (该命令将tags文件加入到vim中来, 你也可以将这句话放到~/.vimrc中去, 如果你经常在这个工程编程.)
3,vim -t main这个命令将打开定义“main”(变量或函数或其它)的文件,并把光标定位到这一行。如果这个变量或函数有多处定义,
Ctrl+ ]跳到光标所在函数或者结构体的定义处
Ctrl+ T返回查找或跳转
shift + k 查看文件中的系统函数定义 pp返回
修改程序后, 比如增加了函数定义, 删除了变量定义, tags文件不能自动rebuild, 你必须手动再运行一下命令:ctags -R 使tags文件更新一下, 不过让人感到欣慰的是vim不用重新启动