我所使用的vim环境和快捷键小结

时间:2022-06-29 16:54:06

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