vi是类Unix系统下不过时的编辑器,vim是它的升级版。很多时候需要临时编辑一个文件,IDE并不总是可用的.这个时候,vim就派上用场了。简单教程可以`vimtutor`,本文总结了一些常见的用法,会不断迭代。
1)习惯没有IDE的字符界面, 了解VI的三种模式
command模式---view模式---insert模式
2) 键盘上通用的复制粘贴(注意:不是ctrl + c 与 ctrl + v)
选中,复制: ctrl + insert
insert模式, 粘贴: shift + insert
command模式, 设置粘贴不混乱(区分空白符):set paste
command模式, 设置粘贴不混乱(不区分空白符):set nopaste
3) 似曾相识的功能插件(对于习惯windows环境的读者来说, 虽然蹩脚但还凑合)
#文件目录树::netrw
从shell进入netrw:vim dirpath
从vim的command模式进入netrw:E
ENTER :1) 文件; 2) 进入目录;
-:返回上一级目录
s:按照时间, 大小, 文件名等关键字排序
D:删除文件(不能删除目录)
R:重命名文件/目录
#多个窗口,多个文件::split, vsplit
command模式, 上下分割:split [filepath]
command模式, 左右分割:vsplit [filepath]
command模式,关闭当前文件:close
command模式,关其它文件:only
view模式,切换当前编辑的文件:ctrl + w [+h][+j][+k][+l]
command模式,搜索打开任意文件:find filename[TAB]
配置搜索路径打开工程下的任意一个文件:set path+=/tmp/**
#工程浏览::ctags
shell安装:yum -y install ctags
command模式, 为当前目录下所有文件生成全局索引:!ctags -R
command模式, 跳转到关键词的定义: tjump keyword (多处, 输入数值,回车)
view模式, 跳转到定义:ctrl + ]
view模式, 回溯:ctrl + t
#代码补全::ctags
#配置tab键代码补全
"fill complete code with ctags
function! CleverTab()
if strpart( getline('.'), 0, col('.')-1 ) =~ '^\s*$'
return "\<Tab>"
else
return "\<C-N>"
endif
endfunction
inoremap <Tab> <C-R>=CleverTab()<CR>
#设置索引文件tags搜索路径(由ctags -R生成的)
"set tags?
set tags+=/root/aaa/bbb/tags
4) 一些必要的配置, 与IDE相似
#关于view模式下的搜索
设置忽略大小写:set ic (取消设置:set noic)
设置高亮:set hl(取消设置:set nohl)
设置部分匹配结果:set is(取消设置:set nois)
设置语法标亮:syntax on(取消设置:syntax off)
#配置文件
用户配置:~/.vimrc
系统配置:/etc/vimrc
#更多用法查询
简单命令文档:vimtutor
详细命令文档:vim,F1
command模式查询命令文档:help command
#设置文本编码,风格
编码格式: (:set fileencoding=utf-8)
系统文件风格:(set fileformat=unix ) ( mac(\r),dos(\n\r),unix(\n) )
5) view模式,内容搜索与遍历
搜索:/content
遍历: n-下一个
遍历: N-上一个
6) command模式,内容替换
整个文本内容静默替换: (:%s/from/to/g)
整个文本内容待确认替换: (:%s/from/to/gc)
查看文本内容出现的次数:(:%s/keyword//gn)
整个行内容静默替换: (:s/from/to/g)
7) view模式,删除d, 拷贝y, 改写c(进入insert模式)
删除光标处的字符:x
d(delete), y(copy), c(replace),如下
删除光标处的一个单词:dw,de,daw
删除选定的内容:ctrl + v == > d
删除光标处直到行尾的所有内容:d$
删除一行:dd
删除一个段落:dap
删除直到文本尾:dG
8) command模式, 多行拷贝(t-co-copy),移动(m-move)
拷贝第10行到光标所在行的下方:10t. (:10co.)(:10copy.)
将当前行拷贝到第10行下方:t10
拷贝当前行到下方:t.(相当于view模式的yyp)
将当前行拷贝到文件末尾:t$
将选中内容复制到文件开头:VG (view模式)==>(command模式) t0
拷贝10th~20th行的内容到光标所在行的下方:10,20t.
9) view模式,粘贴p(P)
插入上次删除/复制行的内容:p(本行下方), P(本行上方)
插入上次删除/复制的内容:p(光标后), P(光标前)
10) view模式,内容覆盖
开始覆盖一个字符:r
开始覆盖若干个字符:R
11) view模式,列操作(n+1列)
列插入: ctrl + v + nj + i + content
列修改: ctrl + v + nj + caw
列删除:ctrl + v + nj + daw
12) view模式,控制缩进
右移动单行:>>
左移动单行:<<
右移动10行:>10>
左移动10行:<10<
自动缩进整个文本: =G
13) view模式,撤销之前的操作
撤销上次的操作:u, (反撤销:ctrl +r)
撤销对这一行的操作:U
14) command模式,保存, 退出
另存为新文件: (:w filename)
退出并放弃所有的更改:":q!"
退出并保存所有的更改:":wq"
有更改就保存,无更改就退出:":x"
15) command模式,TAB补全
TAB命令补全
TAB参数补全
16) view模式,脱离鼠标, 光标直接移动到要去的地方
#字符
光标移动一个字符的距离:k(上),j(下),h(左),l(右)
#单词
光标移动一个单词的距离:w(下一个单词的开头), b(上一个单词开头), e(下一个单词的末尾)
#行
光标移动到行首:0
光标移动到行第一个非空字符:^
光标移动到行尾:$
#文件
光标移动到文档头:gg
光标移动到某行: nG
光标移动到文档尾:G
#搜索前进
光标移动到该行的某个单词 (view模式):f{char}
光标在单词中间游动:gD(gd) + n(N) (*)
#配对保留字
匹配的括号,预编译符号#:%
#定义方法
在函数定义将之间游走:[[ (上一个)
在函数定义将之间游走:]] (下一个)
#移动位置信息
显示文件,光标信息: ctrl + g
17) view模式,录制并使用可重复回放的宏(神操作)
重复上一次的操作: . (view模式)
宏录制开始:qa(view模式)
宏录制结束:q(view模式)
查看录制好的宏:reg a(command模式)
回放宏a一次:@a (view模式)
回放录制的结果10次:10@a (view模式)
18) view模式,内容大小写切换
字母大小写切换:~
单词转小写:guaw
单词转大写:gUaw
行大小写切换:g~~
行转大写:gUU
行转小写:guu
段落转大写:gUap
段落转小写:guap
19) view模式,数值计算
数值加1: ctrl + a
数值减1: ctrl + x
数值加0x10: 0x10 + ctrl + a
数值减0x10: 0x10 + ctrl + x
数值加10: 10 + ctrl + a
数值减10: 10 + ctrl + x
数值加010: 010 + ctrl + a
数值减010: 010 + ctrl + x
20) command模式,执行shell命令
在vim中启动一个shell: shell
在vim中使用shell执行一条命令: !{cmd}
在 vim中使用shell执行一条命令,并把其stdout插入到光标下方: r !{cmd}
将vim中的内容作为shell命令stdin, 执行一条命令: [range]write !{cmd}
将vim中的内容过滤: [range]!{filter}
命令回溯: up,down
读取文件内容到vim缓冲区: r filepath
21) command模式,在一定行范围内执行命令
打印3th行:3p
打印最后一行:$p
打印所有的行:%p
打印当前行到文件尾: . , $ p
打印2th~5th行:2,5p
打印选中的2th~最后一行: 2G + VG (view模式)==>(command模式) p
打印模式匹配范围内的:/<html>/+1,/<\/html>/-1p
22) command模式, global搜索并操作含特殊内容行:g/{patern}/[range][cmd]
收集所有含有特殊内容的行: g/var
删除所有含有'var'的行: g/var/d
将3-10行内含有'var'内容的行删除:g/var/3,10d
23) command模式, 对选中内容进行操作
选中多行到新文件: (ctrl + v 选中多行; :’<,’>w filename)
对选中内容进行排序: (ctrl + v 选中多行; :’<,’>sort)
24) view模式==>insert模式
在光标处插入字符:i(进入insert模式)
在光标后插入字符:a(进入insert模式)
在行首插入字符:I(进入insert模式)
在行尾插入字符:A(进入insert模式)
在光标上插入一行:O(进入insert模式)
在光标下插入一行:o(进入insert模式)