## 第?24?章?Vim 編輯器
**目錄**
[](ch24.html#id3098541)
[VIM 簡介](ch24s02.html)
[命令](ch24s03.html)
[配置文件](ch24s04.html)
[模式行](ch24s04.html#id3098979)
[模式介紹](ch24s05.html)
[模式切換](ch24s06.html)
[移動](ch24s07.html)
[數字參數](ch24s08.html)
[瀏覽](ch24s09.html)
[標記](ch24s10.html)
[編輯](ch24s11.html)
[搜索和替換](ch24s12.html)
[正則表達式](ch24s13.html)
[寄存器操作](ch24s14.html)
[宏](ch24s15.html)
[插入模式下的快捷鍵](ch24s16.html)
[鍵綁定、縮寫](ch24s17.html)
[單詞補全](ch24s18.html)
[命令模式](ch24s19.html)
[折疊](ch24s20.html)
[多欄窗口](ch24s21.html)
[標簽頁](ch24s22.html)
[文件管理](ch24s23.html)
[加密](ch24s24.html)
[版本](ch24s25.html)
## VIM 簡介
我們使用的大多數編輯器,都可以直接在編輯區輸入字符,并且能夠通過一些快捷鍵來完成一些控制功能,比如使用方向鍵移動光標,使用 `BackSpack` 或者 `Delete` 鍵刪除文字,使用 `PgUp` 和 `PgDn` 翻頁,使用 `Home` 和 `End` 來定位行首和行末……
而Vim是一個帶模式的編輯器,同樣的按鍵,在不同模式下,具有不同的功能定義。例如 `h j k l` 在 _編輯模式_ 下輸入相應的字符,在 _普通模式_ 下卻相當于方向鍵的作用。
由于需要切換模式,Vim 的使用起來略顯繁瑣。不過優點也顯而易見:您只要把手安安穩穩的放在打字區就可以了,而不需要使用諸如方向鍵、排版鍵、小鍵盤等需要挪開雙手的鍵位,從而提高了您的效率和專注程度。事實上,Vim 的前身 Vi 誕生的時候,鍵盤上還沒有方向鍵、排版鍵和小鍵盤
## 命令
使用 Vim 編輯文件:
```
vi [文件名]
vim [文件名]
```
教學模式:
```
vimtutor [語言]
```
vim 教程,相當于使用Vim編輯器以只讀模式打開教程文件。您無論對這個文件作了什么,都會在退出后恢復原來的樣貌。與只讀模式的區別在于,它不會沒有眼色的提醒您,現在的狀態為只讀模式。您可以使用它作一些練習
您可以指定教程文件的語言,如果使用本地語言(**ZH_cn**)出現亂碼,您可以嘗試使用英語
```
vimtutor en
```
使用 Vim 比較文件區別
```
vimdiff [文件1] [文件2] [其它文件]……
```
## 配置文件
Vim 的全局配置文件為 `/etc/vim/vimrc` ,用戶配置文件為 `~/.vimrc` , `"` 起始的行為注釋行。我們提供的配置項,您直接加入配置文件就可以了
您可以先對 Vim 進行一些簡單的配置:
**例?24.1.?Vim 配置 `/etc/vim/vimrc`**
```
"運行在非兼容(VI)模式下(命令模式下 TAB 補全)
set nocompatible
"設定文件編碼
set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936
"開啟語法加亮
syntax on
"配色風格
colorscheme pablo
"簡潔啟動模式
set shortmess=atI
"設定 GUI 選項
"set guioptions=gmrLtT m:菜單 T:工具欄
set guioptions=gmrLt
"命令行高度
set cmdheight=1
"設定行距 ( GUI 界面中生效 )
set linespace=4
"顯示標尺
set ruler
"自動折行
"set nowrap
set wrap
"按完整單詞折行
set nolinebreak
"set linebreak
"行寬(輸入時自動插入換行符)
"set textwidth=80
set textwidth=0
"允許在 虛空間 內操作 (虛空間:不包含任何文本的空間。如換行符之后)
"set virtualedit=all
"禁止在 虛空間 內操作
set virtualedit=
"設定 Tab 鍵縮進的空格數
set tabstop=4
"設定編輯器將多少空格視為一個縮進
set shiftwidth=4
"將縮進轉換為空格
"set expandtab
"設定自動縮進(新行與前一行縮進相同)
set autoindent
"set noautoindent
"插入模式下,“←”如何刪除光標前的字符:行首空白、換行符、插入點之前的字符
set backspace=indent,eol,start
"命令行歷史紀錄
set history=500
"禁用增量搜索
set incsearch
"set noincsearch
"搜索時忽略大小寫
set ignorecase
"set noignorecase
"高亮顯示搜索結果
set hlsearch
"設定折疊方式
"set foldmethod=manual
"以下字符將被視為單詞的一部分 (ASCII):
"set iskeyword+=33-47,58-64,91-96,123-128
```
### 模式行
也可以通過“模式行”將配置選項嵌入在普通文件中。打開此文件時,優先使用模式行中的配置:
```
# **vim:** filetype=sh foldmethod=marker autoindent expandtab shiftwidth=4
模式行可以寫在任意位置
但為了不影響文件功能,模式行通常寫在注釋中
模式行以 **vim:** 起始,前面至少要有一個空白字符(空格、換行符等)
模式行中的設置項以空格分隔
……
```
這種形式的缺點在于,不能在設置項后添加其它文本。如果有相關需要,可以使用另一種模式行:
```
<!-- **vim:set** filetype=html**:** 這里可以任意添加文本 -->
```
## 模式介紹
Vim 常見的模式有: _普通模式_ 、 _插入模式_ 、 _命令模式_ ,另外我們也會經常用到 _可視模式_ 。
Vim 啟動時進入 _普通模式_ ;或者在其它模式下,按下 `Esc` 鍵,便可以回到普通模式。
使用 **vimtutor en** 命令進入教程,現在是普通模式。隨便按幾下 `j` 、 `k` 、 `l` 、 `h` 鍵,您會發現光標的位置發生改變。
按下 `i` 鍵,編輯器底部出現了 -- 插入 -- 或者 -- insert -- ,您進入了插入模式。隨便按幾下 `j` 、 `k` 、 `l` 、 `h` ,您會發現相應的字符出現在編輯區,現在還可以通過方向鍵來移動光標。可能您覺得使用方向鍵移動光標不是什么問題,但是習慣了 Vim 后,您反而會認為方向鍵太麻煩了,簡直不能容忍!好了,現在按下 `Esc` 鍵回到普通模式,我們又可以使用 `j` 、 `k` 、 `l` 、 `h` 來移動光標了。
在普通模式下,按下 `:` 鍵(也就是 Shift+; ),在編輯器底部出現了一個 : ,您進入了命令模式。在 `:` 后輸入一個命令 `new` ,回車后,編輯器被分割為上下兩欄。為了方便起見,我們在命令前加一個 **:** 來表示命令模式下輸入的命令,像這樣
```
:vnew
```
命令能夠以一些規則簡化,上面的命令也可以寫為這種形式
```
:vne
```
現在您的編輯區一定弄的四分五裂,您可以使用命令“**:quit**”來關閉當前欄,直接用簡寫就可以了
```
:q
```
這個命令是退出編輯器,如果編輯區被分成多欄,則是退出當前欄。
執行完一個命令(按下回車后),編輯器會自動回到普通模式。如果想不執行當前命令,直接回到普通模式,您可以按下 Esc鍵。
按下 `v` 鍵,您進入了可視模式,可以使用 `j` 、 `k` 、 `l` 、 `h` 移動光標,高亮選取文本 。
事實上,可視模式相當于高亮選取文本后的普通模式。
可視模式具有多種模式,以行為單位進行選取的可視行模式,使用 `V` 鍵進入(也就是 Shift+v );和以塊為單位進行選取的可視塊模式,使用 `Ctrl+v` 鍵進入。
## 模式切換
好了,現在我們總結一下模式間切換的方法
| | |
| --- | --- |
| 其它模式 | 普通模式 | Esc |
| 普通模式 | 插入模式 | i | 在光標前插入 |
| I | 在行首插入 |
| a | 在光標后插入 |
| A | 在行末插入 |
| o | 在當前行之下新建行 |
| O | 在當前行之上新建行 |
| r | 替換當前字符 |
| R | 從當前字符開始替換 |
| 普通模式 | 命令模式 | : |
| 普通模式 | 可視模式 | v | 可視模式 |
| V | 可視行模式 |
| Ctrl+v | 可視塊模式 |
## 移動
在普通模式中,您可以使用以下方式移動光標
| | |
| --- | --- |
| k(上) |
| h(左) | l(右) |
| j(下) |
您可以使用其它更有效率的方式移動光標
**表?24.1.?**
| | 向前 | 向后 |
| --- | --- | --- |
| 單詞 | w | b |
| 單詞,包括特殊符號 | W | B |
| 單詞詞尾 | e |
| 單詞詞尾,包括特殊符號 | E |
| 行 | 0 | $ |
| 行首文字(不包括空格) | ^ |
| 頁 | H | L |
| 頁面中部 | M |
在其它模式中,您可以使用方向鍵移動光標,不過那樣比較麻煩,您可以在配置文件中綁定插入模式下的功能鍵
```
noremap! <M-j> <Down>
noremap! <M-k> <Up>
noremap! <M-h> <left>
noremap! <M-l> <Right>
………………
作用范圍 鍵位 功能
```
* 其中,**map!**綁定的鍵盤映射,作用于所有模式;**inoremap!**綁定的映射,僅作用于插入模式。
## 數字參數
您也可以使用數字參數(普通模式),來重復執行。例如
```
100j
```
* 執行 100次 `j` 鍵,向下 100行
## 瀏覽
**表?24.2.?**
| | 向前 | 向后 |
| --- | --- | --- |
| 整頁 | Ctrl+f | Ctrl+b |
| 半頁 | Ctrl+d | Ctrl+u |
| 文件 | G | gg |
| 按行號轉到相應行 | 行號 G |
| 按百分比轉到相應的行 | 1~100% |
| 按行卷動 | Ctrl+e | Ctrl+y |
| 將光標所在行調整至頁面中間 | zz |
| 統計字數 | g Ctrl+g |
| 顯示位置信息 | Ctrl+g |
| 刷新屏幕 | Ctrl+l |
> 提示:`gg` 定位到文件首行, `V` 進入可視行模式, `G` 定位到文件末行,實現類似“全選”的功能。依次按下 `g`? `g`? `V`(Shift+v)? `G`(Shift+g)
## 標記
您可以在當前光標處作一個標記,以便快速返回
```
m標記名稱 定義標記。標記名稱為一個字符
`標記名稱 返回標記
mx 將當前光標處定義為標記 x
`x 返回標記 x
:marks 查看標記列表
```
## 編輯
| | 復制 | 剪切 |
| --- | --- | --- |
| 字符 | y | x |
| 行 | yy | dd |
> [](ch24s11.html#vim-ed11) 需先在可視模式中選取
| | |
| --- | --- |
| p | 在光標后粘貼 |
| P | 在光標前粘貼 |
| u | 撤消 |
| Ctrl+r | 重做 |
| Ctrl+y | 逐字克隆上一行內容 |
| Ctrl+e | 逐字克隆下一行內容 |
## 搜索和替換
按下 `/` 鍵,編輯器底部會出現 `/` 符號,接著輸入字符串,便可以進行搜索
| | |
| --- | --- |
| / | 向下搜索 | ? | 向上搜索 |
| n | 搜索下一個 | N | 搜索上一個 |
| | |
| --- | --- |
| :s/源字符串/目標字符串 | 將源字符串替換為目標字符串 |
| :s/源字符串/目標字符串/g | 替換當前行中所有符合條件的字符串 |
| :行號1,行號2s/源字符串/目標字符串/g | 在指定行中進行替換 |
| :%s/源字符串/目標字符串/g | 全文替換 |
## 正則表達式
見[第?26?章 _正則表達式_](ch26.html "第?26?章?正則表達式")
## 寄存器操作
Vim 可以將不同字段剪切或復制到不同寄存器中,您可以從不同寄存器中取出內容后粘貼
```
"寄存器名稱
```
* 按下`"`鍵和另一個字符鍵,便可以定義一個寄存器。例如:`"a`?`"1`
定義寄存器后直接進行操作
```
"ayy 將當前行復制到寄存器 a 中
"ap 將寄存器 a 中的內容粘貼到光標之后
```
* **:registers** 查看所有寄存器的內容
* 通常情況下,寄存器 **+** (先按",再按 Shift+= )對應 X 下的剪貼板。您在其它程序中復制的內容,可以使用 `"+p` 粘貼到 Vim中;您在 Vim 中,可以使用 `"+y` 將內容復制到剪貼板,再粘貼到其它程序中
* 沒有指定寄存器時,Vim 使用“無名寄存器”存儲內容
## 宏
您可以將一系列的操作錄制為一個宏,然后執行它
```
q宏名稱 開始錄制宏。宏名稱為一個字符
q 錄制中按下“q”鍵,結束錄制
@宏名稱 執行宏
```
* 可以使用 **:registers**(寄存器列表) 命令查看已記錄的宏
## 插入模式下的快捷鍵
| | |
| --- | --- |
| Ctrl+r寄存器名稱 | 插入指定寄存器內容 |
| Ctrl+k(2個字符) | 輸入二合字符 |
| Ctrl+v數字 | 通過數字編碼輸入字符 |
| Ctrl+v鍵位 | 輸入鍵位的名稱 |
## 鍵綁定、縮寫
前面我們已經向您介紹了鍵綁定
```
map! <M-j> <Down>
```
尖括號及其中的內容,為 Vim 配置文件的約定,分別描述了按鍵和功能,表示將功能編寫到按鍵上。如果綁定的只是普通字符,例如:
```
map! xxx XXXXX
```
表示將 XXXXX 綁定到 xxx 上。當您鍵入 xxx 時,編輯器會自動替換為 XXXXX
如果您只是想將字符串綁定為縮寫,方便輸入,我們建議您使用 **iabbrev** 來綁定。例如:
```
iabbrev g google
```
在插入模式下鍵入 `g` ,編輯器會自動替換為 google 。您可以將 **iabbrev** 命令縮寫為 **iab** ,例如:
```
iab g google
```
以上命令,您可以直接在命令模式下輸入,臨時啟用。也可以寫入配置文件,永久啟用。
## 單詞補全
```
<Ctrl+n> 下一個匹配項
<Ctrl+p> 上一個匹配項
```
您可以在配置文件中定義補全的方式
```
"自動補全方式:(使用逗號分隔)
set complete=k,.
" . 當前文件
" b 已被裝緩沖區,但是沒有在窗口內的文件
" d 在當前的文件中定義和由 #include 包含進來的文件
" i 由 #include 包含進來的文件
" k 由 dictionary 選項定義的文件
" kfile 名為{file}的文件
" t 標記(tags)文件
" u 沒有載入的緩沖區
" w 在其他窗口中的文件
"設定自動補全字典 :
set dictionary=path
```
## 命令模式
前面介紹了普通模式和插入模式。我們發現,普通模式主要用來瀏覽和修改文本內容,而插入模式則用來向文本中添加內容。
而命令模式則多用于操作文本文件(而不是操作文本文件的內容),例如保存文件;或者用來更改編輯器本身的狀態,例如設定多欄窗口、標簽或者退出編輯器……
w(rote) 將更改寫入文件
```
:w
```
q(uit) 退出編輯器
```
:q
```
某些情況下,編輯器會阻止命令的執行。例如您修改了文件,而沒有保存,那么您使用 :q 命令退出時,編輯器就不會執行這條命令,而是提醒您保存文件。
這個時候,您可以在命令末尾追加 ! 來強制執行命令
```
:命令!
```
例如 `:q!` ,即便您沒有保存已修改的文件,使用此命令,編輯器也會放棄修改而強行退出
以 `!` 引導一個 Shell 命令,則可以從 Vim 臨時切換到 Shell 中,執行一個 Shell
```
:!命令
```
例如 `:!ls`
命令模式還可以用來調節一些選項,例如
```
:set linespace=6
```
* 使用 Tab 鍵補全命令
* 命令可以直接寫入配置文件
* 在選項后加上一個 `&` 使用默認值,例如: `:set linespace&`
## 折疊
| | |
| --- | --- |
| zf數字 | 創建折疊,數字參數為折疊行數 |
| zo | 打開折疊 |
| zc | 關閉折疊 |
| zd | 刪除折疊 |
| :set foldcolumn=4 | 顯示折疊樹 |
| :mkview | 保存折疊 |
| :loadview | 讀取折疊 |
| zr | 打開同一層級所有折疊 |
| zm | 關閉同一層級所有折疊 |
| zO | 打開某一行的所有層級折疊 |
| zC | 關閉某一行的所有層級折疊 |
| zR | 打開所有折疊 |
| zM | 關閉所有折疊 |
| :set foldclose=all | 光標離開折疊自動關閉 |
| :set foldopen=all | 光標遇到折疊自動打開 |
您可以在配置文件中定義折疊的方式
```
"設定折疊方式
set foldmethod=manual
" manual 手動折疊
" indent 按縮進折疊
" marker 按標記折疊
" syntax 按語法折疊
" expr 按表達式折疊
```
按標記折疊的例子:
```
#起始標記 **{{{** 將標記放到注釋里,不會影響文件的功能
起始標記和結束標記之間的內容折疊
顯示為起始標記所在行
#結束標記 **}}}**
###### 將折疊方式寫到模式行里 #####
# vim: foldmethod=marker
```
## 多欄窗口
您可以使用以下命令,將當前窗口水平分為兩欄
```
:new
```
新建一欄空白窗口,將當前文件分兩欄顯示
```
:split
```
同理,您可以使用下列命令,將當前窗口垂直分為兩欄
```
:vnew
:vsplit
```
先按下 `ctrl+w` 鍵,再按下方向鍵 `j` 、 `k` 、 `l` 、 `h` ,您可以切換到其它欄;在當前欄中使用 `:q` 命令,可以退出當前欄,也可以使用其它命令,對當前欄作出修改
如果您希望當前命令在所有欄中生效,您可以在命令的末尾追加 **all**
```
:命令all
```
例如:`:qall`
如果您希望這條命令強制執行,那么 `!` 位于命令的最末,例如:`:qall!`?強行退出所有欄窗口
## 標簽頁
Vim 在7以后的版本,開始支持標簽頁的功能
```
:tabnew 新建一個標簽
:tabnext 轉到下一個標簽
:tabprevious 轉到上一個標簽
```
您也可以使用鼠標點擊標簽進行切換
## 文件管理
使用 Vim 編輯目錄時,會進入文件管理模式:
```
vim .
```
文件管理模式中可以實現一些簡單的文件管理功能:
| | |
| --- | --- |
| enter | 打開文件或文件夾 |
| Ctrl+o | 后退 |
| o | 新開一欄進行編輯 |
| O | 在前一次打開的欄中編輯 |
| p | 預覽 |
| i | 顯示/隱藏文件大小、日期 |
| s | 切換文件排序方式 |
| r | 切換順序、逆序 |
| - | 回到上一級目錄 |
| c | 將 Vim 執行目錄設定為當前目錄 |
| R | 重命名 |
| D | 刪除 |
| x | 運行 |
* **:cd** 設定所有窗口執行目錄 ; **:lcd** 設定當前欄窗口執行目錄
## 加密
使用 **:X** 命令為文件設定一個密碼
```
:X
Enter encryption key: ******
Enter same key again: ******
```
* 如果要取消加密,可以設置密碼為空
可以禁用交換文件,以免泄密
```
vim -x -n file.txt
```
如果你已在經編輯這個文件了,那么交換文件 `swapfile` 可以用下面的命令禁止:
```
:setlocal noswapfile
```
由于沒了交換文件,文件復原就不可能了。為了避免失去編輯的成果,要比平時更勤快地存盤你的文件
現在你可以像平時一樣編輯這個文件并把你所有的秘密放進去。當你編完文件要退出 Vim 時,這個文件就被加密存盤了
當你下次用 Vim 編輯這個文件時,它就會詢問你密碼
如果你試圖用另一個程序來閱讀這個文件,你將讀到一堆垃圾。如果你用 Vim 來編輯這個文件,但輸入了錯誤的密碼,你也只能得到垃圾。Vim 并不具備檢驗密碼正確性的機制 (這一點使得破譯密碼更為困難)
## 版本
在 Windows 平臺下,請使用 gvim7ole 版本
- 開源世界旅行手冊
- 授權
- 致謝
- 序言
- 更新紀錄
- 導讀
- 如何寫作科技文檔
- 部分?I.?氣候
- 第?1?章?GUI? CLI?
- 第?2?章?UNIX 縮寫風格
- 第?3?章?版本號的迷霧
- 第?4?章???Vim 還是 Emacs
- 第?5?章???DocBook 還是 TeX
- 第?6?章?完全用 Gnu/Linux 工作
- 第?7?章?病毒
- 第?8?章?磁盤 分區
- 第?9?章?文件系統
- 第?10?章???發行版介紹
- 第?11?章???編程語言
- 第?12?章?無根的根:無名師的 Unix 心傳
- 部分?II.?地理
- 第?13?章?基礎知識
- 第?14?章?命令系統
- 第?15?章?基本系統
- 第?16?章?軟件管理
- 第?17?章?核心工具集
- 第?18?章?編譯工具鏈
- 第?19?章?圖形界面
- 第?20?章?國際化
- 第?21?章???內核
- 第?22?章?Grub
- 第?23?章?服務器
- 第?24?章?Vim 編輯器
- 第?25?章?Emacs 入門
- 第?26?章?正則表達式
- 第?27?章?docbook 指南
- 第?28?章?Git 版本控制系統
- 第?29?章?ConTeXt 入門指南
- 部分?III.?景觀
- 第?30?章?終極 Shell -- ZSH
- 第?31?章?完美工作站 Archlinux
- 第?32?章?組織你的意念:Emacs org mode
- 第?33?章???Zsh+screen
- 第?34?章???gentoo stage3
- 第?35?章???硬件問題
- 第?36?章???網絡設置
- 第?37?章???自制 LiveCD
- 第?38?章?awesome
- 第?39?章?openbox 工作環境
- 第?40?章???Emacs muse
- 第?41?章???寫作工具鏈
- 第?42?章?使用 lftp
- 第?43?章???Firefox 使用技巧
- 第?44?章???FVWM
- 部分?IV.?地質
- 第?45?章?Unix
- 第?46?章???Gnu
- 第?47?章?軟件業自由之神——Richard Stallman
- 第?48?章?Linux
- 第?49?章?GNOME與KDE的戰爭
- 第?50?章???Vim Emacs
- 第?51?章???年代紀
- 第?52?章?我的選擇
- 第?53?章???補遺