阅读 3987

Vim 大法

命令执行格式
(command) (number) (text object)
(number) (command) (text object) 
复制代码
基础操作
ZZ 或 :wq                 保存并退出
:e!                       恢复到上一次存储的文件内容
:w pathname/filename      写入到其他文件中
:rf pathname/filename     删除其他文件
:!ls pathname             查看其他目录使用情况
:sh -> ctrl-dexit     创建对应的 shell 执行其任务后再返回
ctrl-z -> fg              暂停 vi 后执行对应的任务后再返回
复制代码
按字符光标移动
h/l                       左/右 移动一个字符
4l                        向右 4 个字符
复制代码
按行光标移动
0                         移动到行首
$                         移动到行尾
^                         移到当前行第一个非空格处
10|                       移到当前行第 10 列

j/k                       上一行/下一行
2j                        向上移动 2 行

G                         移动到文件的结尾
1G                        移动到文件的第一行
ctrk-g                    屏幕底部显示信息, 包含行号, 文件总行数, 当前位置占全文的百分比
复制代码
按照文本块移动
w                        移动一个单词, 包含符号与标点
W                        移动一个单词, 不包含符号与标点
2w                       移动两个单词

b                        倒退一个单词, 包含符号与标点
B                        倒退一个单词, 不好干符号与标点

e                        移到单词的尾部
E                        移到单词的尾部, 忽略标点符号

(                        移到当前句子的开头, 标点符号后有两个空格或者一行的最后一个非空格字符时候为一个句子
)                        移到下一个句子的开头
3)                       向上移动 3 个句子

{                        移到当前这一段的开头, 段落指的是空白行下的文本
}                        移到下一段的开头

[[                       移到当前这一节的开头
]]                       移到下一节的开头
复制代码
简单的文件编辑
i                        insert, 插入
a                        add, 添加
c                        change, 更改
d                        delete, 删除后放到缓冲区
p                        paste, 粘贴, d -> p 可以移动行
y                        复制

cw                       表示更改整个单词

x                        删除一个字符
r                        重写改写一个字符
复制代码
添加文本
a                        光标之后添加
A                        行结尾添加

i                        光标之前添加
I                        行开头添加

o                        光标位置下一行打开新行添加
O                        光标位置上一行打开新行添加
复制代码
修改文本, 需告知有多少文本要修改, 可结合光标移动命令使用
cw                       光标到单词结尾要修改, 因此可以用英语单词的部分修改, 只要光标停留在需要修改的开始位置即可
c2b                      光标往前 2 个字符
c$ 或 C                  光标到本行结尾
c0                       光标到此行开头
cc                       修改整行文本
复制代码
替换文本
r                        替换一个字符
2r                       同时替换两个字符
R                        替换整行, 逐渐覆盖

s                        替换一个字符, 先删除字符, 并进入插入模式, 因此可以用于将一个字符替换为多个的情况
S                        替换整行, 先删除整行, 并进入插入模式
复制代码
修改大小写
~                        修改一个字符为大写或者小写
3~                       修改三个字符为大写或者小写
复制代码
删除文本, 需要告知有多少文本需要删除, 可结合光标移动命令使用
dw                      删除光标到单词尾部的字符, 包含单词尾部的空白
de                      删除光标到单词本身尾部的字符, 不包含尾部后边的空白
dE                      删除光标到单词尾部, 包含标点符号

db                      向前删除一个字符
d0                      删除光标到行开头的字符
d$ 或 D                 删除光标到结尾的字符

dd                      删除一整行字符
2dd                     删除两行字符

