我所使用的vim环境和快捷键小结
以后用vim为主,所以最近转到linux来看看。看到别人使用gvim出神入化,自己也试了一下。主要参考了这么两片文章。
http://bbs.sjtu.edu.cn/bbs0an,path,%2Fgroups%2FGROUP_3%2FGNULinux%2FSoftware%2FD95E89182%2FD5277E56B.html
http://easwy.com/blog/archives/advanced-vim-skills-catalog/
其中第一篇更加容易懂,第二篇更详细也更专业。
1. 我的建议
我在这里给出了我最终的~/.vimrc的内容。可以直接创建这个文件,然后拷贝这里的内容。然后只需要自己编译出gvim之后,去第一篇文章中各个子章节查看插件的下载与安装。另外,针对C++的自动补全需要下载OmniCppComplete,然后解压。ctags的命令是
cd 项目根目录
ctags -R --c++-kinds=+p --fields=+iaS --extra=+q
所有与配置相关的工作我都写在了~/.vimrc中了。另外,在~/.vim/syntax文件夹下,应该有两个文件:c.vim和cpp.cim。通过这两个文件,可以制作高级的语法高亮。我在.vimrc之后给出。两者内容一致。
最后要说的是,我写了一个batch(第一次写,如果挫了点见谅)。作用是用作项目启动时候的加tag和cscope数据库,不用每次都自己做一遍。也会贴在下面。用法是将此文件保存在项目根目录,然后用它来进行启动gvim。可选参数-t表示需要重新打tag,可选参数filename是打开的文件。
" An example for a vimrc file. " " Maintainer: Bram Moolenaar <Bram@vim.org> " Last change: 2008 Jul 02 " " To use it, copy it to " for Unix and OS/2: ~/.vimrc " for Amiga: s:.vimrc " for MS-DOS and Win32: $VIM\_vimrc " for OpenVMS: sys$login:.vimrc " When started as "evim", evim.vim will already have done these settings. if v:progname =~? "evim" finish endif " Use Vim settings, rather then Vi settings (much better!). " This must be first, because it changes other options as a side effect. set nocompatible " allow backspacing over everything in insert mode set backspace=indent,eol,start if has("vms") set nobackup " do not keep a backup file, use versions instead else set backup " keep a backup file endif set history=50 " keep 50 lines of command line history set ruler " show the cursor position all the time set showcmd " display incomplete commands set incsearch " do incremental searching " For Win32 GUI: remove 't' flag from 'guioptions': no tearoff menu entries " let &guioptions = substitute(&guioptions, "t", "", "g") " Don't use Ex mode, use Q for formatting map Q gq " CTRL-U in insert mode deletes a lot. Use CTRL-G u to first break undo, " so that you can undo CTRL-U after inserting a line break. inoremap <C-U> <C-G>u<C-U> " In many terminal emulators the mouse works just fine, thus enable it. if has('mouse') set mouse=a endif " Switch syntax highlighting on, when the terminal has colors " Also switch on highlighting the last used search pattern. if &t_Co > 2 || has("gui_running") syntax on set hlsearch endif " Only do this part when compiled with support for autocommands. if has("autocmd") " Enable file type detection. " Use the default filetype settings, so that mail gets 'tw' set to 72, " 'cindent' is on in C files, etc. " Also load indent files, to automatically do language-dependent indenting. filetype plugin indent on " Put these in an autocmd group, so that we can delete them easily. augroup vimrcEx au! " For all text files set 'textwidth' to 78 characters. autocmd FileType text setlocal textwidth=78 " When editing a file, always jump to the last known cursor position. " Don't do it when the position is invalid or when inside an event handler " (happens when dropping a file on gvim). " Also don't do it when the mark is in the first line, that is the default " position when opening a file. autocmd BufReadPost * \ if line("'\"") > 1 && line("'\"") <= line("$") | \ exe "normal! g`\"" | \ endif augroup END else set autoindent " always set autoindenting on endif " has("autocmd") " Convenient command to see the difference between the current buffer and the " file it was loaded from, thus the changes you made. " Only define it when not defined already. if !exists(":DiffOrig") command DiffOrig vert new | set bt=nofile | r # | 0d_ | diffthis \ | wincmd p | diffthis endif "Set mapleader let mapleader = " " "When .vimrc is edited, reload it autocmd! bufwritepost .vimrc source ~/.vimrc """""""""""""""""""""""""""""" " for cscope """"""""""""""""""""""""""""""" if has("cscope") set csprg=/usr/bin/cscope set csto=1 set cst set nocsverb " add any database in current directory if filereadable("cscope.out") cs add cscope.out endif set csverb endif " use cscope in quickfix "set cscopequickfix=s-,c-,d-,i-,t-,e- 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> """""""""""""""""""""""""""""" " some basic settings """""""""""""""""""""""""""""" syntax on syntax enable colorscheme desert set tabstop=4 " 设置tab键的宽度 set shiftwidth=4 " 换行时行间交错使用4个空格 set autoindent " 自动对齐 set backspace=2 " 设置退格键可用 set smartindent " 智能对齐方式 set ai! " 设置自动缩进 set nu! " 显示行号 set showmatch " 设置匹配模式,类似当输入一个左括号时会匹配相应的那个右括号 set ruler " 在编辑过程中,在右下角显示光标位置的状态行 set incsearch " 查询时非常方便,如要查找book单词,当输入到/b时,会自动找到 " 第一个b开头的单词,当输入到/bo时,会自动找到第一个bo开头的 " 单词,依次类推,进行查找时,使用此设置会快速找到答案,当你 " 找要匹配的单词时,别忘记回车 set vb t_vb= " vim进行编辑时,如果命令错误,会发出一个响声,该设置去掉响声 """""""""""""""""""""""""""""" " for taglist """""""""""""""""""""""""""""" let Tlist_Show_One_File=1 let Tlist_Exit_OnlyWindow=1 "use F9 to open taglist only map <silent> <F9> :TlistToggle<cr> """""""""""""""""""""""""""""" " for use of taglist, press [F9] to toggle taglist """""""""""""""""""""""""""""" let g:winManagerWindowLayout='FileExplorer|TagList' nmap wm :WMToggle<cr> """"""""""""""""""""""""""""" " check the file type automatically """"""""""""""""""""""""""""" filetype plugin indent on """""""""""""""""""""""""""""" " set the encoding at last """""""""""""""""""""""""""""" if has("gui_running") set langmenu=zh_CN.UTF-8 source $VIMRUNTIME/delmenu.vim source $VIMRUNTIME/menu.vim language messages zh_CN.utf-8 endif """"""""""""""""""""""""""""""" " MiniBuf """"""""""""""""""""""""""""""" "<C-Tab> 向前循环切换到每个buffer上,并在但前窗口打开 "<C-S-Tab> 向后循环切换到每个buffer上,并在但前窗口打开 let g:miniBufExplMapCTabSwitchBufs=1 "用<C-h,j,k,l>切换到上下左右的窗口 let g:miniBufExplMapWindowNavVim=1 "用<C-箭头键>切换到上下左右窗口中 let g:miniBufExplMapWindowNavArrows=1 let g:miniBufExplModSelTarget=1 """""""""""""""""""""""""""""""" " .cpp <-> .h """""""""""""""""""""""""""""""" nnoremap <silent> <F11> :AS<CR> "上下分屏看.h文件 nnoremap <silent> <F12> :AV<CR> "左右分屏看.h文件 """""""""""""""""""""""""""""""" " 智能补全 """""""""""""""""""""""""""""""" set completeopt=longest,menu let g:SuperTabRetainCompletionType=2 let g:SuperTabDefaultCompletionType="<C-X><C-O>" set nocp let OmniCpp_GlobalScopeSearch = 1 " 0 or 1 let OmniCpp_NamespaceSearch = 1 " 0 , 1 or 2 let OmniCpp_DisplayMode = 1 let OmniCpp_ShowScopeInAbbr = 0 let OmniCpp_ShowPrototypeInAbbr = 1 let OmniCpp_ShowAccess = 1 let OmniCpp_MayCompleteDot = 1 let OmniCpp_MayCompleteArrow = 1 let OmniCpp_MayCompleteScope = 1
下面是c.vim和cpp.vim的内容,两者一致。
"======================================================== " Highlight All Function "======================================================== syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>[^()]*)("me=e-2 syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>\s*("me=e-1 hi cFunction gui=NONE guifg=#B5A1FF "======================================================== " Highlight All Math Operator "======================================================== " C math operators syn match cMathOperator display "[-+\*/%=]" " C pointer operators syn match cPointerOperator display "->\|\." " C logical operators - boolean results syn match cLogicalOperator display "[!<>]=\=" syn match cLogicalOperator display "==" " C bit operators syn match cBinaryOperator display "\(&\||\|\^\|<<\|>>\)=\=" syn match cBinaryOperator display "\~" syn match cBinaryOperatorError display "\~=" " More C logical operators - highlight in preference to binary syn match cLogicalOperator display "&&\|||" syn match cLogicalOperatorError display "\(&&\|||\)=" " Math Operator hi cMathOperator guifg=#3EFFE2 hi cPointerOperator guifg=#3EFFE2 hi cLogicalOperator guifg=#3EFFE2 hi cBinaryOperator guifg=#3EFFE2 hi cBinaryOperatorError guifg=#3EFFE2 hi cLogicalOperator guifg=#3EFFE2 hi cLogicalOperatorError guifg=#3EFFE2
下面是我写的batch,用于启动某个文件。第一次使用实例 $ ./startup -t test.cpp。
#!/bin/bash # FileName: Startup # Author: Ai Zhijie # Date: 1/28/2013 # Contact:aicrosoft1104@gmail.com # Purpose # this script is used for startup a project by gvim. # it will re-ctags and re-cscope the current project. # you can revise the variables blow to change the default behavior. # usage # $: startup [-t] [start_up_file_name] # if -t is identified, tags will be regenerated. By default, it will not be identified. # if the start_up_file_name does not identified, no file will be loaded. #if you donot want the shell to be printed, use 'set +x' set +x #set -x ################################ # declaration of variables ################################ # current location CURRENT_DIR=`pwd` # directions for placing tags DEFAULT_DIR_FOR_TAGS="`pwd`/AllTags" #DEFAULT_DIR_FOR_TAGS="`pwd`" # need to re-ctags? NEED_RE_CTAGS=0 # previous tags location PREVIOUS_TAG_LOC=$DEFAULT_DIR_FOR_TAGS # parameters for ctags calling PARA_FOR_CTAGS="-R --languages=c++ --c++-kinds=+px --fields=+aiKSz --extra=+q" # need to re-cscope? NEED_RE_CSCOPE=0 # previous scope related location PREVIOUS_SCOPE_LOC=$DEFAULT_DIR_FOR_TAGS # parameters for cscope calling PARA_FOR_CSCOPE="-Rbq" # user-defined .vimrc OLD_VIMRC=~/.vimrc TMP_VIMRC=~/.vimrc.bak # the first file to start START_FILE="" #the root directory of the project WORKING_DIRECTORY=$CURRENT_DIR ####################################### # useful functions ###################################### function MakeDirIfNeed() { if [ ! -d $1 ]; then mkdir -p $1 fi } function DeleteAllFiles() { if [ -d $1 ]; then pushd $1 for file in $2; do rm -f $file done popd fi } ###################################### # check parameters ###################################### while getopts 't' OPT; do case $OPT in t) NEED_RE_CTAGS=1 NEED_RE_CSCOPE=1;; ?) echo "Unknown parameters" esac done shift $(($OPTIND - 1)) if [ "$#" -eq "1" ]; then START_FILE=$1 fi ################################ # check for ctags and cscope ################################ if [ "$NEED_RE_CTAGS" -eq "1" ]; then $DeleteAllFiles $PREVIOUS_TAG_LOC "ls | grep tags" # re-ctags ctags $PARA_FOR_CTAGS MakeDirIfNeed $DEFAULT_DIR_FOR_TAGS mv tags $DEFAULT_DIR_FOR_TAGS fi if [ "$NEED_RE_CSCOPE" -eq "1" ]; then $DeleteAllFiles $PREVIOUS_TAG_LOC "ls | grep tags" # re-cscope cscope $PARA_FOR_CSCOPE MakeDirIfNeed $DEFAULT_DIR_FOR_TAGS for file in `ls | grep cscope.`; do mv $file $DEFAULT_DIR_FOR_TAGS done fi ################################## # copy the original .vimrc and cat tags ################################## cp -f $OLD_VIMRC $TMP_VIMRC if [ -f $DEFAULT_DIR_FOR_TAGS/tags ]; then echo set tags=$DEFAULT_DIR_FOR_TAGS/tags >> $OLD_VIMRC fi if [ -f $DEFAULT_DIR_FOR_TAGS/cscope.out ]; then echo cs add $DEFAULT_DIR_FOR_TAGS/cscope.out $CURRENT_DIR >> $OLD_VIMRC fi ################################### # start gvim with specified file ################################### gvim -f $START_FILE ################################### # if gvim has been closed, restore the old vimrc ################################### if [ -f "$TMP_VIMRC" ]; then cp $TMP_VIMRC $OLD_VIMRC unlink $TMP_VIMRC fi
2. 如何编译vim和gvim
1. 编译gvim时一定要对cscope进行支持
先去下载好vim源代码,http://www.vim.org/ 。
1)去src\makefile下查找cscope,会有一句让你uncomment的话,让这句uncomment
2)以root身份编译安装
注意修改下面的vim7x为自己的版本
$ cd vim7x
$ ./configure --prefix=/usr/local/vim7x --with-x --enable-gui=gtk2 --with-features=big --enable-cscope
$ make
$ make install
3) 将vim安装到系统中去
# mv /usr/bin/vim /usr/bin/vimOld # 先将原来的vim 改名
注意修改下面的vim7x为自己的版本
# ln -s /usr/local/vim7x/bin/vim /usr/bin/vim # 再将vim 7.x链接过来
# ln -s /usr/local/vim7x/bin/gvim /usr/bin/gvim # 再将gvim 7.x链接过来
注意:一定在装完之后看看vim --version | grep cscope看看cscope这项是不是“+”。如果不是则说明这里用的vim并不是我们刚才编译的vim。
解决办法是echo $PATH,然后把其中的所有文件夹都看一下有没有vim活着vim的软链接,全部删除之后,再做一下make install和后面的创建软链接的过程。
3. 根据上面的.vimrc的快捷键一览
1)基本的vim快捷键(可能不全)
(1) 移动
h,j,k,l 或者方向键
(2) 编辑
i(insert), a(append), r(replace一个字符)
I(在行首插入), A(行末append), R(replace多个字符)
c(change) + d(整行)
+ w(整词带空格)
+ e( 整词不带空格)
o 在光标行所在行下一行输入
O 在光标行所在行上一行输入
(3) 删除
x(删除光标所在字符)
d(delete) + d(整行)
+ w(整词带后续空格)
+ e(整词不带后续空格)
3dd 表示删除光标所在行及后续2行
(4) 撤销操作
u 撤销刚才的一个操作
U 将光标行所在行还原到原样。(打开文件时?)
(5) 搜索
/ (正向搜索) + 搜索字符
按下回车后,n表示下一个,N表示上一个
? (逆向搜索) + 搜索字符
(6)跳转
G (跳转到文末)
数字 + G(跳转到所指定行)
(7)替换
s/old/new 替换本行第一个old
s/old/new/g 替换本行所有的old
#,# s/old/new/g 替换指定行之间的所有的old (需要先进入“:”模式,如果需要表示行尾,使用 "$")
(8) 文件打开关闭操作
q! (不保存关闭)
w (保存文件)
w + 文件路径(另存为)
#,# w + 文件路径(将本文件的指定行保存到指定路径)
(9)外部命令
!ls 执行ls(只需注意前面的!)
(10) 剪贴,复制和黏贴
p 黏贴(在光标所在行下一行黏贴之前剪贴(vim中删除其实就是剪贴),复制的内容)
ndd 剪贴光标所在行及后续(n-1)行
类似有dw,de都可以表示剪贴
nyy 复制光标所在行及后续(n-1)行
类似有yw, ye等
(11) 多行选择与多行操作
在gvim下,进入“可视”状态(普通状态下按下v),然后通过使用“方向键/jklh”健,选择行,使用“shift+方向键/hjkl”健选择到末尾。
可以通过使用ctrl+q的方式来选择“已选择行的到目前光标的垂直对齐”。
如此一来,选中的部分就是新的编辑区域,可以通过i,shift+i进行插入,y进行复制,x进行剪贴,d表示删除等功能。
实例:利用多行选择添加和删除注释符号
添加注释:
在通常模式下,按 v 进入可视模式,向下或向上移动光标,选择需要注释的行,然后按ctrl+q,将行头标记起来。
接着就可以进行插入工作了,插入的部分就是选中的所有部分,按大写的I(shift+i)(这样插入的部分就是所有选中行的行首),再插入注释符,比如"//",再按Esc,就会全部注释了。
删除注释:
在通常模式下,按 v 进入可视模式,向下或向上移动光标,选择需要去掉注释的行,然后按ctrl+q使得只选中行头包含注释符号的部分,将行头标记起来,接着按d,就会删除全部注释了。
2. 和插件有关的快捷键(按照我的~/.vimrc的设定)
(1)函数,变量,宏定义查询(需要有ctag,和cscope支持,此二者看第一篇文章相关内容)
分屏看光标所在名字的变量、函数声明 ctrl+w+}
对于系统调用,可以使用:psearch popen等
高亮局部变量 gd(仅在当前scope)
高亮局部变量及本文件全局static 变量 gD
高亮全局变量 [I
(2) 增加头文件查找范围(可以直接写在~/.vimrc中)
:set path+=/usr/local/inc
:set path+=/usr/*/inc 只一层模糊查找,即inc一定在第三层中
:set path+=/usr/**/inc 可以多层层模糊查找,即inc可以在第二,三,四...层中
(3)分屏操作
分屏移动 ctrl+h/j/k/l
关闭分屏 :q等操作
(4) taglist
【F9】 打开与关闭,然后分屏操作即可
在taglist窗口中,x变化大小,s变化排列方式(按照名字,按照字母顺序)
(5) winmanager(文件浏览器)
NORMAL模式下按下wm,打开taglist和wm
(6) cscope查找函数定义等
建立cscope数据库 1.去目标数据库,2.cscope -Rbq
将vim与cscope数据库相连:
:cs add /home/wooin/vim71/cscope.out /home/wooin/vim71 (红色部分替换成自己的目录)
ctrl+@+g 定义
ctrl+@+s 所有有这个符号的地方
ctrl+@+c 调用本函数的函数
(7) 操作多个文件
通过winmanager打开多个文件后,到上面的窗口中,使用tab或者shift+tab来控制,再回车。
(8).cpp<->.h
[F11] 上下分屏显示
[F12] 左右分屏显示
(9)书签
打上书签 ctrl + 【F2】
书签之间正想走 【F2】
书签之间反向走 shift +【F2】
(10) 打tag与将tag文件与vim关联
去你的源码目录, 如果你的源码是多层的目录, 就去最上层的目录, 在该目录下运行命令: ctags -R (仅C语言)
再在vim中运行命令
:set tags=/home/wooin/vim71/tags
(11) 智能补全
打出clue之后,打击tap来进行提示,提示框的移动是Ctrl+N向下,Ctrl+P向上。
------------------------------------------------------------------------
email : aicrosoft1104@126.com
吃遍天下。