以后用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向上。