zoukankan      html  css  js  c++  java
  • 我所使用的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向上。

  • 相关阅读:
    ASP.Net 反射显示
    ASP.Net 反射简单工厂模式
    ASP.Net MVC生成验证码
    ASP.Net EF架构
    ASP.Net 邮箱发送
    ASP.Net 反射简单
    ASP.Net 显示
    新年快乐
    测试开发比
    Linkbot介绍
  • 原文地址:https://www.cnblogs.com/aicro/p/2863555.html
Copyright © 2011-2022 走看看