Vi 命令一览
移动光标
-
光标移动到上一行开头+
或<return>
光标移动到下一行开头0
当前行开头$
当前行末尾^
当前行第一个非空字符w
下一个单词的词首 W 忽略标点e
下一个单词的词尾 E …b
上一个单词的词首 B …(
移动到上一个句子)
下一个句子{
上一个段落}
下一个段落H
移动到屏幕顶部M
屏幕中间L
最后一行
数字组合
10w
向后移动10个单词
20j
向下移动20行
3{
向后移动3段
在编辑缓冲区移动
^F
向下移动一屏
^B
向上移动一屏
^D
向下移动半屏
^U
向上移动半屏
6^F
向下移动6屏
跳转到前一位置
``
或 ''
返回到前一个位置
ma
标识当前行名称为 “a”
`a
或 'a
即可跳转到标记开头
搜索模式
/
或者 ?
加要搜索的内容
/
向前搜索
?
向后搜索
n
下一个 N
上一个
行号
:set number
显示行号
:set nonumber
隐藏行号
100G
跳转到100行
gg
第一行 G
末尾一行
:100
跳转到100行
:$
最后一行
插入文本
i
光标前插入
a
光标后插入
I
当前行开头插入
A
当前行结尾插入
o
当前行下面插入一行
O
当前行上面插入一行
修改文本
ra
把光标上的单个字符修改为a
Rxxx<Esc>
R会切换到输入模式,键入的字符将被替换当前行的一个字符, 返回命令模式
s
(substitute, 替换) 使用多个字符替换光标上的字符
C
替换当前光标位置到本行结尾所有字符
S
或 cc
替换整行
c
move 从光标处替换到 move 所给出的位置处
替换文本
:s/pattern/replace/gc
当前行上替换 默认替换第一个匹配项,g(global 全局),替换本行所有匹配项; c(confirm, 确认) 替换前需要你同意
:45s/pattern/replace/
替换57行的第一个匹配项
:10,50s/pattern/replace/
10到50行
:.,$s/s/pattern/replace/g
当前行都结尾最后一行 . 代表当前行, $ 代表结尾最后一行
:%s/pattern/replace/g
替换所有行 % 代表所有行
删除文本
x
删除当前光标处字符
X
删除光标左边的一个字符
D
删除当前光标到本行结尾的字符
d
move 删除当前光标都 move 所在位置的字符
dd
删除当前行
:12d
删除12行 等价于 12dd
:12,34
删除12到34行
eg:
dw
删除一个单词
d10w
删除10个单词
d10W
删除10个单词(忽略标点)
db
向后删除1个单词
d2)
删除2个句子
d3}
删除5个段落
dG
删除到结尾
dgg
删除到开头
撤销或重复改变
u
撤销上一条命令
U
恢复当前行
.
重复上一命令对编辑缓冲区的修改
恢复删除
每删除一行或多行文本的时,vi 都将内容保存在一个特殊的存储区里,编号缓冲区。vi 有 9 个缓冲区。
任何时候,都可以将编号缓冲区的内容插入到编辑缓冲区里。
"1p
或 "2P
即可插入 p 在当前行下,P 在当前行上
tip: 编号缓冲区只存储删除的行,单个字符或多个字符不会保存在编号缓冲区
移动文本
vi 总有一个无名缓冲区,为上一次删除保存了一份副本。任何时候可以使用 p 或 P 将缓冲区的内容复制到编辑缓冲区中。
xp
调换两个字母的位置
deep
调换两个单词(光标处于第一个单词的左边)
ddp
调换两行
复制文本
分3步
y
、yy
或Y
命令将文本由编辑缓冲区复制到无名缓冲区,但不删除原始文本。- 光标移动到插入到希望插入文本的位置。
- 使用
p
或P
插入。
y
(yank 接出) 和 d
命令工作方式一样
yw
接出一个单词
y10W
10个单词
yb
向前接出一个单词
y2)
接出2个句子
y5}
接出5个段落
yy
接出1行
12yy
接出12行 等价于 12Y
y$
接出到行尾部
y0
接出到行开头
改变字母大小写
~
改变当前字母大小写,并向后移动一个位置
7~
重复7次~
设置选项
:set [no]option...
:set option[=value]...
# 显示输入提醒
:set showmode
:set noshowmode
# 显示行号
:set number
:set nonumber
# 选项是变量的
:set tabstop=4
显示选项
:set [option[?]... | all]
# 显示所有选项的值
:set all
:set number?
键入过程自动换行
:set wrapmargin=n
/ :set wm=n
n 是从右边边缘算起开始换行的位置
:set wm=l
文本尽可能的长
:set wm=0
关闭自动换行
:set autoindent
文本自动缩进
分隔和连接行
r<Return>
长行分割短行, r
可以将一个字符替换成另外一个字符,此处将 空格符 替换成 换行符
J
可以将当前行和下一行合并到一个长行 (默认会在单词之间插入一个空格,句子行尾插入两个空格)
3J
合并一下三行
复制和移动行
指定行号的复制和移动可以使用 ex 命令 :co
(copy, 复制) :m
(move , 移动)。
:_x[,y]co_z x,y,z 代表行号
:_x[,y]m_z
:5co10
复制5行插入到第10行下面
:6,9co15
复制第6行至第9行,插入到第15行下面
:5m10
移动第5行,插入到第10行下面
4,8m12
移动第4行至第9行,插入到第12行下面
和其他 ex 命令一样 .
代表当前行,$
代表最后一行:
:1,.m$
将第1行至当前行,移动到编辑缓冲区末尾
:.,$m0
将当前行至末尾,移动到编辑缓冲区开头
输出 shell 命令
:!
+ 希望运行的命令,vi 将命令发送给 shell 执行,当命令结束后吗,控制将返回 vi。:!date
输出日期:!!
重复上一条命令
- 有时候希望输入 不止1条 shell 命令。这时候可以启动一个 新的shell 。
:sh
启动一个新的 shell 副本,^D
或 输入exit
命令后返回 vi 中。:!bash
启动一个 Bash shell ,:!tcsh
启动一个 Tcsh shell
将文件的数据插入编辑缓冲区
:[line]r file
line 行号,file 文件名称
:10r info
将 info 的文件内容插入到第 10 行之后
:0r info
0 表示开头
:$r info
$ 表示结尾
r info
省略了行号,vi 将数据插入到当前行之后
将shell 命令输出插入到编辑缓冲区
:r !ls
将 ls 的结果插入到编辑缓冲区
:0r !date
在第一行插入当前时间和日期
使用程序处理数据
使用 !
和 !!
命令可以将编辑缓冲区的行发送给另一个程序。该程序的输出将替换原始行。
5!!sort
排序当前光标的下5行数据
10!!fmt
从当前行开始格式化10行
!
+ 光标移动命令 + 程序名称。
!}fmt
格式化当前行至段落末尾之间的文本
gg
、1G
+!Gfmt
格式化整个编辑缓冲区
将数据写入文件
:w
数据写入原始文件
:w file
将数据写入新文件
:w! file
覆盖已有文件
:w>> file
追加数据到文件
:10w! file
将第10行数据写入文
:10,20w >> file
将10到20行数据追加到文件里
切换文件
编辑文件时,不必退出重启 vi ,切换到另一个新文件。确保之前编辑缓冲区内容的保存(:w
)。
:e document
编辑指定文件
:e!
重新编辑当前文件,忽略自动检查,即放弃未保存的修改
:e! file
编辑指定文件,忽略自动检查
使用缩写
为经常使用的单词或表达式,创建缩写。
:ab [short long]
short 是缩写,long是对应的原文
:ab puf public function
单独键入 puf
时,vi 将会自动转换成 public function
:una puf
删除缩写
:ab
查看目前所有缩写列表
宏
:map
可以创建单字符命令,即宏(macro).
:map [x commands]
x 是单个字符, commands
是 vi
或 ex
命令.
:map X dd
创建一个 X 的宏, 这个宏删除当前的行。
:map * I/* ^V<Esc>A */^V<Esc>
创建 * 的宏,将该行用 /*
和 */
包裹起来, 即注释掉.
:map
显示所有的宏列表
:unmap X
移除宏
初始化文件
vi 或 vim 启动时, 会在 home 目录查找初始化文件. 如果存在就读取并执行查找到的任何 ex 命令.
vi 的初始化文件名为 .exrc (rc 代表 ‘run commands’) .
vim 的初始化文件名为 .vimrc
vim 首先查找 .vimrc, 如果不存在 , 则查找 .exrc . 如果同时存在, vim 只会读取 .vimrc 文件.
初始化文件, "
字符开头的将被忽略, 可以作为注释.
" ======================
"sample vi/vim init file
" =======================
"
" 1. options
set autoindent
set compatible
set ignorecase
set showmatch
set showmode
set wrapmargin=6
"
" 2. abbreviation
ab puf public function
ab prf private function
"
" 3. macros
map K deep
map X dd
"
" 4. shell commands
!date; sleep 2
使用两个初始化文件
vi/vim 启动时, 会在执行 home 目录的初始化文件. 然后检查 exrc 选项的状态. 如果选项打开, 那么程序将在工作目录(即当前目录)查找第二个初始化文件。
通过这种方式,可是使各个目录都有自己的初始化文件,从而组织各个文件。
vim 增强内容
- 屏幕拆分
- 多级撤销
- 支持鼠标
- GUI
- 命令行历史
- 命令行补全
- 文件名补全
- 搜索历史
- 语法高亮
- 高亮显示:选取文本行、文本块,然后再对文本进行操作
- 多缓冲区
- 支持宏:记录、修改和运行宏的工具
- 内置脚本
- 自动命令:自动执行的预定义命令