vi 被称做是“编辑器之神”,是 unix 家族中功能最强大的文字编辑器,让用户只要使用键盘就可以完成所有的编辑操作。而 vim 则是 vi 的加强版,在 Windows 上也找得到 vim 的芳踪。
vi 有分为功能模式、编辑模式、命令列模式...操作上有众多的指令经常令初学者却步! 它的指令还有区分大小写,以下是我所整理出来那些令人却步的指令:
- 以下指令的前面标记 * 表示为常用指令。
- 若指令的第一个字符为 : 或 / 或 ? 表示要在“命令列”输入,通常是先按 ESC 就回到功能模式,直接输入指令就会切换到最下方的命令列,输入完要按 Enter 才会执行。
档案功能
|
指令 |
说明 |
* |
:e 档案名称 |
编辑档案 (档案名称输入 . 或路径表示列出目录下的档案) |
* |
:e! |
还原至档案编修前的状态 |
|
:Ex |
列出目前目录下的档案 |
|
:Ex 路径 |
列出指定路径下的档案 |
* |
:w |
存盘 (加 ! 表示强制存盘) |
* |
:w 档案名称 |
另存新档 |
* |
:q |
退出 vi (加 ! 表示不存盘强制退出) |
* |
:wq |
存盘并退出 vi |
* |
:x |
存盘并退出 vi |
|
:w !sudo tee % |
当你编辑好档案要存盘时,却发现没有写入档案的权限! 用这会指令可以让你直接以 root 的权限存盘 |
|
:r 档案名称 |
读入档案内容,并加到光标行的后面 |
* |
:n |
切换到下一个开启的档案 |
* |
:N |
切换到上一个开启的档案 |
* |
:set nu |
设定显示行号 |
* |
:set nonu |
取消行号显示 |
* |
:files |
列出所有开启的档案 |
进入编辑模式
|
指令 |
说明 |
* |
a |
在光标位置后进入编辑模式 |
* |
A |
在光标行的最后一个字符进入编辑模式 |
* |
i |
在光标位置进入编辑模式 |
|
I |
在光标行的第一个非空白字符进入编辑模式 |
* |
o |
向下新增一行,并进入编辑模式 |
|
O |
向上新增一行,并进入编辑模式 |
|
cc |
删除光标行,并进入编辑模式 |
* |
ESC |
取消指令或退出编辑模式 |
光标移动
|
指令 |
说明 |
* |
gg |
移到第一行 |
* |
G |
移到最后一行 |
* |
:行数 |
移动到第 n 行 |
* |
行数 → G |
移动到第 n 行 |
|
0 |
移动到该行最前面 |
|
$ |
移动到该行最后面 |
|
字数 → Space |
向右移动 n 个字符 |
* |
行数 → Enter |
向下移动 n 行 |
|
h |
向左移动 |
|
j |
向下移动 |
|
k |
向上移动 |
|
l |
向左移动 |
标记与复制
|
指令 |
说明 |
* |
v |
开始字串标记 |
* |
V |
开始行标记 |
* |
v → Ctrl + V |
开始区块标记 |
* |
d |
删除标记的内容 |
* |
y |
复制标记的内容 |
* |
yy |
复制光标行 |
|
yG |
复制光标行到最后一行 |
|
y1G |
复制光标行到第一行 |
|
y$ |
复制光标处到最后一个字符 |
|
y0 |
复制光标处到第一个字符 |
* |
p |
在下一行贴上复制或删除的内容 |
|
P |
在上一行贴上复制或删除的内容 |
* |
Ctrl + R → 0 |
在下一行贴上复制或删除的内容,适用于编辑模式及指令行 |
删除
|
指令 |
说明 |
* |
dd |
删除光标行 |
* |
行数 → dd |
删除 n 行 |
* |
dG |
删除光标行到最后一行 |
|
d1G |
删除光标行到第一行 |
* |
d$ |
删除光标处到最后一个字符 |
|
d0 |
删除光标处到第一个字符 |
搜寻与取代
|
指令 |
说明 |
* |
/搜寻字串 |
向下搜寻字串 |
* |
/\c搜寻字串 |
向下搜寻字串,不分大小写 |
|
?搜寻字串 |
向上搜寻字串 |
|
?\c搜寻字串 |
向上搜寻字串,不分大小写 |
* |
n |
继续下一个全文搜寻的结果 |
* |
N |
继续上一个全文搜寻的结果 |
* |
* |
先将光标移至你想要搜寻的字串,输入 * 就会直接向下搜寻与光标处相同的字串 |
* |
:起始行,终止行s/搜寻字串/取代字串/gic |
从第 n 行到第 n 行取代字串 (后面的 g 表示整行全部, i 不分大小写 c 询问) |
* |
:1,$s/搜寻字串/取代字串/gic |
全部取代字串 (后面的 g 表示整行全部, i 不分大小写 c 询问) |
|
:noh |
清除搜寻结果 |
* |
:set ic |
设定全文搜寻时不分大小写 |
* |
:set noic |
设定全文搜寻时要分大小写 |
* |
f → 搜寻字符 |
向下搜寻字符 (限同一行) |
* |
F → 搜寻字符 |
向上搜寻字符 (限同一行) |
视窗分割
|
指令 |
说明 |
* |
:new |
新增水平分割视窗 |
* |
:new 档案名称 |
新增水平分割视窗,并加载档案 (档案名称输入 . 或路径表示列出目录下的档案) |
* |
:vnew |
新增垂直分割视窗 |
* |
:vnew 档案名称 |
新增垂直分割视窗,并加载档案 (档案名称输入 . 或路径表示列出目录下的档案) |
|
:sp |
新增水平分割视窗,并在新视窗加载目前的档案 |
|
:sp 档案名称 |
新增水平分割视窗,并加载档案 (档案名称输入 . 或路径表示列出目录下的档案) |
|
:vsp |
新增垂直分割视窗,并在新视窗加载目前的档案 |
|
:vsp 档案名称 |
新增垂直分割视窗,并加载档案 (档案名称输入 . 或路径表示列出目录下的档案) |
|
:Hex |
新增水平分割视窗,并列出目前目录下的档案 |
|
:Hex 路径 |
新增水平分割视窗,并列出指定路径下的档案 |
|
:Vex |
新增垂直分割视窗,并列出目前目录下的档案 |
|
:Vex 路径 |
新增垂直分割视窗,并列出指定路径下的档案 |
* |
Ctrl + W → 方向键 |
切换视窗 |
* |
:only |
仅保留目前的视窗 |
页签
|
指令 |
说明 |
* |
:tabe |
新增页签 |
* |
:tabe 档案名称 |
新增页签,并加载档案 (档案名称输入 . 或路径表示列出目录下的档案) |
|
:Tex |
新增页签,并列出目前目录下的档案 |
|
:Tex 路径 |
新增页签,并列出指定路径下的档案 |
|
:tabc |
关闭目前的页签,等同 :q |
|
:tabo |
关闭所有页签 |
|
:tabn |
移至下一个页签 |
|
:tabp |
移至上一个页签 |
* |
gt |
移至下一个页签 |
* |
gT |
移至上一个页签 |
* |
:tabfirst |
移至第一个页签 |
* |
:tablast |
移至最后一个页签 |
* |
:tabm 页签编号 |
移至特定编号的页签 (编号从 0 开始) |
|
:tabs |
列出所有页签 |
其它指令
|
指令 |
说明 |
* |
J |
将光标行与下一行合并 |
* |
u |
复原上一次的操作 |
* |
Ctrl + R |
重做上一次的操作 |
|
Ctrl + A |
将光标处的数字递增 |
|
Ctrl + X |
将光标处的数字递减 |
* |
Ctrl + N |
自动补齐曾输入过的单字 |
* |
. |
重复上一个指令 |
|
! 命令 |
执行 linux 指令,并显示执行结果 |
|
TOhtml |
将目前编辑的档案转换成 HTML 原始码 (会新增一个水平分割视窗) |
档案浏览器操作
请先以 :Ex 相关指令进入档案浏览器
|
指令 |
说明 |
* |
- |
到上层目录 |
* |
d |
建立目录 |
* |
D |
删除目录 |
* |
R |
重新命名 |
* |
s |
切换排序方式 |
|
r |
切换升幂/降幂排序 |
|
i |
切换档案的排列方式 |
* |
/ |
搜寻字串 |
|
x |
执行档案 |
* |
o |
新增水平视窗 |
* |
v |
新增垂直视窗 |
vim 的设定档
通常我会编辑 /etc/vimrc,在档案最后加入:
" 显示列号
set number
" 语法高亮度显示
syntax on
" 标记搜寻到的字串
set hlsearch
" 自动缩排
set autoindent
" 显示说明
set ruler
" 显示编辑状态
set showmode
" 设定注解的颜色
highlight Comment ctermfg=cyan
" 设定搜寻到的字串颜色
highlight Search term=reverse ctermbg=4 ctermfg=7
" 设定 tab 键的字符数
set tabstop=4
参考网页
相关
果然是常用的~~!
感温~!
你好~
我转载您的文章至我的blog上可吗?
to Hades:
好的,欢迎转载。
你好:请问可以转贴至FB分享给其他对LINUX VIM指令不熟悉的人参考?
欢迎分享
请问如果我用vi需要同时收寻2个以上的字串,该如何下指令?或者我收寻完第1个字串,在收寻下个字串时,上一个收寻的字串还是保持在highlight的状态
谢谢
使用 grouping 同时搜寻几个,如/\(字串A\|字串B\)
非常详细的介绍~~谢谢!!
请问每行前面的*代表什么意思呢?
就只是我认为比较常用的指令而已