Vim使用(一)——常用技巧及快捷键总结

一、常用配置

普通用户的vim配置在vim ~/.vimrc中,以下是我的常用配置,其他配置可以参考这两篇博客:vim常用设置vim 自动配置

set mouse-=a
syntax on               "语法高亮
set nocompatible        "去除VI一致性,必须要添加
set nu                  "显示行号
set autowrite           "自动保存
set ruler               "打开状态栏标尺
set cursorline          "突出显示当前行
set smartindent         "开启新行时使用智能自动缩进
set hlsearch            "搜索高亮
set incsearch           "渐进式搜索
set nobackup            "不需要备份文件
set noswapfile          "不创建临时交换文件
set nowritebackup       "编辑的时候不需要备份文件
set noundofile          "不创建撤销文件

" Tab键更改为2个空格
"set ts=2
"set sw=2
"set expandtab
"set autoindent

" 配置tags查找路径
set tags=./tags,tags;$HOME

"自动补全
:inoremap ( ()<ESC>i
:inoremap ) <c-r>=ClosePair(')')<CR>
:inoremap { {}<ESC>i
:inoremap } <c-r>=ClosePair('}')<CR>
:inoremap { {<CR>}<ESC>O
:inoremap } <c-r>=ClosePair('}')<CR>
:inoremap [ []<ESC>i
:inoremap ] <c-r>=ClosePair(']')<CR>
:inoremap " ""<ESC>i
:inoremap ' ''<ESC>i
function! ClosePair(char)
    if getline('.')[col('.') - 1] == a:char
        return "\<Right>"
    else
        return a:char
    endif
endfunction

" Vundle插件------------------------
filetype off
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()

Plugin 'gmarik/Vundle.vim'
Plugin 'fatih/vim-go'
Plugin 'scrooloose/nerdtree'
Plugin 'Yggdroot/LeaderF', { 'do': './install.sh' }

call vundle#end()

filetype plugin indent on       "开启插件

set completeopt=longest,menu    "打开文件类型检测, 加了这句才可以用智能补全
" -----------------------------------

"go代码自动补全
imap <C-L> <c-x><c-o>
"查看Interface中方法的实现
map <F5> :GoImplements<cr>
"查看变量或函数被引用的地方
map <F6> :GoReferrers<cr>
"nerdtree显示目录测栏
map <F4> :NERDTree<cr>
"LeaderF输入命令的快捷键
map <C-P> :Leaderf 

"打开文件默认回到上次编辑的地方
"au BufReadPost * if line("'\"") > 0|if line("'\"") <= line("$")|exe("norm '\"")|else|exe "norm $"|endif|endif

二、搜索替换常用方法

/123		#搜索123字符串
/123\c		#不区分大小写搜索123  
/123\>		#搜索以123作为结尾的字符串
/\<123\>	#搜索以123作为开头和结尾的字符串
/123$		#搜索作为行尾的字符串123
/^123$		#搜索作为行首和行尾的字符串123
/123\|456	#同时搜索123和456两个字符串
:s/123//n	#统计光标所在行出现123字符串的个数
:l1,l2s/123//n	#l1~l2行
:%s/123//n		#所有行
:s/123/456/g	#光标所在行的所有123被替换为456
    % 所有行  
    g 单行内所有匹配项(默认只匹配单行第一个) 
    i 忽略大小写  
    c 确认是否替换
    n 只查找个数

三、复制粘贴和删除常用方法

#d是剪切(删除),y是复制,p是粘贴。d和y的结果都可以用p粘贴
dd/yy		#光标所在行
ndd/nyy		#光标所在行开始,向后n行
de/ye		#光标所在字符开始,向右最近一个单词的最后一个字符
db/yb		#光标所在字符上一个字符开始,向左最近一个单词的第一个字符
d0/y0		#光标所在字符上一个字符开始,到所在行首
d$/y$		#光标所在字符开始,到所在行尾
dgg/ygg		#光标所在行开始,到文件首行
dG/yG		#光标所在行开始,到文件尾行
d%/y%		#光标所在括号开始,到匹配括号结束
p			#粘贴到光标所在字符/行的下一位置
P			#粘贴到光标所在字符/行的上一位置

四、多窗口文件处理

#打开多个窗口
vim -O file1 file2		#垂直线分割两个窗口
vim -o file1 file2		#水平线分割两个窗口
vim -O3 file1 file2 	#打开三个,其中一个闲置
:vsplit 或 :vs file		#在窗口中垂直线分割一个新的窗口
:split 或 :sp file		#在窗口中水平线分割一个新的窗口
:Vexplore				#在垂直分割窗口中浏览该目录
:Sexplore				#在水平分割窗口中浏览该目录

#在窗口间移动光标
Ctrl + w + w		#所有窗口中循环移动
Ctrl + w + h		#向左移动
Ctrl + w + j		#向下移动
Ctrl + w + j		#向上移动
Ctrl + w + l		#向右移动

#移动窗口
Ctrl + w + r		#向右或向下方交换窗口
Ctrl + w + R		#向左或向上交换窗口

#改变窗口大小
Ctrl + w + =		#所有窗口调整至相同尺寸(平均划分)
Ctrl + w + -		#当前窗口的高度减少一行,也可在ex命令:resize -n明确指定减少尺寸
Ctrl + w + +		#当前窗口的高度增加一行,也可在ex命令:resize +n明确指定增加尺寸
Ctrl + w + < 		#当前窗口的宽度减少
Ctrl + w + > 		#将当前窗口的宽度增加
Ctrl + w + |		#将当前窗口的宽度调到最大,也可用ex命令:vertical resize n明确指定改变宽度

五、多窗口缓存区

:badd				#增加缓冲区
:ls					#列示缓冲区状态
:buffer/:b file_name/:b number		#编辑指定缓冲区
:ball				#编辑所有缓冲区,多个窗口打开
:bnext/:bn			#到下一个缓冲区
:bprevious/:bp		#到上一个缓冲区
:blast/:bl			#到最后一个缓冲区
:bmodified/:bm		#到修改过的缓冲区
:bdelete/:bd num	#删除缓冲区
:bunload			#卸载缓冲区

六、格式化代码

编辑 vim ~/.vimrc 配置文件,加入以下代码。

filetype plugin indent on

然后就可以使用以下快捷键,进行代码格式化。

gg=G        #全部格式化
==          #对当前行格式化(缩进):
[num]==     #对当前行(包括)以下的num行格式化

#选中格式化
ctrl+v      #转到可视模式,选中代码
=            #将选中的代码格式化

七、修改二进制文件

也可以使用GDB修改二进制文件,在文章《使用GDB(二):调试程序常用命令》中有介绍。两种方式各有优势,看需要选用。

# 打开要修改的二进制文件
vim -b exe-file

# 将文件内容转成16进制,且每行显示16个字节
:%!xxd

# 每行16个字节不好查阅,我一般会让每行显示4个字节
:%!xxd -c 4

# 开始对文件修改!

# 修改完以后将文件转回原来的格式,然后保存退出
:%!xxd -r
:wq

八、大小写转换

命令模式下的gu是将目标转为小写,gU将目标转为大写,具体的用法看下面详细总结。

# 一个单词大小写转换
guw/gUw

# 按行大小写转换
gu1/gU1		# 光标所在行及往下1行 
3gu/3gU		# 光标所在行及往下3行

# 整个文件大小写转换
ggguG/gggUG

# 选中的内容大小写转换
ctrl + v
选中要转换的内容
gu/gU