學習 Linux 命令行,就像要成爲一名造詣很深的鋼琴家一樣,它不是我們一下午就能學會的技能。這需要經歷幾年的勤苦練習。我們將介紹 vi(發音“vee eye”)文本編輯器,它是 Unix 傳統中核心程序之一。 vi 因它難用的用戶界面而有點聲名狼藉,但是當我們看到一位大師坐在鋼琴前開始演奏時,我們的確成了偉大藝術的見證人。雖然我們在這裏不能成爲 vi 大師,當我們學完後,我們會知道怎樣在 vi 中玩“筷子”。
爲什麼我們應該學習 vi ?
在現在這個圖形編輯器和易於使用的基於文本編輯器的時代,比如說 nano,爲什麼我們還應該學習 vi 呢?下面有三個充分的理由:
vi 很多系統都預裝。如果我們的系統沒有圖形界面,比方說一臺遠端服務器或者是一個 X 配置損壞了的本地系統,那麼 vi 就成了我們的救星。雖然 nano 逐漸流行起來,但是它還沒有普及。POSIX,這套 Unix 系統中程序兼容的標準,就要求系統要預裝 vi。
vi 是輕量級且執行快速的編輯器。對於許多任務來說,啓動 vi 比起在菜單中找到一個圖形化文本編輯器,再等待編輯器數倍兆字節的數據加載而言,要容易的多。
另外,vi 是爲了加快輸入速度而設計的。我們將會看到,當一名熟練的 vi 用戶在編輯文件時,他或她的手從不需要移開鍵盤。
背景介紹
第一版 vi 是在1976由 Bill Joy 寫成的,當時他是加州大學伯克利分校的學生,後來他共同創建了 Sun 微系統公司。vi 這個名字來源於單詞“visual”,因爲它打算在帶有可移動光標的視頻終端上編輯文本。在發明可視化編輯器之前,有一次只能操作一行文本的行編輯器。爲了指定一個修改,我們告訴行編輯器到一個特殊行並且說明做什麼修改,比方說添加或刪除文本。視頻終端(而不是基於打印機的終端,像電傳打印機)的出現,可視化編輯成爲可能。vi 實際上整合了一個強大的叫做 ex 行編輯器, 所以我們在用vi 時能運行行編輯命令。大多數 Linux 發行版不包含真正的 vi;而是自帶一款高級替代版本,叫vim(它“vi improved”的簡寫)由 Bram Moolenaar 開發的。vim 相對於傳統的 Unix vi 來說,取得了實質性進步。通常,vim 在 Linux 系統中是“vi”的符號鏈接(或別名)。在隨後的討論中,我們將會假定我們有一個叫做“vi”的程序,但它其實是 vim。
Vim 有三種模式類型:編輯模式;輸入模式;末行模式。
編輯模式:是Vim的默認模式,又叫做命令模式;
輸入模式:又叫做插入模式;
末行模式:在命令模式下按下:(英文冒號)就進入了末行命令模式。末行命令模式可以輸入單個或多個字符的命令,可用的命令非常多。
vim編輯器的使用及格式
vim [options] [/path/to/somefile]
模式轉換:
編輯模式 --> 輸入模式:
i:實現在當前光標所在處字符前面轉換爲輸入模式;
a:實現在當前光標所在處字符後面轉換爲輸入模式;
o:實現在當前光標所在行的下方新建一個空白行並轉換爲輸入模式;
I:在當前光標所在行的行首轉爲輸入模式;
A:在當前光標所在行的行尾轉爲輸入模式;
O:在當前光標所在行的上方新建一行,並轉爲輸入模式;
輸入模式 --> 編輯模式:
按下Esc鍵;
編輯模式 --> 末行模式:
鍵入:(英文冒號)
末行模式 --> 編輯模式:
Esc,Esc (連續按兩次)
光標跳轉:
字符間跳轉:
按鍵 | 移動光標 |
h | 向左移動,同左箭頭效果 |
l | 向右移動,同右箭頭效果 |
j | 向下移動,同下箭頭效果 |
k | 向上移動,同上箭頭效果 |
字符間多字符跳轉:
# 可與上面字符組合使用,表示向某方向移動#個字符
按鍵 | 移動光標 |
#h | 向左側跳轉#個字符 |
#l | 向右側跳轉#個字符 |
#j | 向下面跳轉#個字符 |
#k | 向上面跳轉#個字符 |
如:6h表示向左跳轉6個字符;6表示向右跳轉6個字符。
單詞間跳轉:
w | 跳轉至後一個單詞的詞首 |
e | 跳至當前或下一個單詞詞尾 |
b | 跳至當前或前一個單詞詞首 |
句子間跳轉:
) | 跳轉至下一句 |
( | 跳轉至上一句 |
段落間跳轉:
} | 跳轉至下一段 |
{ | 跳轉至前一段 |
行間跳轉:
1G, gg | 跳轉至行首 | 注:1G中1表示數字1 |
G | 跳轉至行尾 | |
#G | 跳轉至#行 | 注: #號表示數字序號 |
行內跳轉:
^ | 跳轉至行首的第一個非空白字符 | |
$ | 絕對行尾 | |
0 | 絕對行首 | 注: 0爲數字0 |
打開文件:
格式: vim [options] /path/to/file
vim +# /path/to/file
如: vim +8 /etc/init.d/functions 表示打開指定文件並跳轉至第#行
打開多個文件:
格式: vim [options] /path/to/file /path/to/file
如: vim /etc/init.d/functions /etc/fstab 表示打開指定多個文件
注: 輸入前需轉換至末行模式:
next | 跳轉至下一個打開文件 |
prev | 跳轉至上一個打開文件 |
first | 跳轉至第一個打開文件 |
last | 跳轉至最後一個打開文件 |
-O | 垂直分割窗口 |
-o | 水平分割窗口 |
如: vim -O /etc/init.d/functions /etc/fstab 垂直分割窗口
關閉文件:
注: 輸入前需轉換至末行模式:
w | 保存 |
q | 退出 |
! | 強制 |
wq | 保存退出 |
q! | 強制退出 |
x | 保存退出 |
在編輯模式下:
ZZ | 保存退出 |
wall | 保存所有 |
qall | 退出所有 |
wqall | 保存退出所有 |
編輯命令
刪除命令: d
x | 刪除單個字符 |
#x | 刪除光標所在處後面#個字符 |
dw | 刪除單詞至下個單詞詞首 |
de | 刪除光標所在處的後的一個單詞 |
db | 刪除光標所在處的前的一個單詞 |
d^ | 刪除光標所在處至行首的內容 |
d$ | 刪除光標所在處至行尾的內容 |
dd | 刪除光標所在行 |
#dd | 刪除光標所在行及向下#行 |
在末行模式下使用d命令
末行模式支持範圍指定、地址定界
格式: 起始地址,結束地址
$ | 最後一行 |
. | 當前光標所在行 |
% | 全文 |
如: 1,7d 表示刪除第1至7行
1,$ 表示第1行至最後一行
在地址定界時還支持相對錶達法
如: 1,+6 表示從第1行開始往下6行,即包括第1行在內共7行
1,$-2 表示從第1行開始至第倒數3行
.,+3 表示從當前行開始往下3行,即包括第1行在內共4行
編輯操作可撤銷:(在未保存之前)
vim默認會最近50次的操作,u命令可逐一撤消此前的編輯操作
u | 逐一撤消此前的編輯操作 | 注:需在編輯模式下使用 |
Ctrl+r | 撤消此前的撤消 | 與u選項相反 |
粘貼操作: p
刪除的是整行 | 刪除的不是整行 | ||
p | p:小寫 在當前光標所在行的下方粘貼 | p | p:小寫 在當前光標所在處字符的後方粘貼 |
P | P:大寫 在當前光標所在行的上方粘貼 | P | P:大寫 在當前光標所在處字符的前方粘貼 |
複製操作: y
yy | 複製當前光標所在行 |
#yy | 複製當前光標所在向下#行 |
y^ | 複製當前光標處至行首 |
y$ | 複製當前光標處至行尾 |
複製的是整行 | 複製的不是整行 | ||
p | p:小寫 在當前光標所在行的下方粘貼 | p | p:小寫 在當前光標所在處字符的後方粘貼 |
P | P:大寫 在當前光標所在行的上方粘貼 | P | P:大寫 在當前光標所在處字符的前方粘貼 |
文本搜索:
文件搜索查找支持正則表達式匹配
如:/\<d[[:alpha:]]\{2\}n\> 字母d後有兩個字母后跟n的單詞
/keyword | 從當前光標所在處向文件尾部查找 |
?keyword: | 從當前光標所在處向文件首部查找 |
n | 下一個,跟查找命令相同的方向 |
N | 前一個,跟查找命令相反的方向 |
翻屏快捷鍵:
Ctrl+f | 向文件尾部翻一屏 |
Ctrl+b | 向文件首部翻一屏 |
Ctrl+d | 向文件尾部翻半屏 |
Ctrl+u | 向文件首部翻半屏 |
另外一種編輯命令
c | 編輯,轉換至輸入模式 |
cc | 刪除所在行內容並且轉換爲輸入模式 |
#cc | 刪除#行內容並轉換爲輸入模式 |
c^ | 刪除至行首的第一個非空白字符處並轉換爲輸入模式 |
c$ | 刪除所在行內容到行尾並轉換爲輸入模式 |
c0 | 刪除至行首並轉換爲輸入模式 |
vim可視化模式
visual模式
v:選中光標劃過的字符
V:選中光標劃過的行,整行選取
按兩下“Esc”鍵回到編輯模式
同一文檔窗口分割:
Ctrl+w 再按s水平分割文件
Ctrl+w 再按v垂直分割文件
Ctrl+w 再按箭頭選擇文件
窗口屬性定義:
set nu :顯示行號
set nonu :取消顯示行號
set ai :自動縮進
set noai :取消自動縮進
set ic :不區分字符大小寫
set noic :取消不區分字符大小寫
set sm :顯示匹配的括號
set nosm :取消顯示匹配的括號
syntax on :語法着色
syntax off :取消語法着色
set nohlsearch :取消高亮顯示
vim的配置文件:
全局:/etc/vimrc 只有管理員有權限修改配置,修改後對所有用戶有效
個人:~/.vimrc 此文件實際不存在,自己創建即可。修改後只對當前用戶有效
由於shell只對當前用戶有效,重啓後將無效。所以需要修改配置文件
全局查找和替代
末行模式下:
地址定界s/查找模式/替換成的內容/gi
地址定界s@查找模式@替換成的內容@gi
例:某個文檔"/dev/null"替換爲"/tmp/a.txt"
%s/\/dev\/null/\/tmp\/a.txt/g
我們把這個命令分解爲幾個單獨的部分,看一下每部分的含義:
條目 | 含義 |
: | 冒號字符運行一個 ex 命令 |
% | 指定要操作的行數。% 是一個快捷方式,表示從第一行到最後一行。或者用 1,$ 來代替,意思是 “ 從第一行到文件的最後一行。” 如果省略了文本行的範圍,那麼操作只對當前行生效。 |
s | 指定操作。在這種情況下是,替換(查找與替代 |
/Line/line | 查找類型與替代文本 |
g | 這是“全局”的意思,意味着對文本行中所有匹配的字符串執行查找和替換操作。如果省略 g,則 只替換每個文本行中第一個匹配的字符串。 |