[速查] VIM常用法

vim -h 显示所有命令行参数

三级只读模式,越来越严

vim -R readme.txt 以只读模式打开(之后的所有写操作都必须强制!)
vim -m 只有:set write 之后才可以保存。
vim -M 最严的只读,无论如何都不允许写。


----- 关于十六进制 -----

十六进制模式下的编辑非常复杂,极易出错。
现根据两种常见使用场景,总结出如下指导,务必严格遵守:

1. 文件本身就是纯二进制的。

打开文件时使用-b参数,以二进制模式编辑。
进入vim后,使用:%!xxd进入十六进制模式。
每次保存之前,必须退出十六进制模式(:%!xxd -r)。
增删改,这三种常见操作,在十六进制模式时,最好只使用第三种:改。
如果非要增删,先退出十六进制模式,加入同样个数的点位字符,然后进入十六进制模式修改。虽然看着麻烦,但其实是简单、不易出错的。
如果非要在十六进制模式下增删,要注意,xxd把整个屏幕分成三个区:左边地址区,中间数值区,右边ASCII预览区。你的修改要兼顾三个区!保证地址正确,保证有效字节不被挤到预览区。
总而言之一句话:保证地址区和数值区的格式正确(预览区乱写一气不会有事)。这样,xxd程序才能识别。

2. 文件本身是文本文件。

这种情况多是要处理文本中少数的乱码。
打开文件时,要用-b参数。不要在vim里:se bin(aka. set binary)临时改。改着改着会记乱的。
其它的参照上面的指示。

附常用命令:

:%!xxd 切换到十六进制模式。

想要保存时,必须先回到文本模式,然后再w。
如果在十六进制模式按了w保存,那么你保存的实际是屏幕上的所有文本(地址、数值,ASCII预览)。

:%!xxd -r  回到文本模式

在文本模式下,如果有类似^A^B...^M这样的符号,是不可打印字符。
使用:set display=uhex(简写为:se dy=uhex) 可以将它们显示成ASCII码<0a>这样子。
可用:setlocal 只影响当前文件。
可使用 :se(t) dy 来查询当前display的设置。

----- 关于帮助 -----

在vim里,随时可用:help <subject> 查询帮助。

带大括号的标签可以跳转,使用快捷键Ctrl-],如{command}
跳回来:Ctrl-T 或 Ctrl-O
跳到下一屏:Ctrl-D (Downward Scroll)
跳回上一屏:Ctlr-U (Upperward Scroll)
跳到下一页:Ctrl-F (Forward)
跳回上一页:Ctrl-B (Backwardr)

----- 替换 -----

即 s 命令的各种使用场景

:s/fox/cat       当前行,第一个FOX替换成CAT
:s/fox/cat/g     当前行,所有FOX都替换
:3,6s/fox/cat    第3行到第6行,第一个FOX
:3,6s/fox/cat/g  第3行到第6行,都替换
:3,$s/fox/cat    第3行到文本的末尾
:.,6s/fox/cat    当前行到第6行
:s#fox/#cat//    当前行的fox/替换为cat//(用#作为分隔符)
:%s/fox/cat      每一行,第一个FOX替换为CAT
:%s/fox/cat/c    末尾的C表示CONFIRM,替换前确认
:s/\<fox\>/cat/  匹配FOX这个单词(用<和>匹配单词的首尾)
:s/\r\n/cat/     回车换行

替换不可见字符或乱码的步骤略复杂:
1. 光标移到字符上,打ga键,显示其十六进制码。
2.
  若是单字节    :%s/\%xYY/substitute/g
  若是多字节    :%s/\%uYYYY/substitute/g

----- 删除 -----

从当前行向下,删除100行    100dd
从当前行向下,删除100行    d99j    j和k就是方向键
从当前行向上,删除100行    d99k
从当前行向上,删除2行    dk
从第2行删到第100行        :2,100d
从当前行向下,删除100行    :.,.+99d   .是当前行(序号0),.+99是第100行(序号99)
从第3行到最后,全删    :3,$d

----- 跳转 -----

gg    跳到开头
12gg    跳到第12行
12G    跳到第12行
G    跳到末尾
3后回车    向下跳3行
3j    向下跳3行
3k    向上跳3行

e    跳到单词尾
w    跳到单词头
b    向前跳,到单词头

0    跳到当前行的行首
^    跳到当前行的第一个字符
$    跳到当前行的末尾

HML    跳到“屏幕内容”的始、中、终

)(    跳到下(上)一句子
}{    跳到下(上)一段落

''    (两个单引号)跳回上个位置

|    跳到第1列
14|    跳到第14列

----- 当前行,移动 -----

:m 12    移到第12行
:m 0    移到第1行的前面
:m $    移到最后一行
:m .+1    和下一行互换
:m .-2    和上一行互换(注意是2)
:2,4m $    第2到4行移到最后
:.,.+4m $  当前5行移到最后
:,+4m$     和上面一样,简写了,省略了当前行与空格

----- 文件编码转换 -----

:set fenc=utf-8    把文件转码为utf-8。(转入二进制模式可看到,现在文件有BOM:efbbbf)
:set fenc=utf-16le 把文件转码为utf-16。此时文件会有BOM:fffe。
:help enc 或 :help fenc 查看支持的编码

----- 搜索 -----

/[\x80-\xff]    搜索不可见字符80-ff。

----- 比较文件内容 -----

比较两个文本文件,要确保二者的编码一样。
vim -d a.txt b.txt
有差异的行,会用特殊的颜色标出来。

比较两个二进制文件,如果是粗略地比较,用cmp命令行工具比较好。
cmp a.bin b.bin
直接告诉你文件是否一样。

cmp a.bin b.bin -l
-l 会详细列出第几个字节,各自的值是多少。

在vim下比较二进制文件步骤多:
1. 打开两个文件,并列显示。
2. 使用:windo %!xxd 使两个窗口都进入十六进制模式
3. 使用:windo diffthis比较两个窗口(buffer)的内容
4. 当文件内容改变时,用:diffupdate重新比较(本来vim会自动更新比较,但不准确,所以需要手动重新比较)
5. 在浏览文件时,两个窗口会同时卷动
6. 想离开比较模式::windo diffoff
7. 想退出vim::windo q!

----- 同时编辑两个文件 -----

vim a.bin b.bin -o   -o 意为:open new window
即每个文件各有一个窗口。
ctrl-w、ctrl-w在两个窗口间跳转。

或者:

vim a.bin     打开第一个文件,进入vim环境
:split b.bin  打开第二个。两个窗口横向平行

VIM既有上面说的窗口模式,还有分页模式:

:tabedit {filename}   创建新文件,打开到新的一页
:tabnext
:tabprevious  在分页之间跳转
:tabclose     分页关闭
:tabdo {cmd}  在所有分页执行命令

----- 复制粘贴 -----

在visual模式比较直观。
1. 先把光标停在你想复制的起始位置
2. 按v进入可视模式(V可选择整行,或者按Ctrl-v进入“块模式”)
3. 使用光标移动命令,标示复制区域的结束位置
4. 使用y命令复制,或d命令剪切。然后vim自动退回到normal模式
5. 使用p命令粘贴。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值