我所使用的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向上。

posted @ 2013-01-16 23:29  aicro  阅读(2770)  评论(0编辑  收藏  举报