开始之前我们先来谈谈为什么用 Vim, 网上有很多探讨 Vim 哲学的文章,在我看来 Vim 是这样的一款编辑器。它可以很简单,简单到除了你正在编辑的文字,其余什么都没有。它也可以很复杂,复杂到可以囊括所有 IDE 可以有的功能。它可以很简单,简单到只需要几个输入几个字符,就可以完成其他 IDE 几分钟的工作量。它也可以很复杂,复杂到你连退出就不会。它是一个很神奇的编辑器,它可以无所不能,也可以化繁为简。它可以变成任何你想要的样子,问题只有一个,你是不是准备好开始接受它了。上车吧,我们要出发了
几种模式
normal
以 vim 打开一个文档,默认进入的就是 normal 模式,在该模式下,我们可以 上下左右
移动光标,可以 删除,黏贴,复制
文本。
visual
在 normal 模式下,我们可以进行的复制删除等操作仅限于打个字符或正行,如果想要对某个区域进行操作,需要通过输入 V, v, <c-v>
来进入 visual 模式
insert
想要插入数据,可以通过按下 i, I, a, A, o, O, s, S
可以进入insert 模式,通过按下 <es>
退出键回到 normal 模式
replace
replace 模式,需要在 normal 模式下按下 r, R
键来进入,与 insert 不同的是,该模式只能对现有文本进行替换,同样需要按下 <esc>
回到 normal 模式
command
在 normal 下通过输入 :, /, ?
来进入 command 模式,在该模式下光标会移动到最下边一行,同时可以完成 搜索、读取,存档,替换,离开 Vim、配置 Vim
等操作
基本操作
介绍完几种模式,这部分我们来探讨下各个模式下的基本操作
移动光标
这部分是在 normal 模式下完成的,我通过单个或组合按键来完成光标的移动,最简单的是 h, j, k, l
他们分别代表了小键盘区的 ← ↓ ↑ →
来进行左下上右的移动操作,接下来是翻页,这涉及到一个组合键 <c-f>
,它代表的是 ctrl + f
的缩写,以后这类组合键我们都会这样写1
2
3
4<c-f> " 向下移动一页
<c-d> " 向下移动半页
<c-b> " 向上移动一页
<c-u> " 向上移动半页
接下来要说到的是针对行的光标操作1
2
3
4
5
6
7
8
9
10
11n<space> / nl " n 表示数字,后边跟上空格或者 l ,就可以向右移动相应格数
nh " 跟上边一样,是向左移动
0 " 0 可以移动到行首
$ " 移动到行尾
g_ " 移动到行尾最后一个非空字符
n<Enter> / nj " n 表示数字,向下移动相应行数
nk " 跟上边一样,是向上移动
nG " 移动到指定的行数
gg " 动到文档第一行,相当于1G
G " 移动到文档最后一行
还有一些不常用的行操作,不记也没关系1
2
3
4
5H " 移动到当前屏幕第一行的第一个字符
M " 移动到当前屏幕中间行的第一个字符
L " 移动到当前屏幕最后一行的第一个字符
+ " 移动到非空白字符的下一行
- " 移动到非空白字符的上一行
查找与替换
1 | /word " 输入 / 会进入 command 模式,再输入先要搜索的单词并回车进行搜索 |
删除、复制和黏贴
1 | x, X " 删除字符,x 向后删除一个字符,X 向前删除一个字符 |
第二部份:一般指令模式切換到編輯模式的可用的按鈕說明
进入插入或替换的编辑模式
1 | i 在光标所在处插入 |
第三部份:一般指令模式切換到指令列模式的可用按钮说明
指令列模式的保存、离开等指令
1 | :w 將編輯的資料寫入硬碟檔案中(常用) |
vim 环境的变更
1 | :set nu 顯示行號,設定之後,會在每一列的字首顯示該列的行號 |
额外功能
vim 的保存文件、恢复与打开时的警告信息
當我們在使用 vim 編輯時, vim 會在與被編輯的檔案的目錄下,再建立一個名為 .filename.swp 的檔案。 比如說我們在上一個小節談到的編輯 /tmp/vitest/man_db.conf 這個檔案時, vim 會主動的建立 /tmp/vitest/.man_db.conf.swp 的暫存檔,你對 man_db.conf 做的動作就會被記錄到這個 .man_db.conf.swp 當中喔!如果你的系統因為某些原因斷線了, 導致你編輯的檔案還沒有儲存,這個時候 .man_db.conf.swp 就能夠發揮救援的功能了!我們來測試一下吧! 底下的練習有些部分的指令我們尚未談到,沒關係,你先照著做,後續再回來瞭解囉!1
2
3
4
5$ cd /tmp/vitest
$ vim man_db.conf
# 此時會進入到 vim 的畫面,請在 vim 的一般指令模式下按下『 [ctrl]-z 』的組合鍵
[1]+ Stopped vim man_db.conf <==按下 [ctrl]-z 會告訴你這個訊息
當我們在 vim 的一般指令模式下按下 [ctrl]-z 的組合按鍵時,你的 vim 會被丟到背景去執行。回到命令提示字元後,接下來我們來模擬將 vim 的工作不正常的中斷吧!1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35$ ls -al
drwxrwxr-x. 2 dmtsai dmtsai 69 Jul 6 23:54 .
drwxrwxrwt. 17 root root 4096 Jul 6 23:53 ..
-rw-r--r--. 1 dmtsai dmtsai 4850 Jul 6 23:47 man_db.conf
-rw-r--r--. 1 dmtsai dmtsai 16384 Jul 6 23:54 .man_db.conf.swp <==就是他,暫存檔
-rw-rw-r--. 1 dmtsai dmtsai 5442 Jul 6 23:35 man.test.config
$ kill -9 %1 <==這裡模擬斷線停止 vim 工作
$ ls -al .man_db.conf.swp
-rw-r--r--. 1 dmtsai dmtsai 16384 Jul 6 23:54 .man_db.conf.swp <==暫存檔還是會存在!
$ vim man_db.conf
E325: ATTENTION <==錯誤代碼
Found a swap file by the name ".man_db.conf.swp" <==底下數列說明有暫存檔的存在
owned by: dmtsai dated: Mon Jul 6 23:54:16 2015
file name: /tmp/vitest/man_db.conf <==這個暫存檔屬於哪個實際的檔案?
modified: no
user name: dmtsai host name: study.centos.vbird
process ID: 31851
While opening file "man_db.conf"
dated: Mon Jul 6 23:47:21 2015
底下說明可能發生這個錯誤的兩個主要原因與解決方案!
(1) Another program may be editing the same file. If this is the case,
be careful not to end up with two different instances of the same
file when making changes. Quit, or continue with caution.
(2) An edit session for this file crashed.
If this is the case, use ":recover" or "vim -r man_db.conf"
to recover the changes (see ":help recovery").
If you did this already, delete the swap file ".man_db.conf.swp"
to avoid this message.
Swap file ".man_db.conf.swp" already exists! 底下說明你可進行的動作
[O]pen Read-Only, (E)dit anyway, (R)ecover, (D)elete it, (Q)uit, (A)bort:
再次打开文件时,会出现六个按钮,他们的作用依次是:
1 | [O]pen Read-Only:打開此檔案成為唯讀檔, 可以用在你只是想要查閱該檔案內容並不想要進行編輯行為時。一般來說,在上課時,如果你是登入到同學的電腦去看他的設定檔, 結果發現其實同學他自己也在編輯時,可以使用這個模式; |
多文件编辑
很多同学任务高集成的IDE比vim好用,是因为vim不能操作一些事情,比如跨文件复制,但其实vim完全可以做到,首先下载文件:http://linux.vbird.org/linux_basic/0310vi/hosts 打开后如下所示:1
2
3
4
5192.168.1.1 host1.class.net
192.168.1.2 host2.class.net
192.168.1.3 host3.class.net
192.168.1.4 host4.class.net
.....中間省略......
我们再建一个新文件host2,并进行跨文件复制操作1
2$ touch host_copy
$ vim hosts host_copy # 使用vim同时打开两个文件
下面我们会使用这几个命令1
2
3:n 編輯下一個檔案
:N 編輯上一個檔案
:files 列出目前這個 vim 的開啟的所有檔案
1 | :files # 再打开文件后一般模式下使用改名了查看有几个文件 |
1 | v 字元選擇,會將游標經過的地方反白選擇! |
快替换
1 | [Ctrl] + v 选中块 |
多窗口
1 | :sp [filename] # 垂直分割屏幕,filename 是想要打开的文件,默认当前文档 |
1 | # set compatible 就是让 vim 关闭所有扩展的功能,尽量模拟 vi 的行为。 |
Operator-Pending映射
1 | vip # vip很好记 |
宏
vim有个非常厉害的功能叫宏,它可以将你的操作进行宏录制,放到vim寄存器中,并按照你想要的方式播放出来
操作
- 首先准备一个文件,第一行为数字1
- 光标放在1上并按下 qa(当然也可以 qb,qc,这只是录制宏的名字)开始录制,测试左下角会显示录制字样
- 输入 yyp 复制当前行到下一行,并输入
将数字增加1,此时第二行数字为2 - 按下 q 结束录制,并按下 @a 播放宏,此时第三行会变成3,按下 @@ 重复上次播放,第四行会变成4
- 当按下 100@@ 时,宏会重复播放100次上次的播放记录,自动生成104行数据
与系统剪切版交互
加上 "+
即可1
2
3"+yy
"+Y
v"+y
其他操作
1 | :inoremap <esc> <nop> # 使<esc>失效 |