目录

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 替换当前光标位置到本行结尾所有字符

Scc 替换整行

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步

  1. yyyY 命令将文本由编辑缓冲区复制到无名缓冲区,但不删除原始文本。
  2. 光标移动到插入到希望插入文本的位置。
  3. 使用 pP 插入。

y  (yank 接出) 和 d 命令工作方式一样

yw 接出一个单词

y10W 10个单词

yb 向前接出一个单词

y2) 接出2个句子

y5} 接出5个段落

yy 接出1行

12yy 接出12行 等价于 12Y

y$ 接出到行尾部

y0 接出到行开头

~ 改变当前字母大小写,并向后移动一个位置

7~ 重复7次~

shell

:set [no]option...
:set option[=value]...

# 显示输入提醒
:set showmode
:set noshowmode

# 显示行号
:set number
:set nonumber 

# 选项是变量的
:set tabstop=4

shell

: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 将当前行至末尾,移动到编辑缓冲区开头

  1. :! + 希望运行的命令,vi 将命令发送给 shell 执行,当命令结束后吗,控制将返回 vi。
    1. :!date 输出日期
    2. :!! 重复上一条命令
  2. 有时候希望输入 不止1条 shell 命令。这时候可以启动一个 新的shell 。
    1. :sh 启动一个新的 shell 副本,^D 或 输入 exit 命令后返回 vi 中。
    2. :!bash 启动一个 Bash shell ,:!tcsh 启动一个 Tcsh shell

:[line]r file line 行号,file  文件名称

:10r info 将 info 的文件内容插入到第 10 行之后

:0r info 0 表示开头

:$r info $ 表示结尾

r info 省略了行号,vi 将数据插入到当前行之后

:r !ls  将 ls 的结果插入到编辑缓冲区

:0r !date 在第一行插入当前时间和日期

使用 !!! 命令可以将编辑缓冲区的行发送给另一个程序。该程序的输出将替换原始行。

5!!sort 排序当前光标的下5行数据

10!!fmt 从当前行开始格式化10行

! + 光标移动命令 + 程序名称。

!}fmt 格式化当前行至段落末尾之间的文本

gg1G +!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 是单个字符, commandsviex 命令.

: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 文件.

初始化文件, " 字符开头的将被忽略, 可以作为注释.

shell

" ======================
"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 选项的状态. 如果选项打开, 那么程序将在工作目录(即当前目录)查找第二个初始化文件。

通过这种方式,可是使各个目录都有自己的初始化文件,从而组织各个文件。

  1. 屏幕拆分
  2. 多级撤销
  3. 支持鼠标
  4. GUI
  5. 命令行历史
  6. 命令行补全
  7. 文件名补全
  8. 搜索历史
  9. 语法高亮
  10. 高亮显示:选取文本行、文本块,然后再对文本进行操作
  11. 多缓冲区
  12. 支持宏:记录、修改和运行宏的工具
  13. 内置脚本
  14. 自动命令:自动执行的预定义命令