x                       x-ing out 打印机消除的意思, 删除一个字符
2x                      删除两个字符
X                       删除光标之前的一个字符
2X                      删除光标之前的两个字符
复制代码
误删恢复
u                       撤销上一个命令
3p                      将第三个缓冲区放到下一行, 默认保留九个缓冲区
ctrl-r                  重做一次撤销操作
复制代码
移动文本, 采用先删除后放置的方法
p                       将缓冲区文本放到光标之后, 单行则放到同一行, 多行缓冲区则另起一行
P                       将缓冲区文本放到光标之前
xp                      对调两个字符
复制代码
复制文本, 需要告知有多少文本需要复制, 可结合光标移动命令使用
yw                      复制光标到单词尾部的字符
y0                      复制光标到行开头的字符
y$                      复制光标到行结尾的字符
yy 或 Y                  复制整行内容
复制代码
重复命令, 每个命令均会被存储到一个临时的缓冲区, 直到发出下一个命令为主
.                       重复上一次的命令
复制代码
合并行
J                        合并两行, 将当前行与下一行合并
3J                       合并三行
复制代码
编辑命令
文本对象 更改 删除 复制
单个字符 r x yl
五个字符 5s 5x y5l
一个单词 cw dw yw
两个单词, 不包含标点符号 c2W d2W y2W
后退三个单词 c2b d2b y2b
一整行 cc dd yy
到一行的结尾 c$ 或 C d$ 或 D y$
到一行的开头 c0 d0 y0
光标移动命令
移动
命令
←↓↑→
hjkl
下一行第一个字符
+
上一行第一个字符
-
单词结尾
e 或 E
往前一个单词
w 或 W
往后一个单词
b 或 B
到一行的结尾
$
到一行的开头
0
往缓冲区放置文本
p 或 P
保存编辑结果并离开
ZZ
不保存编辑结果并离开
:q!
光标所在位置插入文本
i
一行开头插入文本
I
光标所在位置附加文本
a
一行最后附加文本
A
光标下一行打开新行
o
光标上一行打开新行
O
删除一行并替换文本
S
新文本覆盖现有文本
R
合并当前行与下一行
J
重复上一个动作
.
撤销上一个动作
u
复制代码

滚动屏幕
z-enter               移动当前行到屏幕顶端并滚动屏幕
z.                    移动当前行到屏幕中心并滚动屏幕
z-                    移动当前

ctrl-f                forward, 向上滚动一屏
ctrl-b                backward, 向下滚动一屏

ctrl-u                up, 向上滚动半屏
ctrl-d                down, 向下滚动半屏

100z                  将第一百行滚动到屏幕顶端
复制代码
光标在屏幕中移动
H                    high, 移到屏幕顶端的行
M                    middle, 移到屏幕中间的行
L                    low, 移到屏幕底部的行
10H                  移到屏幕顶端往下的第十行
10L                  移到屏幕底部往上的第十行
复制代码
根据搜索模式来移动
/                    向下匹配搜索
?                    向上匹配搜索
n                    往同一个方向重复搜索
N                    往相反方向重复搜索
复制代码
在当前行搜索
fx                   光标移到本行出现下一个 x 字符的地方
2fx                  搜索本行第二次出现 x 字符的地方
Fx                   光标移到本行出现上一个 x 字符的地方

tx                   光标移到本行出现下一个 x 字符的地方的前一个字符
Tx                   光标移到本行出现上一个 x 字符的地方的后一个字符

;                    重复上一个搜索命令, 方向相同
,                    重复下一个搜索命令, 方向相反

''                   回到上一个包含记号的行开头
``                   回到上一个记号或上下文
复制代码
百花齐放的打开文件
vi  +n  file        在第 n 行打开文件
vi  + file          在最后一行打开文件
vi  +/pattern file  在第一个出现 pattern 的地方打开文件
vi  -R  file        只读模式显示文件
vi  -r  file        恢复编辑缓冲区
复制代码
缓冲区使用
# vi 会将最后 9 次的删除操作保存在编号的缓冲区中, 1-9 的缓冲区, 1 表示最后一次的删除
# vi 会将复制的文本放在按字母标识的缓冲区中, a-z 的缓冲区

"1p                恢复最后一次的删除内容, 光标之后插入
"1pu.              逐一将缓冲区内容放置到当前光标之后, u会删除文本, .则重复放置, 不断轮换知道找到所需的文本

