VIM编辑器vi improved
vi:visual interface
vim +/PATTERN f1 打开文件后光标处于第一个被匹配到PATTERN的行的行首,n键跳到下一个,即支持正则匹配
vim +n f1 直接打开f1文件并且将光标定位在第n行
vim -b f1 以二进制方式打开文件
vim -d f1 f2... 比较多个文件
vim -m f1 以只读方式打开文件
ex f1 或vim -e f1 直接进入ex模式
vi +/^user passwd
//vi或vim支持正则表达式匹配,即打开passwd文件并将光标定位在匹配到以user开头的行
vim的模式:
命令模式(normal):默认打开模式,移动光标,剪切粘贴删除等
插入模式或编辑模式(insert):修改文本
扩展命令模式(extended command):保存,退出,帮助,:号后加命令
可视模式(visual):块选择操作
ESC键,退出当前模式。按两次ESC键,返回到命令模式
i:insert,光标前插入
I:在光标所在行首插入
a:append,光标后插入
A:在光标所在行尾插入
o:在光标所在行的下方插入新行
O:在光标所在行的上方插入新行
锁定和解锁:ctrl+s,ctrl+q
扩展模式:
:q 退出
:wq 保存退出
:x 保存退出
r!cmd 读取命令的输出到当前光标的下一行
:方向键 可以上下选择vi的历史命令,操作同bash,支持的快捷键操作^w,^u,^e
命令模式:
ZZ:保存退出
ZQ:不保存退出
hjkl:左下上右移动
#cmd:3h向左移动3个字符
w:下一个单词词首
e:当前或下一个单词词尾
b:当前或前一个单词词首
#cmd:3w向下跳转3个单词
H:跳转到当前页页首 M:页中 L:页底
^:跳转到行首的第一个非空白字符
0:跳转至行首,注意是数字零
$:跳转至行尾
#G或者:# :跳转至指定行,3G第三行,:10第10行
shift+3:即#号,匹配光标处的单词,并高亮显示文件中的所有相同的单词,n键跳转
G:最后一行
1G,gg:第一行
):下一句 (:上一句。句子以.隔开
}:下一段 {:上一段。段落以空行隔开
ctrl+f:向文件尾部翻一屏
ctrl+b:向文件首部翻一屏
ctrl+d:向文件尾部翻半屏
ctrl+u:向文件首部翻半屏
x:删除光标处的字符
#x:删除光标处之后的#个字符
xp:交换光标所在处的字符及其后面字符的位置
~:转换大小写
r:替换光标所在处的1个字符,3r三个字符
R:完全替换模式,ESC退出
d$:删除到行尾
d^:删除到非空行首
d0:删除到行首
dw,de,db
D:从光标当前位置一直删除到行尾,保留空行,等同于d$
y:复制,y$,y0,y^,ye,yw,yb
yy:复制行,Y复制整行
p:小写,若为行粘贴则是粘贴在当前光标所在行的下方;若为文本则粘贴在光标的后面
P:大写,若为行粘贴则是粘贴在当前光标所在行的上方;若为文本则粘贴在光标的前面
c:修改后切换到插入模式
c$,c^,c0,cb,ce,cw
C:删除当前光标到行尾,并切换到插入模式
100iroot[ESC]粘贴root 100次
0y$:组合命令:0-移到行首,y-从这里开始复制,$-复制到本行的最后一个字符
ye:从当前位置复制到本单词的最后一个字符
gU:变大写
gu:变小写
扩展命令模式:以:为命令开始,显示在左下角,以下:均省略,不再说明
#,#:3,9:从第3行到第9行
#,+#:3,+4:从第3行到第7行
.:当前行
$:最后一行 .,$-1:当前行到倒数第二行
%:全文,相当于1,$
vim支持正则表达式,在扩展命令模式下
/pat1/,/pat2/ :从第一次被pat1模式匹配到行开始,一直到第一次被pat2匹配到的行结束
#,/pat/ , /pat/,$
使用方式:后面跟一个编辑命令
d,y,w,r
w f3:将指定范围内的行另存到指定文件中
vim +/usera passwd 直接跳转至usera的行
:/^bin/,/^halt/y 复制以bin开头,以halt结尾的行
/word:从光标处向下查找
?word:从光标处向上查找
n:与命令同方向 N:与命令反方向
s/root/rooter/g
s/root/&er/g 同上,&表示引用前面查找到的内容
s/r..t/&er/g 简写,使用正则方式
s/r..t/user:&/g 正则
修饰符:i忽略大小写,g全局替换,gc全局替换,每次替换前询问
查找替换中的分隔符/可以替换为其他的字符,如#@+,方便替换路径,如:
s@/etc@/var@g :将/etc替换为/var,全部替换
s#/boot#/#i :将/boot替换为/且忽略大小写
vi fstab
:%s/^#/*/ 表示以#开头的行替换为以*开头
:1s/root/ROOT/g 替换第一行的root为ROOT
:1s/root/a&b/g
:%s/^#// 表示删除注释符#
:%s/^UUID/#&/
:%d 清空文件
:%s@/dev/sd@/etc/hd@g
命令模式:撤销更改
u:撤销最近的更改,3u撤销前3次
U:撤销此行的所有更改,条件为光标必须始终定位在此行,否则无效
ctrl+r:重做
.:重复一个操作
n.:重复前一个操作n次
录制宏:命令模式下
qa //开始录制宏,名称为a
操作编辑。。。 //开始操作
q //退出编辑操作
@a //运行宏a
@@ //重复执行宏
vim的寄存器:
有26个命名的寄存器(a,b,c...z)和1个无命名的寄存器
名称寄存器格式:"寄存器名称。放在数字和命令之间,如3"tyy 表示复制3行到t寄存器中
未指定名称,则使用无命名寄存器:3yy 表示复制三行到无命名寄存器中
有10个数字寄存器(0-9)0为最近复制,1为最近删除的内容。变更1转存到2,2转存到3,以此类推,数字寄存器不能在不同会话间共享。
格式:数字"寄存器命令,5"bdd,未指定则使用无命名寄存器4"y
3yy:复制3行
3"ayy:复制3行到a寄存器
"ap:粘贴a寄存器的内容
编辑二进制文件步骤:
dd if=/dev/zero of=b1 bs=1 count=6
hexdump b1
hexdump -C b1
vim -b b1
:%!xxd 切换为可读的十六进制
进行编辑二进制文件
:%!xxd -r 重新转换回二进制
:wq 保存退出
可视模式:
v 面向字符
V 面向行
ctrl+v 面向块
可视化键可用于与移动键结合使用,w,),},箭头等
多文件模式:
vim f1 f2 f3 ...
:next 下一个
:prev 前一个
:first 第一个
:last 最后一个
:wall 保存所有
:qall 退出所有
:wqall
多窗口:
vim -o f1 f2
o:水平分割,O:垂直分割
ctrl+w 窗口间切换
单文件窗口分割,重复打开当前文件,Windows下Ctrl+Tab切换,顺序为从上往下,从左往右。@H_359_403@
:vs 左右
:sp 上下
Ctrl+ww 窗口切换,同Ctrl+Tab
Ctrl+wh 切换到左侧窗口,wl右侧窗口,wj向下,wk向上。hjkl左下上右
ctrl+w,s 水平分割,split
ctrl+w,v 垂直分割,vertical
ctrl+w,q 取消相邻窗口
ctrl+w,o 取消全部窗口
:wqall 退出
定制vim配置文件
全局/etc/vimrc,个人~/.vimrc
set [no]nu 行号
set [no]sm 括号成对匹配
set [no]ai 自动缩进
set [no]hlsearch 高亮搜索
set [no]ic 忽略字符大小写
Syntax on[off] 语法高亮
set fileformat=dos 启用Windows格式
set fileformat=unix 启用unix格式
"设置文本宽度
:set textwidth=65
:set wrapmargin=15
:help option-list 查看所有选项列表
:set or :set all 查看所有set设置
:source % 使当前编辑的配置文件生效(可简写为:so %),编辑窗口不能关闭@H_359_403@
vimtutor 命令行直接打开,可自由编辑,关闭后自动还原,用于练习vim命令
:e . 打开当前目录@H_359_403@
:source $MYVIMRC
nmap,ev :e $MYVIMRC<cr> 定义快捷键编辑vimrc
:tabedit $MYVIMRC 新开标签页
nmap,ev :tabedit $MYVIMRC<cr> 通过快捷键,ev在新标签打开vimrc配置文件
通过设置统一的快捷键首mapleader来实现组合多个功能操作@H_359_403@
"--------------Mappings---------------"
let mapleader = ","
nmap <leader>ev :tabedit $MYVIMRC<cr>
nmap <leader><space> :nohlsearch<cr>
nmap <leader>w :w<CR>
augroup autosourcing
autocmd!
autocmd BufWritePost _vimrc source % 自动加载vimrc文件
augroup END
"窗口切换,ctrl+j向下,ctrl+k向上,ctrl+h向左,ctrl+l向右
nmap <c-j> <c-w><c-j>
nmap <c-k> <c-w><c-k>
nmap <c-h> <c-w><c-h>
nmap <c-l> <c-w><c-l>
"设置tab键为4个空格
set ts=4
set expandtab
set autoindent