vim 使用

vim有三种模式:输入模式,命令模式,底行模式,使用esc进入命令模式,在命令模式下按英文的冒号,进入底行模式;命令行模式下按i进入输入模式。vim编辑文件是将文件内容复制到缓冲区显示在屏幕上。

vim的启动

输入vim命令后,便进入全屏幕编辑环境,此时的状态为命令模式。

vim            进入vim的一个临时缓冲区,光标定位在该缓冲区第1行第1列的位置上
vim file1        如果file1文件不存在,将建立此文件;如该文件存在,则将其拷贝到一个临时缓冲区。光标定位在该缓冲区第1行第1列的位置上
vim + file1        (有+号)光标定位在文件最后1行第1列的位置上。如果file1文件不存在,将建立此文件;如该文件存在,则将其拷贝到一个临时缓冲区
vim +N file1(N:为数字)        光标定位在文件第N行第1列的位置上。如果file1文件不存在,将建立此文件;如该文件存在,则将其拷贝到一个临时缓冲区
vim +/string file1        如果file1文件不存在将建立此文件;如该文件存在则将其拷贝到一个临时缓冲区。光标定位在文件中第一次出现字符串string的行首位置
vim file1 file2..    依次编辑文件
vim -r file        上次使用vim时系统崩溃,则恢复文件
vim -R file        以只读方式打开文件,但可以强制保存
vim -M file        以只读的方式打开文件,不可以强制保存
vimdiff file1 file2        比较编辑两个不同的文件
vim -x file        编辑的文件加密,会提示输入密码
vim -c cmd file    在打开文件前,先执行指定的命令
vim dir/        使用 netrw 打开目录选择文件编辑
vim -b file.bin    告诉 vim 编辑的是二进制文件,区别是不自动在文件尾加换行符(0x0a)
vim a.tar.gz
vim a.zip

退出vim(底行模式(last line mode))

建议在退出vim前,先按ESC键,以确保当前vim的状态为命令方式,然后再键入“:”(冒号),输入下列命令,退出vim

:x            保存后退出
ZZ            保存后退出
ZQ            强制退出,不保存
:saveas path_file    另存为 path_file
:w            将缓冲区内容写入文件,即将编辑的内容写入原文件中
:w filename        存入指定文件
:q            将编辑缓冲区的内容写入文件,则新的内容就替代了原始文件。这时并没有退出vim,必须进一步输入下述命令才能退出vim
:q!            强制退出;使被更新的内容不写回文件中。仅键入命令:q时,如vim发现文本内容已被更改,将提示用户使用“ :q ”命令退出
:wq            先执行w,后执行q
:qa            多屏时全部退出

vimrc配置设置

在启动vim时,当前用户根目录下的.vimrc文件会被自动读取,该文件可以包含一些设置和脚本,其注释是使用英文的双引号。所以,一般情况下把.vimrc文件创建在当前用户的根目录下比较方便,这个文件有些linux发行版中没有,需要自己创建,创建的命令为 $vim ~/.vimrc    ;or /etc/vimrc ;设置完后,进入底行模式,输入“ :x ”保存退出。所有的这些设置都可以在编辑时在底行模式中改变。查询系统是否安装了 vim-enhanced 包,没有安装软件这些配置将不起作用, $rpm –qa vim-enhanced。


我的配置

set nocompatible
set nu
set completeopt=longest,menu
set nobackup
set fileformat=unix
set history=1000
set background=dark
set autoindent
set smartindent
set tabstop=4
set shiftwidth=4
set showmatch
set guioptions-=T
set vb t_vb=
set ruler
set nohls
set incsearch
set showcmd
set statusline+=%f            "在状态栏显示文件名

set fileencodings=utf-8,gb2312,gbk,gb18030
set termencoding=utf-8
set encoding=utf-8
set fileencoding=utf-8

colorscheme desert
syntax on
"set cindent
"set encoding=prc
"set mouse=a
"set mouse=v
"set selection=exclusive
"set selectmode=mouse,key

helptags ~/.vim/doc
filetype plugin indent on

"自动补全括号
"iab ( ()
"iab { {}

:vmap <F5> :s#^#//#<CR>        "注释一行
:vmap <F6> :s#^//##<CR>        "取消注释

:map <F7> :set nu<CR>        "添加行号
:map <F8> :set nonu<CR>

:map <F9> :set paste<CR>        "粘贴模式
:map <F10> :set nopaste<CR>

nnoremap <leader>1 :set filetype=xhtml<CR>          "解决 html css 中缩进问题
nnoremap <leader>2 :set filetype=css<CR>  
nnoremap <leader>3 :set filetype=javascript<CR>  
nnoremap <leader>4 :set filetype=php<CR>

let g:html_indent_inctags = "body,head,tbody"         " 缩进body head
let g:html_indent_script1 = "inc"        "缩进<script>标签
let g:html_indent_style1 = "inc"        "缩进<style>标签
au FileType html setlocal autoindent indentexpr=        "取消vim对html标记自动产生的缩进,但打开自动缩进选项

:command! -nargs=1 Rename let tpname = expand('%:t') | saveas <args> | edit <args> | call delete(expand(tpname))        "重命名文件 Rename filename(自定义命令首字母要大写)

正则表达式

$                    匹配行尾
^                    匹配行首
<                    匹配单词词首
>                    匹配单词词尾

|                    或操作符
&                    与操作符

