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 替换整行
cmove 从光标处替换到 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 删除当前光标到本行结尾的字符
dmove 删除当前光标都 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
- 命令行历史
- 命令行补全
- 文件名补全
- 搜索历史
- 语法高亮
- 高亮显示:选取文本行、文本块,然后再对文本进行操作
- 多缓冲区
- 支持宏:记录、修改和运行宏的工具
- 内置脚本
- 自动命令:自动执行的预定义命令