"dyy               将当前行复制到缓冲区 d 中, "加上缓冲区名字, 可以用于命名缓冲区
"dP                将缓冲区 d 中内容放置到光标之前
复制代码
对某一处做标记
mx                将当前位置标记成 x

'x                单引号, 将光标移动到 x 标记所在的第一行
''                两个单引号, 回到上一个标记或上下文所在行的开头

`x                反引号, 将光标移到以 x 标记的字符位置
``                两个反引号, 回到上一个标记或上下文的确切位置
复制代码
vi 缓冲区与标记命令
命令 意义
+n file 在第 n 行打开 file
+ file 在最后一行打开 file
+ /pattern file 在第一个出现 pattern 的地方打开 file
-c command file 在打开文件后执行命令, 通常是行号或者搜索模式, eg: vi -c /gitlab practice.txt
-R 用只读模式打开文件, 与 view 命令相同
-r 死机后恢复文件
1-9 最后 9 次删除操作的内容, 最后一次-最先一次
a-z 可以使用的命名缓冲区, 大写字母表示附加到缓冲区现有内容后
"b command 用缓冲区b 执行命令
mx 将当前位置标记为 x
'x 将光标移动到标记 x 所在行的第一个字符
~x 将光标移动到用 x 标记的字符
'' 回到上一个标记或上下文所在行的开头
`` 回到上一个标记或上下文的确切位置
ex 命令
:1p                         打印第 1 行
:1                          打印第 1 行
:1,3                        打印 1-3 行

:1s/GitLab/gitlab           替换第一行的 GitLab 为 gitlab
:s/GitLab/gitlab            在当前行替换 GitLab 为 gitlab

:vi                         ex 模式下转换为 vi 模式
Q                           vi 模式下转换为 ex 模式

:1,3d                       delete 可简写为 d, 删除第 1 行到第 3 行
:1m2                        move 可简写为 m, 将第 1 行移到第 2 行之后
:1co2                       copy 可简写为 co, 与 t 同意, 将第 1 行复制到第 2 行之后

:set nu                     number 可简写为 nu, 设置显示行号
:set nonu                   no number 可简写为 nobu, 禁用显示行号
:1,10#                      暂时显示 1-10 行的行号

:=                          列出文件的总行数
:.=                         列出当前所在行的行号
:/pattern/=                 列出 patter 第一次出现的行号

:.                          表示当前这一行
:$                          表示文件最后一行
:%                          表示文件中每一行
:.,+20#                     显示当前这一行以及向下 20 行直接的行号
复制代码
ex 搜索模式
:/pattern/d                 删除下一个包含 pattern 的行
:.,/pattern/d               删除当前行以及第一个包含 pattern 的行

:100, +5 p                 表示打印 当前行+5 到 100 行之间的内容
:100;+5 p                  打印 100-105 行之间的内容, 使用分号时候第一行地址会被当做当前光标的位置
:/pattern;+10 p            显示包含 pattern 行的后十行内容

:g/pattern                寻找文件中最后一次出现 pattern 的地方, g 表示全局, 可以让搜索模式显示并包含这个模式的所有行
:g/pattern/p              寻找并显示所有包含 pattern 的行
:g!/pattern/nu            寻找并显示不包含 pattern 的行, 并展示对应的行号
:1,10g/pattern            寻找 1-10 行中包含 pattern 的行

:1d | s/This/this         删除第一行, 并在当前行(原来的第二行)中替换 This 为 this
复制代码
ex 的保存于离开文件
:w                        将缓冲区内容写入到文件中, 但不离开
:q                        离开编辑器
:wq                       写入并离开,即使文件无任何修改也一样会写入
:x                        写入文件同时离开, 仅当有修改时才会写入
:!                        忽略警告, vi 会保护现有文件, 当需要将缓冲区内容写入到文件中会有警告产生

:w newfile               将缓冲区内容写入到新的文件, 原有的文件不会改变
:1,10w newfile           将缓冲区中 1-10 写入到新的文件
:1,10w >> newfile        将缓冲区 1-10 行内容附加到新文件中

:r newfle                read 可简写为 r, 将新文件内容读出并插入到光标所在位置的下一行
:2r newfile              将新文件内容插入到第 2 行之后
:0r newfile              将新文件内容插入到文件开头
复制代码
vi 多文件编辑
:n                      跳转到下一个文件
:first                  跳转到第一个文件
:last                   跳转到最后一个文件

:e filename             启动一个文件, 存在则打开, 不存在则新建, 可以 tab 补全
:e #                    回到上一个文件, 需要将缓冲区内容写入到文件

:w %.new                写入到当前文件, % 表示当前文件的文件名

ctrl-^                  效果同 :e # 切换到上一个文件

"f6yy -> :w -> :e new.txt -> "fp  ===>  复制光标以及后 6 行内容复制到缓冲区 f 中 -> 缓冲区写入到文件 -> 切换到 new.txt 文件 -> 复制缓冲区 f 中内容到光标后
:1,6ya a  -> :pu a    ===>    拖拽 1-6 行到缓冲区 a  -> 将缓冲区 a 中内容放置到当前光标之后, ya 为拖动命令,pu 为放置命令
复制代码
全局替换
:s/old/new                     substitute 可缩写为 s, 将当前这一行第一个出现模式 old 的字符串替换为 new, /用来分割各个命令, 最后一个/可省略
:s/old/new/g                   将当前这一行中所有的 old 替换为 new, g表示该行中所有模式, :g 表示文件中每一行
:1,10s/old/new/g               将 1-10 行中所有的 old 替换为 new
:%s/old/new/g                  通 :1,$s/old/new/g , 将整个文件的 old 替换为 new    
:1,10s/old/new/gc              替换 1-10 行中所有的 old, 每一个都需要确认
:g/pattern/s/old/new/g         遇到包含 pattern 的行时候将 old 替换为 new
:g/pattern/s//new/g            遇到包含 pattern 的行将 pattern 替换为 new, 此时直接用 :%s/pattern/new/g 即可
复制代码
搜索模式的元字符
.                    匹配任何单一字符, 包含空格, 除掉换行符
*                    匹配出位于此符号前的单一字符,该字符可以出现 0 到多个
^                    表示后边的正则表达式必须位于行开头
$                    表示正则表达式必须位于行结尾
\                    转义字符, 例如 \. 表示匹配 . 而不是任意字符
[]                   匹配出方括号中任意一个字符, [^a-z] 则表示匹配不是小写字母的字符, [] 中的 ^ 表示取反
\(\)                 将\(\)之间模式匹配到的内容保留到缓冲区, 一般可以保留一行中 9 个模式, 例如 \(That\) or \(this\) 则将 That 保留到缓冲区 1, this 到 2
\<\>                 匹配某些字符开头的单词, 例如 \<ac 只会匹配出以 ac开头的单词, 而 ac\> 只会匹配出以 ac 结尾的单词
~                    匹配任何上一次搜索所使用的正则表达式, 只能用于正则搜索, 即 /

[:alnum:]            字母与数字字符
[:alpha:]            字母字符
[:blank:]            空格与指标符
[:cnctrl:]           控制字符
[:digit:]            数字字符
[:graph:]            可打印的与可见的(不包括空格)字符, 不包括空白
[:print:]            可打印的字符, 包括空白
[:punct:]            标点符号
[:space:]            空白字符
[:upper:]            大写字符
[:xdigit:]           十六进制数字

\n                   利用\(\)存储的第 n 个模式的文字做代换, n 表示数字 1-9, 之前存储的模式是从左到右来计算
\                    将后面一个字符当做普通字符来看到
&                    用在替换字符串中时, 替换为搜索模式匹配出的完整模式, 例如 :%s/AAA/&, bbb 则替换字符串为 AAA, bbb
\u 或 \l             使替换字符串下一个字符变为大写或小写
\U 或 \L 或 \e 或\E   将后边的字符串或直到出现 \e 或 \E 为止, 全部替换为大写或者小写
复制代码
:set 命令
:set option            打开选项
:set nooption          关闭选项

:set ic                指定搜索模式忽略大小写
:set noic              指定搜索模式区分大小写

:set window=20         设置屏幕窗口显示的行数
:set wrapmargin        设置右边界距离, 用于自动换行

:set all               检查 vi 正在使用的选项
:set option?           查询指定选项的当前值

noignorecase           搜索时区分大小写
wrapscan               回到文件开头继续搜索, 表示在文件中任何一处开始搜索, 都可以找到符合的文本
magic                  模式匹配时候辨识通配符
autoindent             设置自动缩排, ctrl-t 下一层缩进, ctrl-d 上一层缩进
shiftwith=4            设置默认向左或向右为 4 个空格
tabstop                设置 tab 占用 4 个空格
list                   显示控制字符
showmatch              显示对应匹配的括号, 插入模式会有效果
mourse=a               多窗口下, 鼠标跟随
复制代码
exrc 文件, 无需 : 即可, 因为读入 exrc 文件的是 ex 读入的
主目录下的.exrc 文件中添加 set exrc 则 ex 可以读取当前目录下的.exrc 文件
:so .otherexrc        source 可缩写为 so, 加载其他的 exrc 文件
复制代码
执行 unix 命令
:!command             ! 会告诉 ex 创建一个shell, 且后续文本视为 uninx 命令
:!date                显示系统时间
:sh                   创建一个 shell, 可以执行多个 uninx 命令, 结束时按 ctrl-d 回到 vi

:r !command           read 可简写为 r, 可与 uninx 命令结合, 把 uninx命令的结果读入到文件中
:1r !date             将系统时间读入到文件第一行

:1,10 !sort           将 1-10 行排序
!)command             将下一句内容传递给 command
复制代码
单词缩写, 插入模式定义宏
ab mb Mobiuspace            设置 Mobiuspace 的缩写为 mb, 在 vi 中输入时会自动展开, 缩写的单词不能出现在所代表的词组的词尾
复制代码
命令缩写, 命令模式定义宏
:map x sequence             定义字符 x 映射到编辑命令 sequence
:unmap x                    取消定义给 x 的编辑命令 sequence
:map                        列出所有被映射的字符

:map v dwelp                dw 删除一个单词, e 移到下一个单词结尾, l 向右移动一个空格, p 将删除的单词放置到新位置
:map! - dw                  命令模式下强制覆盖 - 为 dw 命令
复制代码
使用 tag, uninx 有 ctags 命令可以与 vi 的:tag命令一起使用
:ctags *.c                 创建描述所有 c源代码文件的 tags 文件
:tag name                  在 tags 文件中寻找 name 的定义
复制代码
vim 启动
vim -d file1 file2        diff 缩写为 d, 以 diff 模式启动编辑文件
vim -o file1 file2        所有文件均各自打开窗口
复制代码
vim 多窗口编辑
:split                    水平分割当前窗口
ctrl-w -> s               水平分割当前窗口
:new                      水平分割当前窗口, 会自动适配一些配置

:vsplit                   垂直分割当前窗口

:[n]split [++opt] [cmd] [file]        n 为 vim 指定新窗口显示的行数

ctrl-w -> ctrl-j          移动到下一个窗口
ctrl-w -> ctrl-k          移动到上一个窗口
ctrl-w -> ctrl-h          移动到当前窗口左侧
ctrl-w -> ctrl-l          移动到当前窗口右侧

ctrl-w -> ctrl-p          移动到最后一次访问的窗口
ctrl-w -> ctrl-t          移动到最左上角的窗口
ctrl-w -> ctrl-b          移动到最右下角的窗口

ctrl-w -> +               当前窗口增加一行
:resize +2                当前窗口增加两行
复制代码
vim 缓冲区命令
:ls                     列出缓冲区文件
复制代码
文章分类
开发工具
文章标签