开始之前我们先来谈谈为什么用 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 | <c-f> " 向下移动一页 |
接下来要说到的是针对行的光标操作
1 | n<space> / nl " n 表示数字,后边跟上空格或者 l ,就可以向右移动相应格数 |
还有一些不常用的行操作,不记也没关系
1 | H " 移动到当前屏幕第一行的第一个字符 |
查找与替换
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 | $ cd /tmp/vitest |
當我們在 vim 的一般指令模式下按下 [ctrl]-z 的組合按鍵時,你的 vim 會被丟到背景去執行。回到命令提示字元後,接下來我們來模擬將 vim 的工作不正常的中斷吧!
1 | $ ls -al |
再次打开文件时,会出现六个按钮,他们的作用依次是:
1 | [O]pen Read-Only:打開此檔案成為唯讀檔, 可以用在你只是想要查閱該檔案內容並不想要進行編輯行為時。一般來說,在上課時,如果你是登入到同學的電腦去看他的設定檔, 結果發現其實同學他自己也在編輯時,可以使用這個模式; |
多文件编辑
很多同学任务高集成的IDE比vim好用,是因为vim不能操作一些事情,比如跨文件复制,但其实vim完全可以做到,首先下载文件:http://linux.vbird.org/linux_basic/0310vi/hosts 打开后如下所示:
1 | 192.168.1.1 host1.class.net |
我们再建一个新文件host2,并进行跨文件复制操作
1 | $ touch host_copy |
下面我们会使用这几个命令
1 | :n 編輯下一個檔案 |
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 | "+yy |
其他操作
1 | :inoremap <esc> <nop> # 使<esc>失效 |
参考文献
