1
跳行
number
按字符光标移动
1h/l 左/右 移动一个字符24l 向右 4 个字符
基础操作
1ZZ 或 :wq 保存并退出2:e! 恢复到上一次存储的文件内容3:w pathname/filename 写入到其他文件中4:rf pathname/filename 删除其他文件5:!ls pathname 查看其他目录使用情况6:sh -> ctrl-d 或 exit 创建对应的 shell 执行其任务后再返回7ctrl-z -> fg 暂停 vi 后执行对应的任务后再返回
按行光标移动
10 移动到行首2$ 移动到行尾3^ 移到当前行第一个非空格处410| 移到当前行第 10 列56j/k 上一行/下一行72j 向上移动 2 行89G 移动到文件的结尾101G 移动到文件的第一行11ctrk-g 屏幕底部显示信息, 包含行号, 文件总行数, 当前位置占全文的百分比
按照文本块移动
1w 移动一个单词, 包含符号与标点2W 移动一个单词, 不包含符号与标点32w 移动两个单词45b 倒退一个单词, 包含符号与标点6B 倒退一个单词, 不好干符号与标点78e 移到单词的尾部9E 移到单词的尾部, 忽略标点符号1011( 移到当前句子的开头, 标点符号后有两个空格或者一行的最后一个非空格字符时候为一个句子12) 移到下一个句子的开头133) 向上移动 3 个句子1415{ 移到当前这一段的开头, 段落指的是空白行下的文本16} 移到下一段的开头1718[[ 移到当前这一节的开头19]] 移到下一节的开头
简单的文件编辑
1i insert, 插入2a add, 添加3c change, 更改4d delete, 删除后放到缓冲区5p paste, 粘贴, d -> p 可以移动行6y 复制78cw 表示更改整个单词910x 删除一个字符11r 重写改写一个字符
添加文本
1a 光标之后添加2A 行结尾添加34i 光标之前添加5I 行开头添加67o 光标位置下一行打开新行添加8O 光标位置上一行打开新行添加
修改文本, 需告知有多少文本要修改, 可结合光标移动命令使用
1cw 光标到单词结尾要修改, 因此可以用英语单词的部分修改, 只要光标停留在需要修改的开始位置即可2c2b 光标往前 2 个字符3c$ 或 C 光标到本行结尾4c0 光标到此行开头5cc 修改整行文本
替换文本
1r 替换一个字符22r 同时替换两个字符3R 替换整行, 逐渐覆盖45s 替换一个字符, 先删除字符, 并进入插入模式, 因此可以用于将一个字符替换为多个的情况6S 替换整行, 先删除整行, 并进入插入模式
修改大小写
1~ 修改一个字符为大写或者小写23~ 修改三个字符为大写或者小写
删除文本, 需要告知有多少文本需要删除, 可结合光标移动命令使用
1dw 删除光标到单词尾部的字符, 包含单词尾部的空白2de 删除光标到单词本身尾部的字符, 不包含尾部后边的空白3dE 删除光标到单词尾部, 包含标点符号45db 向前删除一个字符6d0 删除光标到行开头的字符7d$ 或 D 删除光标到结尾的字符89dd 删除一整行字符102dd 删除两行字符1112x x-ing out 打印机消除的意思, 删除一个字符132x 删除两个字符14X 删除光标之前的一个字符152X 删除光标之前的两个字符
误删恢复
1u 撤销上一个命令23p 将第三个缓冲区放到下一行, 默认保留九个缓冲区3ctrl-r 重做一次撤销操作
移动文本, 采用先删除后放置的方法
1p 将缓冲区文本放到光标之后, 单行则放到同一行, 多行缓冲区则另起一行2P 将缓冲区文本放到光标之前3xp 对调两个字符
复制文本, 需要告知有多少文本需要复制, 可结合光标移动命令使用
1yw 复制光标到单词尾部的字符2y0 复制光标到行开头的字符3y$ 复制光标到行结尾的字符4yy 或 Y 复制整行内容
重复命令, 每个命令均会被存储到一个临时的缓冲区, 直到发出下一个命令为主
1. 重复上一次的命令
合并行
1J 合并两行, 将当前行与下一行合并23J 合并三行
编辑命令
文本对象 | 更改 | 删除 | 复制 |
单个字符 | 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 |
光标移动命令
1移动2命令3←↓↑→4hjkl5下一行第一个字符6+7上一行第一个字符8-9单词结尾10e 或 E11往前一个单词12w 或 W13往后一个单词14b 或 B15到一行的结尾16$17到一行的开头18019往缓冲区放置文本20p 或 P21保存编辑结果并离开22ZZ23不保存编辑结果并离开24:q!25光标所在位置插入文本26i27一行开头插入文本28I29光标所在位置附加文本30a31一行最后附加文本32A33光标下一行打开新行34o35光标上一行打开新行36O37删除一行并替换文本38S39新文本覆盖现有文本40R41合并当前行与下一行42J43重复上一个动作44.45撤销上一个动作46u
滚动屏幕
1z-enter 移动当前行到屏幕顶端并滚动屏幕2z. 移动当前行到屏幕中心并滚动屏幕3z- 移动当前45ctrl-f forward, 向上滚动一屏6ctrl-b backward, 向下滚动一屏78ctrl-u up, 向上滚动半屏9ctrl-d down, 向下滚动半屏101112100z 将第一百行滚动到屏幕顶端
光标在屏幕中移动
1H high, 移到屏幕顶端的行2M middle, 移到屏幕中间的行3L low, 移到屏幕底部的行410H 移到屏幕顶端往下的第十行510L 移到屏幕底部往上的第十行
根据搜索模式来移动
1/ 向下匹配搜索2? 向上匹配搜索3n 往同一个方向重复搜索4N 往相反方向重复搜索
在当前行搜索
1fx 光标移到本行出现下一个 x 字符的地方22fx 搜索本行第二次出现 x 字符的地方3Fx 光标移到本行出现上一个 x 字符的地方45tx 光标移到本行出现下一个 x 字符的地方的前一个字符6Tx 光标移到本行出现上一个 x 字符的地方的后一个字符78; 重复上一个搜索命令, 方向相同9, 重复下一个搜索命令, 方向相反1011'' 回到上一个包含记号的行开头12`` 回到上一个记号或上下文
百花齐放的打开文件
1vi +n file 在第 n 行打开文件2vi + file 在最后一行打开文件3vi +/pattern file 在第一个出现 pattern 的地方打开文件4vi -R file 只读模式显示文件5vi -r file 恢复编辑缓冲区
缓冲区使用
1# vi 会将最后 9 次的删除操作保存在编号的缓冲区中, 1-9 的缓冲区, 1 表示最后一次的删除2# vi 会将复制的文本放在按字母标识的缓冲区中, a-z 的缓冲区34"1p 恢复最后一次的删除内容, 光标之后插入5"1pu. 逐一将缓冲区内容放置到当前光标之后, u会删除文本, .则重复放置, 不断轮换知道找到所需的文本67"dyy 将当前行复制到缓冲区 d 中, "加上缓冲区名字, 可以用于命名缓冲区8"dP 将缓冲区 d 中内容放置到光标之前
对某一处做标记
1mx 将当前位置标记成 x23'x 单引号, 将光标移动到 x 标记所在的第一行4'' 两个单引号, 回到上一个标记或上下文所在行的开头56`x 反引号, 将光标移到以 x 标记的字符位置7`` 两个反引号, 回到上一个标记或上下文的确切位置
ex 命令
1:1p 打印第 1 行2:1 打印第 1 行3:1,3 打印 1-3 行45:1s/GitLab/gitlab 替换第一行的 GitLab 为 gitlab6:s/GitLab/gitlab 在当前行替换 GitLab 为 gitlab78:vi ex 模式下转换为 vi 模式9Q vi 模式下转换为 ex 模式1011:1,3d delete 可简写为 d, 删除第 1 行到第 3 行12:1m2 move 可简写为 m, 将第 1 行移到第 2 行之后13:1co2 copy 可简写为 co, 与 t 同意, 将第 1 行复制到第 2 行之后1415:set nu number 可简写为 nu, 设置显示行号16:set nonu no number 可简写为 nobu, 禁用显示行号17:1,10# 暂时显示 1-10 行的行号1819:= 列出文件的总行数20:.= 列出当前所在行的行号21:/pattern/= 列出 patter 第一次出现的行号2223:. 表示当前这一行24:$ 表示文件最后一行25:% 表示文件中每一行26:.,+20# 显示当前这一行以及向下 20 行直接的行号
ex 搜索模式
1:/pattern/d 删除下一个包含 pattern 的行2:.,/pattern/d 删除当前行以及第一个包含 pattern 的行34:100, +5 p 表示打印 当前行+5 到 100 行之间的内容5:100;+5 p 打印 100-105 行之间的内容, 使用分号时候第一行地址会被当做当前光标的位置6:/pattern;+10 p 显示包含 pattern 行的后十行内容78:g/pattern 寻找文件中最后一次出现 pattern 的地方, g 表示全局, 可以让搜索模式显示并包含这个模式的所有行9:g/pattern/p 寻找并显示所有包含 pattern 的行10:g!/pattern/nu 寻找并显示不包含 pattern 的行, 并展示对应的行号11:1,10g/pattern 寻找 1-10 行中包含 pattern 的行1213:1d | s/This/this 删除第一行, 并在当前行(原来的第二行)中替换 This 为 this14ex 的保存于离开文件15:w 将缓冲区内容写入到文件中, 但不离开16:q 离开编辑器17:wq 写入并离开,即使文件无任何修改也一样会写入18:x 写入文件同时离开, 仅当有修改时才会写入19:! 忽略警告, vi 会保护现有文件, 当需要将缓冲区内容写入到文件中会有警告产生2021:w newfile 将缓冲区内容写入到新的文件, 原有的文件不会改变22:1,10w newfile 将缓冲区中 1-10 写入到新的文件23:1,10w >> newfile 将缓冲区 1-10 行内容附加到新文件中2425:r newfle read 可简写为 r, 将新文件内容读出并插入到光标所在位置的下一行26:2r newfile 将新文件内容插入到第 2 行之后27:0r newfile 将新文件内容插入到文件开头28vi 多文件编辑29:n 跳转到下一个文件30:first 跳转到第一个文件31:last 跳转到最后一个文件3233:e filename 启动一个文件, 存在则打开, 不存在则新建, 可以 tab 补全34:e # 回到上一个文件, 需要将缓冲区内容写入到文件3536:w %.new 写入到当前文件, % 表示当前文件的文件名3738ctrl-^ 效果同 :e # 切换到上一个文件3940"f6yy -> :w -> :e new.txt -> "fp ===> 复制光标以及后 6 行内容复制到缓冲区 f 中 -> 缓冲区写入到文件 -> 切换到 new.txt 文件 -> 复制缓冲区 f 中内容到光标后41:1,6ya a -> :pu a ===> 拖拽 1-6 行到缓冲区 a -> 将缓冲区 a 中内容放置到当前光标之后, ya 为拖动命令,pu 为放置命令
全局替换
1:s/old/new substitute 可缩写为 s, 将当前这一行第一个出现模式 old 的字符串替换为 new, /用来分割各个命令, 最后一个/可省略2:s/old/new/g 将当前这一行中所有的 old 替换为 new, g表示该行中所有模式, :g 表示文件中每一行3:1,10s/old/new/g 将 1-10 行中所有的 old 替换为 new4:%s/old/new/g 通 :1,$s/old/new/g , 将整个文件的 old 替换为 new5:1,10s/old/new/gc 替换 1-10 行中所有的 old, 每一个都需要确认6:g/pattern/s/old/new/g 遇到包含 pattern 的行时候将 old 替换为 new7:g/pattern/s//new/g 遇到包含 pattern 的行将 pattern 替换为 new, 此时直接用 :%s/pattern/new/g 即可
搜索模式的元字符
1. 匹配任何单一字符, 包含空格, 除掉换行符2* 匹配出位于此符号前的单一字符,该字符可以出现 0 到多个3^ 表示后边的正则表达式必须位于行开头4$ 表示正则表达式必须位于行结尾5\ 转义字符, 例如 \. 表示匹配 . 而不是任意字符6[] 匹配出方括号中任意一个字符, [^a-z] 则表示匹配不是小写字母的字符, [] 中的 ^ 表示取反7\(\) 将\(\)之间模式匹配到的内容保留到缓冲区, 一般可以保留一行中 9 个模式, 例如 \(That\) or \(this\) 则将 That 保留到缓冲区 1, this 到 28\<\> 匹配某些字符开头的单词, 例如 \<ac 只会匹配出以 ac开头的单词, 而 ac\> 只会匹配出以 ac 结尾的单词9~ 匹配任何上一次搜索所使用的正则表达式, 只能用于正则搜索, 即 /1011[:alnum:] 字母与数字字符12[:alpha:] 字母字符13[:blank:] 空格与指标符14[:cnctrl:] 控制字符15[:digit:] 数字字符16[:graph:] 可打印的与可见的(不包括空格)字符, 不包括空白17[:print:] 可打印的字符, 包括空白18[:punct:] 标点符号19[:space:] 空白字符20[:upper:] 大写字符21[:xdigit:] 十六进制数字2223\n 利用\(\)存储的第 n 个模式的文字做代换, n 表示数字 1-9, 之前存储的模式是从左到右来计算24\ 将后面一个字符当做普通字符来看到25& 用在替换字符串中时, 替换为搜索模式匹配出的完整模式, 例如 :%s/AAA/&, bbb 则替换字符串为 AAA, bbb26\u 或 \l 使替换字符串下一个字符变为大写或小写27\U 或 \L 或 \e 或\E 将后边的字符串或直到出现 \e 或 \E 为止, 全部替换为大写或者小写
:set 命令
1:set option 打开选项2:set nooption 关闭选项34:set ic 指定搜索模式忽略大小写5:set noic 指定搜索模式区分大小写67:set window=20 设置屏幕窗口显示的行数8:set wrapmargin 设置右边界距离, 用于自动换行910:set all 检查 vi 正在使用的选项11:set option? 查询指定选项的当前值1213noignorecase 搜索时区分大小写14wrapscan 回到文件开头继续搜索, 表示在文件中任何一处开始搜索, 都可以找到符合的文本15magic 模式匹配时候辨识通配符16autoindent 设置自动缩排, ctrl-t 下一层缩进, ctrl-d 上一层缩进17shiftwith=4 设置默认向左或向右为 4 个空格18tabstop 设置 tab 占用 4 个空格19list 显示控制字符20showmatch 显示对应匹配的括号, 插入模式会有效果21mourse=a 多窗口下, 鼠标跟随
exrc 文件, 无需 : 即可, 因为读入 exrc 文件的是 ex 读入的
1主目录下的.exrc 文件中添加 set exrc 则 ex 可以读取当前目录下的.exrc 文件2: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
单词缩写, 插入模式定义宏
1ab mb Mobiuspace 设置 Mobiuspace 的缩写为 mb, 在 vi 中输入时会自动展开, 缩写的单词不能出现在所代表的词组的词尾2命令缩写, 命令模式定义宏3:map x sequence 定义字符 x 映射到编辑命令 sequence4:unmap x 取消定义给 x 的编辑命令 sequence5:map 列出所有被映射的字符67:map v dwelp dw 删除一个单词, e 移到下一个单词结尾, l 向右移动一个空格, p 将删除的单词放置到新位置8:map! - dw 命令模式下强制覆盖 - 为 dw 命令
使用 tag, uninx 有 ctags 命令可以与 vi 的:tag命令一起使用
1:ctags *.c 创建描述所有 c源代码文件的 tags 文件2:tag name 在 tags 文件中寻找 name 的定义
vim 启动
1vim -d file1 file2 diff 缩写为 d, 以 diff 模式启动编辑文件2vim -o file1 file2 所有文件均各自打开窗口
vim 多窗口编辑
1:split 水平分割当前窗口2ctrl-w -> s 水平分割当前窗口3:new 水平分割当前窗口, 会自动适配一些配置45:vsplit 垂直分割当前窗口67:[n]split [++opt] [cmd] [file] n 为 vim 指定新窗口显示的行数89ctrl-w -> ctrl-j 移动到下一个窗口10ctrl-w -> ctrl-k 移动到上一个窗口11ctrl-w -> ctrl-h 移动到当前窗口左侧12ctrl-w -> ctrl-l 移动到当前窗口右侧1314ctrl-w -> ctrl-p 移动到最后一次访问的窗口15ctrl-w -> ctrl-t 移动到最左上角的窗口16ctrl-w -> ctrl-b 移动到最右下角的窗口1718ctrl-w -> + 当前窗口增加一行19:resize +2 当前窗口增加两行
vim 缓冲区命令
1:ls 列出缓冲区文件