.                    匹配任意一个字符
*                    匹配0-任意个
+                    匹配1-任意个
?                    匹配0-1个
{n,m}                匹配n-m个
{-n,m}                与{n,m}一样,尽可能少次数地重复
{n}                    匹配n个
{n,}                    匹配n-任意个
{,m}                    匹配0-m个
\_.                    匹配包含换行在内的所有字符
{-}                    表示前一个字符可出现零次或多次,但在整个正则表达式可以匹配成功的前提下,匹配的字符数越少越好
=                    匹配一个可有可无的项
\_s                    匹配空格或断行
\_[]

*                    匹配 * 字符
.                    匹配 . 字符
/                    匹配 / 字符
\                    匹配  字符
[                    匹配 [ 字符


[abc]                    匹配方括号中的任意一个字符。可以使用-表示字符范围,如[a-z0-9]匹配小写字母和阿拉伯数字
[^abc]                    在方括号内开头使用^符号,表示匹配除方括号中字符之外的任意字符
d                    匹配阿拉伯数字,等同于[0-9]
D                    匹配阿拉伯数字之外的任意字符,等同于[^0-9]
x                    匹配十六进制数字,等同于[0-9A-Fa-f]
X                    匹配十六进制数字,等同于[^0-9A-Fa-f]
w                    匹配单词字母,等同于[0-9A-Za-z_]
W                    匹配单词字母之外的任意字符,等同于[^0-9A-Za-z_]
*	                    匹配 <TAB> 字符
s                    匹配空白字符,等同于[ 	]
S                    匹配非空白字符,等同于[^ 	]
a                    所有的字母字符. 等同于[a-zA-Z]
l                    小写字母 [a-z]
L                    非小写字母 [^a-z]
u                    大写字母 [A-Z]
U                    非大写字母 [^A-Z]

替换变量:在正规表达式中使用 ( 和 ) 符号括起正规表达式,即可在后面使用1、2等变量来访问 ( 和 ) 中的内容。

函数式
:s/替换字符串/=函数式
在函数式中可以使用 submatch(1)、submatch(2) 等来引用 12 等的内容,而submatch(0)可以引用匹配的整个内容。


实例:
:%s/s+$//                    去掉所有的行尾空格
:%s/(s*
)+/
/            去掉所有的空白行
:%s#s*//.*##                去掉所有的“//”注释,即去掉所有的//
:%s#s*/*\_.{-}*/s*##g        去掉所有的“/* */”注释
:g/^s*$/d                    删除只有空白的行
:s/(w+)s+(w+)/2	1        将 data1 data2 修改为 data2 data1
:%s/(w+), (w+)/2 1/        将 Doe, John 修改为 John Doe
:%s/<id>/=line(".")            将各行的 id 字符串替换为行号
:%s/(^<w+>)/=(line(".")-10) .".". submatch(1)       将每行开头的单词替换为(行号-10).单词的格式,如第11行的word替换成1. word
:/OB/+1,$!sort                排序 
:n,m sort                    排序 n,m 行
:%s/<[^>;]*>;//g                去掉html的的标记


转义字符                    似乎 vim 中的转义符与其它的工具有些差异


                         匹配 <CR> 键

                         匹配行末

编辑模式

编辑模式


ctrl  p                    自动补全,向上搜索匹配词,在 vim 打开的所有文档中查找,不断输入命令会循环查找
ctrl  x  f                    补全文件名
ctrl  x  l                    自动补齐正行文本,仅在本窗口出现的文档中匹配

命令模式

h            向左移动一个字符
l            向右移动一个字符
j            向下移动一行
k            向上移动一行
w            将光标移到下一个单词的开头
W            移到下一个字的开头,忽略标点符号
b            光标回到上个 word 的第一个字母
fa            移到下一个 a 字符处
nfa
Fa
t,            移到逗号前的字符
Ta        
B            移到前一个字的开头,忽略标点符号 BACK
e            将光标移到下一个单词的结尾
E            移到下一个字的结尾,忽略标点符号 END
J                合并光标所在行及下一行为一行(依然在命令模式)
gg            光标回到文件首部
ngg            跳到第n行
GG            光标到文件最后一行首部
gf            打开当前光标所在word的文件,没有这个文件则创建他。注意要先保存所作的更改
0            到本行头
$            到文行末
n+            光标下移n行
n-            光标上移n行
H            光标移动到屏幕顶行
M            光标移动到屏幕中间
L            光标移动到屏幕最后一行
zt            把当前行置于屏幕顶端
z.            把当前行至于屏幕中间
zb            把当前行至于屏幕底端
''                   移动光标到上一个标记处
'.                移动光标到上一次的修改行
`.              移动光标到上一次的修改点
50%            光标置于文件中间
ctrl  J        跳转到当前光标所在单词对应的主题
ctrl  O        回到前一个光标的位置
[[            光标移到文件开始位置
]]            光标移到文件结尾
(            光标移动到句首,以一个空白行分隔判断段落
)            光标移动到句尾
{            光标移动到段落开头,以一个空白行判断段落
}            光标移动到段落结尾


gd            跳转到局部变量的定义处;
gD            跳转到全局变量的定义处,从当前文件开头开始搜索;
g;            上一个修改过的地方;
g,            下一个修改过的地方;
[[            跳转到上一个函数块开始,需要有单独一行的{。    
]]            跳转到下一个函数块开始,需要有单独一行的{。
[]            跳转到上一个函数块结束,需要有单独一行的}。
][            跳转到下一个函数块结束,需要有单独一行的}。
[{            跳转到当前块开始处;
]}            跳转到当前块结束处;
[/            跳转到当前注释块开始处;
]/            跳转到当前注释块结束处;
%            不仅能移动到匹配的(),{}或[]上,而且能在#if,#else, #endif之间跳跃。


%            括号匹配,移动到匹配的括号上,光标必须在括号上,匹配括号移动,包括 “ (, {, [ ”
*            搜索匹配光标当前所在的单词,移动光标到下一个单词
#            搜索匹配光标当前所在的单词,移动光标到上一个单词
nfx            在当前行查找光标后第n个x(一般直接fx)

模式转换
a                在当前光标位置的右边添加文本
A                在当前行的末尾位置添加文本
i                在当前光标位置的左边添加文本
I                在当前行的开始处添加文本(非空字符的行首)
o                在当前行的下面新建一行
O               在当前行的上面新建一行
R                替换(覆盖)当前光标位置及后面的若干文本,相当于插入
s            删除当前的字符后进入输入模式

cw            删除当前word并进入输入模式
ncw             删除当前word开始的n个word后进入输入模式
cc            删除当前行后进入输入模式
ncc            删除当前行开始的n行后进入输入模式


复制 删除(剪切) 粘贴 恢复

u                撤销
ctrl  r          恢复,只对u有效
U                撤销对光标所在那一行所做的修改
x                删除光标所在的字符
nx               删除从光标开始的n个字符
X            删除光标之前(其左边)的一个字符
r                修改光标所在的字符,按一下,再按想输入的字符
J                合并两行

d            删除可视区域的内容
dd               删除当前行
dfa            删除当前字符直到第一个a字符
dt"            删除所有的内容,直到遇到双引号
ndd              向下删除当前行在内的n行
dw            删除一个词和它后面的空格,将光标放置到该词的开头
ndw            删除光标及光标后的n个word
d^            删除行中光标前面的字符
d$            删除行中光标及其右边的字符
d0            同d^
D            同d$    
dG            删除包含当前行到文件尾的内容
ggdG            删除整个文件

nyl            复制当前n个字符
y2fa            复制当前字符直到第二个a字符
y0            复制当前光标到行首的内容
y$            复制当前光标到行末的内容
yG            复制当前行到最后一行
yy               当前行复制到缓存区,也可以用   ayy 复制,  a 为缓冲区,a也可以替换为a到z的任意字母,可以完成多个复制任务
yw            复制当前光标处的单词
nyy              将当前行向下n行复制到缓冲区,也可以用   anyy 复制,  a 缓冲区,a也可以替换为a到z的任意字母,可以完成多个复制任务
yw               复制从光标开始到词尾的字符            
nyw             复制从光标开始的n个单词
y^               复制从光标到行首的内容
y$               复制从光标到行尾的内容

guw            光标下的单词变为小写
gUw            光标下的单词变为大写
~            大小写转换

xp            左右交换光标处两字符的位置
p            粘贴到当前光标后面
P            粘贴到当前光标前面

ga            显示光标下的字符在当前使用的encoding下的内码

宏
.            重复上一个编辑动作
qx            记录底行模式下输入的命令,并列表呈现出来
q            停止录制
@x            播放宏a
@@            播放最近的宏

zf            创建折叠的命令(需加方向键),可以在一个可视区域上使用该命令
zd            删除当前行的折叠
zD            删除当前行的折叠
zfap            折叠光标所在的段
zo            打开折叠的文本,空格也可以
zc            收起折叠
za            打开/关闭当前折叠
zr            打开嵌套的折行
zm            收起嵌套的折行
zR(zO)        打开所有折行
zM(zC)        收起所有折行
zj            跳到下一个折叠处
zk            跳到上一个折叠处
zi            enable/disable fold

=            使用v选定代码后,按'='会自动缩进代码
>                       输入此命令则光标所在行向右移动一个tab
>            使用v选定代码后,按'>'会将代码整体右移
5>>                     输入此命令将光标在内的5行向右移动一个tab

v            可视模式,单个字符
V                可视模式,行,可以选择连续的多个行
ctrl  v           可视模式,列

ctrl  l            刷新屏幕

自动补全
ctrl   p            向上搜索匹配词    
ctrl   n            向下

移动
ctrl  e            光标向下卷一行
ctrl  y            光标向上卷一行

翻页
ctrl  u            光标向下卷半页
ctrl  d            光标向上卷半页
ctrl  f            光标向下卷一页
ctrl  b            光标向上卷一页

ctrl  q            挂起时使用
ctrl  z        暂时挂到后台

ctrl  ]        跳到函数定义的地方
ctrl  g        显示文件名,当前光标所在行的行号,总的行数,以及当前行所在文件中的百分比和当前光标所在的列的信息,同':f'

ctrl  w             窗口切换,连按两下,按方向键
ctrl  w  s        上下分割当前打开的文件
ctrl  w  v        左右分割当前打开的文件
ctrl  w  c        关闭当前窗口
ctrl  w  q        关闭当前窗口,如果只剩最后一个了,则退出Vim
ctrl  w  h        把光标移到左边的屏
ctrl  w  H        屏幕向左移动
ctrl  w  j        把光标移到下边的屏
ctrl  w  J        屏幕向下移动
ctrl  w  k        把光标移到上边的屏
ctrl  w  K        屏幕向上移动
ctrl  w  l        把光标移到右边的屏
ctrl  w  L        屏幕向右移动
ctrl  w  =        让所有的屏都有一样的高度
ctrl  W  +        要扩大窗口
ctrl  W  -        要缩小窗口

底行模式

向前操作时不包括当前光标处的字符或word,向后操作时则包含当前

/word                向下搜索word,n和N表示在同一方向重复上次的搜索命令
?word                向上搜索word

底行的正则
^                表示头(可用'0'代替)
$                 表示尾

跳到某一行
:行号

:e                重新载入,类似刷新,edit
:e!                放弃此次修改,重新载入该文件
:e other_file           编辑filename为other_filename的文件
:e ++enc=utf8 file    让vim用utf-8的编码打开这个文件
:w ++enc=gbk        不管当前文件什么编码,把它转存成gbk编码
:e ++ff=dos filename        让vim用dos格式打开这个文件。
:w ++ff=mac filename        以mac格式存储这个文件。


替换 删除 复制            vim删除时会将删掉的内容复制到剪切板,使用下面语句时建议不使用'/'而使用'#'
:% s/old/new           用new替换每一行中首次出现的old
:% s/old/new/g        用new替换行中所有的old
:% s/old/new/gc        全文替换并让用户确认
:% s/s+$//        去掉所有的行尾空格,'s'表示空白字符,'+'表示匹配一次或多次,'$'表示匹配到行尾
:%s/s∗ +/ /        去掉所有的空白行
:%s!s*//.*!!        去掉所有的“//”注释
:%s!s*/*\_.{-}*/s*!!g        去掉所有的“/* */”注释
:%s+/<love/>+&+g        完全匹配"love"的单词有多少,用自己替换自己计算出出现的次数,用'+'代替'/'
:%s= *$==            将所有行尾多余的空格删除
:g/^s*$/d            将所有不包含字符(空格也不包含)的空行删除
:#,# s/old/new/gc        //这条命令作用不确定
:n,m s/old/new/gc        用new替换从n到m行里所有的old,每替换一次进行提醒
:n,m copy 10            拷贝n到m行到第10行下面。co
:n,m d                删除n到m行,包含第n行和第m行
:,24y                复制当前光标所在行到24行
:d 12                删除包含光标所在行在内的12行
:n,m move 10            移动n到m行到10行下面。m    
:s/string/^M/        ^M由 ctrl  V 和 ctrl  M 获得,将字符替换成换行符
:s/string/ /g        将 string 换为换行符


:!cmd                执行终端命令
:r !command            将终端命令输出添加到当前行
:% !command            用终端命令输出替换当前文件内容

:%!xxd                 将文件转换为十六进制, -b 选项转换为二进制,不可以多次转换
:%!xxd -r             将十六进制文件转换为文本

:w !sudo tee %        以普通用户身份打开的vim,修改后以root身份保存
:f                显示文件名,当前光标所在行的行号,总的行数,以及当前行所在文件中的百分比和当前光标所在的列的信息
:f file            生成一个内容为当前缓冲区的新的file文件,如果之前打开过文档,则对其不做任何改动。
:X                加密文件


:cat -n filename
:awk ‘{print $1}’ a.txt > b.txt
:bd                移出buffer,会使得当前编辑的文件移出内存,编辑新的为命令的文件,这样做意义不大

:sh                   执行shell命令
:exit
:abbr sprt System.out.println        缩写命令,相当于定义宏
:ab

:r filename            复制指定文件的内容当光标所在处
:vim filename -r        恢复文件
:w! newfilename        另存为

: 12,24>                      此命令将12行到14行的数据都向右移动一个tab
: 12,24>>                 此命令将12行到14行的数据都向右移动两个tab


:args                显示编辑名单中的各个文件名列表
:edit ++enc=gbk        强制使用gbk编码打开文件,当vim打开文件编码错误时可以使用
:map                列出当前已定义的映射
:Sex                水平分割一个窗口,浏览文件系统,用enter键选择文件
:Vex                垂直分割一个窗口,浏览文件系统
:jumps            列出关于你曾经跳转过的位置的列表,你最近一个跳转的位置被特别以一个”>”号标记
:mark a            设置标记a,使用d'a删除光标到标记的内容,y'a将其复制到剪切版
:marks            列出自定义的标记,包含VIM内部自定义的标识
:only                    只留下当前编辑的窗口,关闭其他的编辑窗口
:iab ( ()            自动补全括号
:%!nl                要对包含空行的所有行进行编号(所有行之前插入行号^I)
:version            显示VIM版本信息,包含特性、编译方式及配置文件目录
:n1,n2 w! command        将文件中n1行至n2行的内容作为command的输入并执行之,若不指定n1,n2,则表示将整个文件内容作为command的输入(注意空格)例如  :1,4 w! grep tom
:options            打开一个新窗口, 在该窗口的最开头的注释下面是一个选项列表
:autocmd!            删除之前的自动命令
:runtime! syntax/2html.vim        转换成 html, 会按照你的颜色配置来转
:g/^/exec "s/^/".strpart(line(".")." ", 0, 4)        在行首插入行号
:filetype on        侦察文件类型
:filetype plugin on    载入文件类型插件
:filetype indent on    为特定文件类型载入相关缩进文件


:set all            显示所有的设置项
:set ai                      设置自动缩进
:set ic                忽略大小写
:set ignorecase            搜索中忽略大小写
:set noic            
:set selection=exclusive
:set selectmode=mouse,key    可以使用鼠标定位
:set mouse=v            可视模式下启用鼠标
:set mouse=a            完全启用鼠标
:set mouse=                关闭鼠标
:set nocompatible              不兼容 vi ,默认兼容
:set nowrapscan                禁止在搜索到文件两端时重新搜索
:set hlsearch                  搜索时高亮显示被找到的文本
:set nohls                取消搜索高亮
:nohl                取消高亮
:set incsearch            即时搜索
:colorscheme desert          颜色设置,vim的配色方案在/usr/share/vim/vim74/colors 中
:set gdefault            行内替换
:set guifont=Courier_new:h14:b:cDEFAULT        设置字体和大小
:set lines=35 columns=118    设置默认窗口大小(图形)
:set vb t_vb=              置空命令错误时的铃声的终端代码
:set wildmenu            增强模式中的命令行自动完成操作
:set tabstop=4               实际的tab即为4个空格, 而不是缺省的8个
:set softtabstop=4             使得按退格键时可以退回缩进的长度,使用 expandtab 时特别有效
:set smarttab            在行和段开始处使用制表符
:set expandtab               在输入tab后,vim用恰当的空格来填充这个tab
:set noexpandtab            不要用空格代替制表符
:set sts=4                   设置softtabstop为4
:set shiftwidth=4            设置自动缩进 4 个空格, 当然要设自动缩进先
:set autoindent            第一行,vim使用自动对起,也就是把当前行的对起格式应用到下一行
:set smartindent              第二行,依据上面的对起格式,智能的选择对起方式,对于类似C语言编写上很有用
:set cindent            按照 c 语言的语法缩进
:set backspace=2
:set textwidth=79
:set ambiwidth=double
:set autowrite            设置自动存盘
:set showcmd            在Vim窗口的右下角显示一个完整的命令已经完成的部分
:set key=                取消文件加密
:set ai                设置文件起始位置(以光标当前位置为起始)set noai
:set readonly            设置文件只读
:set wrap                将超出屏幕行分多行显示 :set nowrap 关闭换行
:set cursorline            突出显示当前行
:set nobackup                  覆盖文件时不备份
:set noswapfile
:set backupcopy=yes            设置备份时的行为为覆盖
:set tags=tags
:set autochdir                 自动切换当前目录为当前文件所在的目录
:set report=0            在使用了底行命令后自动告诉我们文件的哪一http://facebook.com/行被改变过
:filetype plugin indent on     开启插件,文件类型检测,自动缩进
:set noerrorbells              关闭错误信息响铃
:set novisualbell              关闭使用可视响铃代替呼叫
:set matchtime=2               短暂跳转到匹配括号的时间
:set magic                     设置魔术
:set hidden                    允许在有未保存的修改时切换缓冲区,此时的修改由 vim 负责保存
:set guioptions-=T             隐藏GUI版本的工具栏
:set guioptions-=m             隐藏菜单栏
:set backspace=indent,eol,start                         不设定在插入状态无法用退格键和 Delete 键删除回车符
:set cmdheight=1               设定命令行的行数为 1
:set laststatus=2              显示状态栏 (默认值为 1, 无法显示状态栏)
:set encoding=utf-8        相当于set enc
:set fileencoding=utf-8        相当于set fenc
:set fileencodings=utf-8        相当于set fencs
:set termencoding=utf-8
:set nobomb            去除utf-8的bom
:set bomb
:set bomb?            查看文件是否右bom标记
:set foldenable                开始折叠
:set foldmethod=syntax         设置语法折叠
:set foldcolumn=0              设置折叠区域的宽度
:setlocal foldlevel=1          设置折叠层数为1
:set foldclose=all             设置为自动关闭折叠
:set ff                显示当前文件的格式
:set ruler            光标位置打状态行
set ambiwidth=double        防止特殊符号无法正常显示
:set fileformats=unix,dos,mac        添加在配置文件中让vim自动识别文件格式
:set suffixes=.bak,~,.o,.h,.info,.swp,.aux,.bbl,.blg,.dvi,.lof,.log,.lot,.ps,.toc            这样在vim中打开文件时, 按 tab 键补齐文件名时它会忽略上述文件
:set statusline= %<%F[%1*%M%*%n%R%H]%= %y %0(%{&fileformat} %{&encoding} %c:%l/%L%)                       设置在状态行显示的信息  
:syntax on/off            色彩支持

Python 文件的一般设置,比如不要 tab 等
autocmd FileType python set tabstop=4 shiftwidth=4 expandtab
autocmd FileType python map <F12> :!python %<CR>

设置字典 ~/.vim/dict/文件的路径
autocmd filetype javascript set dictionary=$VIMFILES/dict/javascript.dict
autocmd filetype css set dictionary=$VIMFILES/dict/css.dict
autocmd filetype php set dictionary=$VIMFILES/dict/php.dict

let b:javascript_fold=1                打开javascript折叠
let javascript_enable_domhtmlcss=1        打开javascript对dom、html和css的支持
let helptags=$VIMFILES.'/doc'            设定doc文档目录

多文件多窗口的操作

vim -On file1 file2 ...    使用大写的O参数来垂直分屏,n是数字,表示分成几个屏
vim -on file1 file2 ...    使用小写的o参数来垂直分屏

:sp filename        上下分割,并打开一个新的文件
:vsp filename        左右分割,并打开一个新的文件
:rew                     多个文件时回到首个文件
:n                切换到下一个文件
:N                切换到上一个文件
:bn                
:bp                同时打开很多文件,使用这两个命令来切换下一个或上一个文件
:split    filename        分割窗口,将会复制文件内容
:vsplit    filename        分割窗口
:new    filename    
:vnew    filename   
:close                关闭当前窗口
:only                    只留下当前编辑的窗口,关闭其他的编辑窗口
:qa                    全部退出,同qall
:wa                    全部写入,同wall
:wqa                同wqall
:args                显示编辑名单中的各个文件名列表
:files buffers ls        列出目前 buffer 中的所有文件

ctrl  w             窗口切换,连按两下,按方向键
ctrl  w  s        上下分割当前打开的文件
ctrl  w  v        左右分割当前打开的文件
ctrl  w  c        关闭当前窗口
ctrl  w  q        关闭当前窗口,如果只剩最后一个了,则退出Vim
ctrl  w  h        把光标移到左边的屏
ctrl  w  H        屏幕向左移动
ctrl  w  j        把光标移到下边的屏
ctrl  w  J        屏幕向下移动
ctrl  w  k        把光标移到上边的屏
ctrl  w  K        屏幕向上移动
ctrl  w  l        把光标移到右边的屏
ctrl  w  L        屏幕向右移动
ctrl  w  =        让所有的屏都有一样的高度
ctrl  W  +        要扩大窗口
ctrl  W  -        要缩小窗口

窗口分割时,进行切换的按键热键需要连接两次,比如从下方窗口移动光标到上方窗口,需要<c-w><c-w>k,非常麻烦,现在重映射为<c-k>,切换的时候会变得非常方便
nnoremap <C-h> <C-w>h
nnoremap <C-j> <C-w>j
nnoremap <C-k> <C-w>k
nnoremap <C-l> <C-w>l

文档的折叠,缩进

:set foldenable                 开始折叠
:set foldmethod=syntax          设置语法折叠
:set foldcolumn=0               设置折叠区域的宽度
:setlocal foldlevel=1           设置折叠层数为1
:set foldclose=all              设置为自动关闭折叠 

zf            折叠行(需加方向键)
zo            展开折叠,空格也可以
zc            关闭折叠

用空格键来开关折叠(默认)
nnoremap <space> @=((foldclosed(line('.')) < 0) ? 'zc' : 'zo')<CR>      

使用v选定代码后,按'='会自动缩进代码。
使用v选定代码后,按'>'会将代码整体右移。

文件格式

有三种文件格式:unix, dos, mac. 三种格式的区别主要在于回车键的编码:dos 下是回车加换行,unix 下只有 换行符,mac 下只有回车符。

:e ++ff=dos filename            让vim用dos格式打开这个文件
:w ++ff=mac filename            以mac格式存储这个文件
:set fileformats=unix,dos,mac        添加在配置文件中让vim自动识别文件格式
:set ff    

标记

使用标记可以快速移动。到达标记后,可以用Ctrl+o返回原来的位置。 Ctrl+o和Ctrl+i 很像浏览器上的 后退 和 前进 。

m{a-z}                标记光标所在位置,局部标记,只用于当前文件。
m{A-Z}                标记光标所在位置,全局标记。标记之后,退出Vim, 重新启动,标记仍然有效。
`{a-z}                移动到标记位置。
'{a-z}                移动到标记行的行首。
`{0-9}                    回到上[2-10]次关闭vim时最后离开的位置。
``                    移动到上次编辑的位置。''也可以,不过``精确到列,而''精确到行 。如果想跳转到更老的位置,可以按C-o,跳转到更新的位置用C-i。
`"                    移动到上次离开的地方。
`.                    移动到最后改动的地方。
:marks                显示所有标记。
:delmarks a b            删除标记a和b。
:delmarks a-c            删除标记a、b和c。
:delmarks a c-f            删除标记a、c、d、e、f。
:delmarks!                删除当前缓冲区的所有标记。
:help mark-motions        查看更多关于mark的知识

注释

方法一 块选择模式
Ctrl  v 进入块选择模式,然后移动光标选中你要注释的行,再按大写的I进入行首插入模式输入注释符号如// 或 #,输入完毕之后,按两下esc键,Vim会自动将你选中的所有行首都加上注释
Ctrl  v 进入块选择模式,选中你要删除的行首的注释符号,注意// 要选中两个,选好之后按d即可删除注释


方法二 替换命令

使用下面命令在指定的行首添加和撤销注释:

:起始行号,结束行号s/^/注释符/g        4,9 s/^////g,可以将格式中的/替换为#
:起始行号,结束行号s/^注释符//g        4,9 s/^////g


:vmap <F5> :s/^////<CR>        选中内容,按 F5注释
:vmap <F6> :s/^////<CR>        选中内容,按F6取消注释

每当输入#号时,#号都会跑到行首。
在.vimrc中加入如下几行,即可解决这个问题。
复制代码 代码如下:
if has("autocmd")
    filetype plugin indent on
else
    set autoindent
endif "has("autocmd")

统计字数

在visual(可视)模式下,选中需要统计的文本,按g,再按Ctr+g就会显示选择的行数,字符数。

:% s/./&/g            显示当前文本的字符数,行数,原理是用字符自己替换自己,看替换了多少次

复制粘贴

无论是vim内部抑或外部的复制([y]ank)、删除([d]elete)、粘贴([p]ut),在vim中都是借助registers(寄存器)实现的,vim共有9类寄存器:
无名(unnamed)寄存器:""                缓存最后一次操作内容;
数字(numbered)寄存器:"0 - "9            缓存最近操作内容,复制与删除有别;
行内删除(small delete)寄存器:"-            缓存行内删除内容;
具名(named)寄存器:"a - "z或"A - "Z        指定时可用;
只读(read-only)寄存器:":, "., "%, "#        分别缓存最近命令、最近插入文本、当前文件名、当前交替文件名;
表达式(expression)寄存器:"=            只读,用于执行表达式命令;
选择及拖拽(selection and drop)寄存器:"*, "+, "~        存取GUI选择文本,可用于与外部应用交互,使用前提为系统剪切板(clipboard)可用;
黑洞(black hole)寄存器:"_            不缓存操作内容(干净删除);
模式寄存器(last search pattern):"/        缓存最近的搜索模式。

粘贴剪切板内容
在命令模式下依次输入“"0p”粘贴0寄存器的内容。

对于非GUI版本的vim,系统剪切板是不可用的,须安装gvim。

设置了set mouse=a 后,按住 shift 键,可以将鼠标的处理交给 X 环境,方便复制粘贴。

:map <F7> :set nu<CR>
:map <F8> :set nonu<CR>
:map <F9> :set paste<CR>        
:map <F10> :set nopaste<CR>

map

:map            输出已定义的所有映射

map,nmap(命令模式),imap(输入模式),vmap(选中模式) 

进行命令的宏定义。置可以预先写到 ~/.vimrc,写进配置文件时不用写前面的冒号。
:nmap  :nohls                   取消被搜索字串的高亮
:nmap  w                       命令模式下转移光标到不同窗口
:imap                          输入模式下运行
:nmap  :%s= *$==               删除所有行尾多余的空格
:nmap  :cl                      此命令用于查看所有的编译错误
:nmap  :cc                      此命令用于查看当前的编译错误
:nmap  :cn                      此命令用于跳到下一个出错位置
:nmap  :cp                      此命令用于跳到上一个出错位置
:imap                        同上java 中: (注, 这里为什么说 java 中, 因为以下定义对其他文件格式不起作用, 下文会说到如何实现这一点)
:nmap  :JavaBrowser            此命令用于在窗口左部分割出一个新窗口, 里面的内容是 java 的资源树, 包括本文件中出现的类, 类的成员变量及成员方法, 就好像 JCreator 
                  表现的那样。在这个窗口中输入
? 会看到帮助。 嘿嘿, 很好用, 不过需要 ctags 支持. :nmap :comp javac:mak -d . % 此命令用 javac 编译 java 文件, 它会自动将光标定位到出错点. 不过这需要定义一个 javac.vim 文件在 $VIM/compiler 下,
                在 javac.vim 里面只有两行字:setlocal makeprg=javac, setlocal errorformat=%A%f:%l: %m,%-Z%p^,%-C%.%# :nmap :comp ant:mak 此命令用 ant 编译 java 文件, 它会自动将光标定位到出错点. 一般来说, 安装vim 后已经有了compiler/ant.vim文件, 因此这个命令可以
              直接使用。但是需要在当前目录下有 build.xml 文件, 当然还必须安装 ant 才行 Buffers操作快捷方式 nnoremap
<C-RETURN> :bnext<CR> nnoremap <C-S-RETURN> :bprevious<CR> Tab操作快捷方式 nnoremap <C-TAB> :tabnext<CR> nnoremap <C-S-TAB> :tabprev<CR> 关于tab的快捷键 map tn :tabnext<cr> map tp :tabprevious<cr> map td :tabnew .<cr> map te :tabedit map tc :tabclose<cr> 一些不错的映射转换语法(如果在一个文件中混合了不同语言时有用) nnoremap <leader>1 :set filetype=xhtml<CR> nnoremap <leader>2 :set filetype=css<CR> nnoremap <leader>3 :set filetype=javascript<CR> nnoremap <leader>4 :set filetype=php<CR> nmap <leader>fd :se fileformat=dos<CR> nmap <leader>fu :se fileformat=unix<CR> 使用Ctrl+[l|n|p|cc] 来 list|next|previous|jump to count the result map <C-x>l <ESC>:cl<CR> map <C-x>n <ESC>:cn<CR> map <C-x>p <ESC>:cp<CR> map <C-x>c <ESC>:cc<CR> 选中状态下 Ctrl c 复制 vmap <C-c> y

autocmd

:set autocmd!
Python 文件的一般设置,比如不要 tab 等 autocmd FileType python set tabstop
=4 shiftwidth=4 expandtab autocmd FileType python map <F12> :!python %<CR> 设置字典 ~/.vim/dict/文件的路径 autocmd filetype javascript set dictionary=$VIMFILES/dict/javascript.dict autocmd filetype css set dictionary=$VIMFILES/dict/css.dict autocmd filetype php set dictionary=$VIMFILES/dict/php.dict

vim的插件

http://www.ibm.com/developerworks/cn/linux/l-tip-vim2/index.html

gzip(压缩文件支持)

netrw(网络文件支持)

engspchk(英文拼写检查)

calendar(日历显示)cal

project(文件的“项目”管理):Project

taglist(源代码结构浏览):Tlist
:let Tlist_Inc_Winwidth=0

cvsmenu(CVS集成)

doxygen(文档注释语法加亮)

matrix(一个好玩的脚本):Matrix

syntax/2html.vim            让 Tohtml 产生有 CSS 语法的 html   
let html_use_css=1

ZenCoding.vim             很酷的插件,HTML代码生成
插件最新版:http://github.com/mattn/zencoding-vim
常用命令可看:http://nootn.com/blog/Tool/23/

checksyntax.vim            JavaScript常见语法错误检查
默认快捷方式为 F5
let g:checksyntax_auto = 0        不自动检查

NeoComplCache.vim            自动补全插件
let g:AutoComplPop_NotEnableAtStartup = 1
let g:NeoComplCache_EnableAtStartup = 1
let g:NeoComplCache_SmartCase = 1
let g:NeoComplCache_TagsAutoUpdate = 1
let g:NeoComplCache_EnableInfo = 1
let g:NeoComplCache_EnableCamelCaseCompletion = 1
let g:NeoComplCache_MinSyntaxLength = 3
let g:NeoComplCache_EnableSkipCompletion = 1
let g:NeoComplCache_SkipInputTime = '0.5'
let g:NeoComplCache_SnippetsDir = $VIMFILES.'/snippets'
<TAB> completion.
inoremap <expr><TAB> pumvisible() ?   <C-n>   :   <TAB>  
snippets expand key
imap <silent> <C-e> <Plug>(neocomplcache_snippets_expand)
smap <silent> <C-e> <Plug>(neocomplcache_snippets_expand)

bufexplorer.vim             Buffers切换
e                     全屏方式查看全部打开的文件列表
v                     左右方式查看   s 上下方式查看

taglist.vim              查看函数列表,需要ctags程序
F4 打开隐藏taglist窗口
if MySys() ==   windows                     设定windows系统中ctags程序的位置
    let Tlist_Ctags_Cmd = '  '.$VIMRUNTIME.'/ctags.exe  '
elseif MySys() ==   linux                   设定windows系统中ctags程序的位置
    let Tlist_Ctags_Cmd = '/usr/bin/ctags'
endif
nnoremap <silent><F4> :TlistToggle<CR>
let Tlist_Show_One_File = 1                   不同时显示多个文件的tag,只显示当前文件的
let Tlist_Exit_OnlyWindow = 1                 如果taglist窗口是最后一个窗口,则退出vim
let Tlist_Use_Right_Window = 1                在右侧窗口中显示taglist窗口
let Tlist_File_Fold_Auto_Close=1              自动折叠当前非编辑文件的方法列表
let Tlist_Auto_Open = 0
let Tlist_Auto_Update = 1
let Tlist_Hightlight_Tag_On_BufEnter = 1
let Tlist_Enable_Fold_Column = 0
let Tlist_Process_File_Always = 1
let Tlist_Display_Prototype = 0
let Tlist_Compact_Format = 1

mark.vim                 给各种tags标记不同的颜色,便于观看调式的插件。
m                      mark or unmark the word under (or before) the cursor

                      manually input a regular expression. 用于搜索.

                      clear this mark (i.e. the mark under the cursor), or clear all highlighted marks .
*                      当前MarkWord的下一个     
#                      当前MarkWord的上一个
/                      所有MarkWords的下一个    
?                      所有MarkWords的上一个

NERD_tree.vim             以树状方式浏览系统中的文件和目录
:ERDtree 打开NERD_tree         :NERDtreeClose    关闭NERD_tree
o                     打开关闭文件或者目录         
t                     在标签页中打开
T                     在后台标签页中打开           
!                     执行此文件
p                     到上层目录                   
P                     到根目录
K                     到第一个节点                 
J                     到最后一个节点
u                     打开上层目录                 
m                     显示文件系统菜单(添加、删除、移动操作)
r                     递归刷新当前目录             
R                     递归刷新当前根目录
F3                     NERDTree 切换
map <F3> :NERDTreeToggle<CR>
imap <F3> <ESC>:NERDTreeToggle<CR>

NERD_commenter.vim           注释代码用的,
[count],cc                 光标以下count行逐行添加注释(7,cc)
[count],cu                 光标以下count行逐行取消注释(7,cu)
[count],cm                 光标以下count行尝试添加块注释(7,cm)
,cA                     在行尾插入 /* */,并且进入插入模式。 这个命令方便写注释。
注:count参数可选,无则默认为选中行或当前行
let NERDSpaceDelims=1          让注释符与语句之间留一个空格
let NERDCompactSexyComs=1      多行注释时样子更好看

DoxygenToolkit.vim          由注释生成文档,并且能够快速生成函数标准注释
let g:DoxygenToolkit_authorName=  Asins - asinsimple AT gmail DOT com  
let g:DoxygenToolkit_briefTag_funcName=  yes  
map <leader>da :DoxAuthor<CR>
map <leader>df :Dox<CR>
map <leader>db :DoxBlock<CR>
map <leader>dc a /*  */<LEFT><LEFT><LEFT>

matchit.vim               对%命令进行扩展使得能在嵌套标签和语句之间跳转
% 正向匹配      
g% 反向匹配
[% 定位块首    
 ]% 定位块尾

plugin - vcscommand.vim       对%命令进行扩展使得能在嵌套标签和语句之间跳转
SVN/git管理工具

a.vim

搭建vim开发环境

http://blog.csdn.net/tao_627/article/details/9320363

项目管理

http://blog.csdn.net/ithomer/article/details/7090318
http://blog.csdn.net/paul08colin/article/details/9232409

参考

http://www.vim.org/
http://wiki.dzsc.com/info/7313.html
http://www.cnblogs.com/zourrou/archive/2011/04/16/2018493.html
http://blog.csdn.net/wuyeyixi/article/details/7466327
http://blog.csdn.net/tao_627/article/details/9320363
http://blog.csdn.net/ithomer/article/details/7090318
http://blog.csdn.net/paul08colin/article/details/9232409
http://blog.163.com/zhang_sheng_cun/blog/static/46288667200792604435190/
http://linux.chinaunix.net/techdoc/desktop/2009/07/06/1122020.shtml
http://be-evil.org/vim-how-to-comment-multi-line-code.html
http://www.ibm.com/developerworks/cn/linux/l-tip-vim2/index.html
http://vimcdoc.sourceforge.net/        下载vim的pdf完全翻译版,里面很详细的介绍了vim
http://www.vi-improved.org/vimrc.php        带有英文注释的.vimrc配置文件

unix/linux的哲学之一是使用独立的小工具完成复杂的工作。

原文地址:https://www.cnblogs.com/little-snake/p/4604097.html