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\)
非常詳細的介紹~~謝謝!!
請問每行前面的*代表什麼意思呢?
就只是我認為比較常用的指令而已