有一個古老的笑話,說是一個在紐約的游客向行人打聽這座城市中著名古典音樂場館的方向:
> 游客: 請問一下,我怎樣去卡內基音樂大廳?
> 行人: 練習,練習,練習!
學習 Linux 命令行,就像要成為一名造詣很深的鋼琴家一樣,它不是我們一下午就能學會的技能。這需要 經歷幾年的勤苦練習。在這一章中,我們將介紹 vi(發音“vee eye”)文本編輯器,它是 Unix 傳統中核心程序之一。 vi 因它難用的用戶界面而有點聲名狼藉,但是當我們看到一位大師坐在鋼琴前開始演奏時,我們的確成了 偉大藝術的見證人。雖然我們在這里不能成為 vi 大師,但是當我們學完這一章后, 我們會知道怎樣在 vi 中玩“筷子”。
## 為什么我們應該學習 vi
在現在這個圖形編輯器和易于使用的基于文本編輯器的時代,比如說 nano,為什么我們還應該學習 vi 呢? 下面有三個充分的理由:
* vi 很多系統都預裝。如果我們的系統沒有圖形界面,比方說一臺遠端服務器或者是一個 X 配置損壞了的本地系統,那么 vi 就成了我們的救星。雖然 nano 逐漸流行起來,但是它 還沒有普及。POSIX,這套 Unix 系統中程序兼容的標準,就要求系統要預裝 vi。
* vi 是輕量級且執行快速的編輯器。對于許多任務來說,啟動 vi 比起在菜單中找到一個圖形化文本編輯器, 再等待編輯器數倍兆字節的數據加載而言,要容易的多。另外,vi 是為了加快輸入速度而設計的。 我們將會看到,當一名熟練的 vi 用戶在編輯文件時,他或她的手從不需要移開鍵盤。
* 我們不希望其他 Linux 和 Unix 用戶把我們看作膽小鬼。
好吧,可能只有兩個充分的理由。
## 一點兒背景介紹
第一版 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。
## 啟動和停止 vi
要想啟動 vi,只要簡單地輸入以下命令:
~~~
[me@linuxbox ~]$ vi
~~~
一個像這樣的屏幕應該出現:
~~~
VIM - Vi Improved
....
~~~
正如我們之前操作 nano 時,首先要學的是怎樣退出 vi。要退出 vi,輸入下面的命令(注意冒號是命令的一部分):
~~~
:q
~~~
shell 提示符應該返回。如果由于某種原因,vi 不能退出(通常因為我們對文件做了修改,卻沒有保存文件)。 通過給命令加上嘆號,我們可以告訴 vi 我們真要退出 vi。
~~~
:q!
~~~
小貼示:如果你在 vi 中“迷失”了,試著按下 Esc 鍵兩次來找到路(回到普通模式)。
> 兼容模式
>
> 上面實例中的啟動屏幕(來自于 Ubuntu 8.04),我們看到一行文字“以 Vi 兼容的模式運行”。這意味著 vim 將以近似于 vi 常規的模式 運行,而不是 vim 的高級規范。為了這章的目的,我們想要使用 vim 的高級規范。要想這樣做, 你有幾個選擇:
>
> 用 vim 來代替 vi。
>
> 如果命令生效,考慮在你的.bashrc 文件中添加別名 vi=’vim’。
>
> 或者,使用這個命令在你的 vim 配置文件中添加一行:
>
> echo “set nocp” >> ~/.vimrc
>
> 不同的 Linux 發行版其 vim 軟件包也迥然不同。一些發行版只是安裝了 vim 的最小版本, 其默認只支持有限的 vim 特性。當練習隨后的課程時,你可能會遇到缺失的功能。 如果是這種情況,就安裝 vim 的完整版。
## 編輯模式
再次啟動 vi,這次傳遞給 vi 一個不存在的文件名。這也是用 vi 創建新文件的方法。
~~~
[me@linuxbox ~]$ rm -f foo.txt
[me@linuxbox ~]$ vi foo.txt
~~~
如果一切運行正常,我們應該獲得一個像這樣的屏幕:
~~~
....
"foo.txt" [New File]
~~~
每行開頭的波浪號(”~”)指示那一行不存在文本。這表示我們有一個空文件。還沒有輸入任何字符?
學習 vi 時,要知道的第二件非常重要的事情是(知道了如何退出 vi 后)vi 是一個模式編輯器。當 vi 啟動后,進入 的是命令模式。這種模式下,幾乎每個按鍵都是一個命令,所以如果我們打算輸入字符,vi 會發瘋,弄得一團糟。
### 插入模式
為了在文件中添加文本,首先我們必須進入插入模式。按下”i”按鍵進入插入模式。之后,我們應該 在屏幕底部看到下面一行,如果 vi 運行在高級模式下(這不會出現在 vi 兼容模式下):
~~~
-- INSERT --
~~~
現在我們能輸入一些文本了。試著輸入這些文本:
~~~
The quick brown fox jumped over the lazy dog.
~~~
按下 Esc 按鍵,退出插入模式并返回命令模式。
### 保存我們的工作
為了保存我們剛才對文件所做的修改,我們必須在命令模式下輸入一個 ex 命令。 通過按下”:”鍵,這很容易完成。按下冒號鍵之后,一個冒號字符應該出現在屏幕的底部:
~~~
:
~~~
為了寫入我們修改的文件,我們在冒號之后輸入”w”字符,然后按下回車鍵:
~~~
:w
~~~
文件將會寫入到硬盤,并且我們應該在屏幕底部得到一個確認信息,就像這樣:
~~~
"foo.txt" [New] 1L, 46C written
~~~
小貼示:如果你閱讀 vim 的文檔,你注意到(混淆地)命令模式被叫做普通模式,ex 命令 叫做命令模式。當心。
## 移動光標
當在 vi 命令模式下時,vi 提供了大量的移動命令,其中一些是與 less 閱讀器共享的。這里 列舉了一些:
表13-1: 光標移動按鍵
| 按鍵 | 移動光標 |
|-------|---------|
| l or 右箭頭 | 向右移動一個字符 |
| h or 左箭頭 | 向左移動一個字符 |
| j or 下箭頭 | 向下移動一行 |
| k or 上箭頭 | 向上移動一行 |
| 0 (零按鍵) | 移動到當前行的行首。 |
| ^ | 移動到當前行的第一個非空字符。 |
| $ | 移動到當前行的末尾。 |
| w | 移動到下一個單詞或標點符號的開頭。 |
| W | 移動到下一個單詞的開頭,忽略標點符號。 |
| b | 移動到上一個單詞或標點符號的開頭。 |
| B | 移動到上一個單詞的開頭,忽略標點符號。 |
| Ctrl-f or Page Down | 向下翻一頁 |
| Ctrl-b or Page Up | 向上翻一頁 |
| numberG | 移動到第 number 行。例如,1G 移動到文件的第一行。 |
| G | 移動到文件末尾。 |
為什么 h,j,k,和 l 按鍵被用來移動光標呢?因為在開發 vi 之初,并不是所有的視頻終端都有 箭頭按鍵,熟練的打字員可以使用規則的鍵盤按鍵來移動光標,他們的手從不需要移開鍵盤。
vi 中的許多命令都可以在前面加上一個數字,比方說上面提到的”G”命令。在命令之前加上一個 數字,我們就可以指定命令執行的次數。例如,命令”5j”導致 vi 向下移動5行。
## 基本編輯
大多數編輯工作由一些基本的操作組成,比如說插入文本,刪除文本和通過剪切和粘貼來移動文本。 vi,當然,以它自己的獨特方式來支持所有的操作。vi 也提供了有限的撤銷形式。如果我們按下“u” 按鍵,當在命令模式下,vi 將會撤銷你所做的最后一次修改。當我們試著執行一些基本的 編輯命令時,這會很方便。
### 追加文本
vi 有幾種不同進入插入模式的方法。我們已經使用了 i 命令來插入文本。
讓我們返回到我們的 foo.txt 文件中,呆一會兒:
~~~
The quick brown fox jumped over the lazy dog.
~~~
如果我們想要在這個句子的末尾添加一些文本,我們會發現 i 命令不能完成任務,因為我們不能把 光標移到行尾。vi 提供了追加文本的命令,明智地命名為”a”命令。如果我們把光標移動到行尾,輸入”a”, 光標就會越過行尾,vi 進入插入模式。這樣就允許我們添加更多的文本:
~~~
The quick brown fox jumped over the lazy dog. It was cool.
~~~
記住按下 Esc 按鍵來退出插入模式。
因為我們幾乎總是想要在行尾附加文本,所以 vi 提供了一種快捷方式來移動到當前行的末尾,并且能添加 文本。它是”A”命令。試著用一下它,給文件添加更多行。
首先,使用”0”(零)命令,將光標移動到行首。現在我們輸入”A”,來添加以下文本行:
~~~
The quick brown fox jumped over the lazy dog. It was cool.
Line 2
Line 3
Line 4
Line 5
~~~
再一次,按下 Esc 按鍵退出插入模式。
正如我們所看到的,大 A 命令非常有用,因為在啟動插入模式之前,它把光標移到了行尾。
### 打開一行
我們插入文本的另一種方式是“打開”一行。這會在存在的兩行之間插入一個空白行,并且進入插入模式。 這種方式有兩個變體:
表13-2: 文本行打開按鍵
| 命令 | 打開行 |
|-------|---------|
| o | 當前行的下方打開一行。 |
| O | 當前行的上方打開一行。 |
我們可以演示一下:把光標放到”Line 3”上,按下小 o 按鍵。
~~~
The quick brown fox jumped over the lazy dog. It was cool.
Line 2
Line 3
line 4
line 5
~~~
在第三行之下打開了新的一行,并且進入插入模式。按下 Esc,退出插入模式。按下 u 按鍵,撤銷我們的修改。
按下大 O 按鍵在光標之上打開新的一行:
~~~
The quick brown fox jumped over the lazy dog. It was cool.
Line 2
Line 3
Line 4
Line 5
~~~
按下 Esc 按鍵,退出插入模式,并且按下 u 按鍵,撤銷我們的更改。
### 刪除文本
正如我們期望的,vi 提供了各種各樣的方式來刪除文本,所有的方式包含一個或兩個按鍵。首先, x 按鍵會刪除光標位置的一個字符。可以在 x 命令之前帶上一個數字,來指明要刪除的字符個數。 d 按鍵更通用一些。類似 x 命令,d 命令之前可以帶上一個數字,來指定要執行的刪除次數。另外, d 命令之后總是帶上一個移動命令,用來控制刪除的范圍。這里有些實例:
表13-3: 文本刪除命令
| 命令 | 刪除的文本 |
|-------|---------|
| x | 當前字符 |
| 3x | 當前字符及其后的兩個字符。 |
| dd | 當前行。 |
| 5dd | 當前行及隨后的四行文本。 |
| dW | 從光標位置開始到下一個單詞的開頭。 |
| d$ | 從光標位置開始到當前行的行尾。 |
| d0 | 從光標位置開始到當前行的行首。 |
| d^ | 從光標位置開始到文本行的第一個非空字符。 |
| dG | 從當前行到文件的末尾。 |
| d20G | 從當前行到文件的第20行。 |
把光標放到第一行單詞“It”之上。重復按下 x 按鍵直到刪除剩下的部分。下一步,重復按下 u 按鍵 直到恢復原貌。
注意:真正的 vi 只是支持單層面的 undo 命令。vim 則支持多個層面的。
我們再次執行刪除命令,這次使用 d 命令。還是移動光標到單詞”It”之上,按下的 dW 來刪除單詞:
~~~
The quick brown fox jumped over the lazy dog. was cool.
Line 2
Line 3
Line 4
Line 5
~~~
按下 d$刪除從光標位置到行尾的文本:
~~~
The quick brown fox jumped over the lazy dog.
Line 2
Line 3
Line 4
Line 5
~~~
按下 dG 按鍵刪除從當前行到文件末尾的所有行:
~~~
~
....
~~~
連續按下 u 按鍵三次,來恢復刪除部分。
### 剪切,復制和粘貼文本
這個 d 命令不僅刪除文本,它還“剪切”文本。每次我們使用 d 命令,刪除的部分被復制到一個 粘貼緩沖區中(看作剪切板)。過后我們執行小 p 命令把剪切板中的文本粘貼到光標位置之后, 或者是大 P 命令把文本粘貼到光標之前。
y 命令用來“拉”(復制)文本,和 d 命令剪切文本的方式差不多。這里有些把 y 命令和各種移動命令 結合起來使用的實例:
表13-4: 復制命令
| 命令 | 復制的內容 |
|-------|---------|
| yy | 當前行。 |
| 5yy | 當前行及隨后的四行文本。 |
| yW | 從當前光標位置到下一個單詞的開頭。 |
| y$ | 從當前光標位置到當前行的末尾。 |
| y0 | 從當前光標位置到行首。 |
| y^ | 從當前光標位置到文本行的第一個非空字符。 |
| yG | 從當前行到文件末尾。 |
| y20G | 從當前行到文件的第20行。 |
我們試著做些復制和粘貼工作。把光標放到文本第一行,輸入 yy 來復制當前行。下一步,把光標移到 最后一行(G),輸入小寫的 p 把復制的一行粘貼到當前行的下面:
~~~
The quick brown fox jumped over the lazy dog. It was cool.
Line 2
Line 3
Line 4
Line 5
The quick brown fox jumped over the lazy dog. It was cool.
~~~
和以前一樣,u 命令會撤銷我們的修改。光標仍然位于文件的最后一行,輸入大寫的 P 命令把 所復制的文本粘貼到當前行之上:
~~~
The quick brown fox jumped over the lazy dog. It was cool.
Line 2
Line 3
Line 4
Line 5
The quick brown fox jumped over the lazy dog. It was cool.
~~~
試著執行上表中一些其他的 y 命令,了解小寫 p 和大寫 P 命令的行為。當你完成練習之后,把文件 恢復原樣。
### 連接行
vi 對于行的概念相當嚴格。通常,不可能把光標移到行尾,再刪除行尾結束符(回車符)來連接 當前行和它下面的一行。由于這個原因,vi 提供了一個特定的命令,大寫的 J(不要與小寫的 j 混淆了, j 是用來移動光標的)把行與行之間連接起來。
如果我們把光標放到 line 3上,輸入大寫的 J 命令,看看發生什么情況:
~~~
The quick brown fox jumped over the lazy dog. It was cool.
Line 2
Line 3 Line 4
Line 5
~~~
## 查找和替換
vi 有能力把光標移到搜索到的匹配項上。vi 可以在單一行或整個文件中運用這個功能。 它也可以在有或沒有用戶確認的情況下實現文本替換。
### 查找一行
f 命令查找一行,移動光標到下一個所指定的字符上。例如,命令 fa 會把光標定位到同一行中 下一個出現的”a”字符上。在一行中執行了字符的查找命令之后,通過輸入分號來重復這個查找。
### 查找整個文件
移動光標到下一個出現的單詞或短語上,使用 / 命令。這個命令和我們之前在 less 程序中學到 的一樣。當你輸入/命令后,一個”/”字符會出現在屏幕底部。下一步,輸入要查找的單詞或短語后, 按下回車。光標就會移動到下一個包含所查找字符串的位置。通過 n 命令來重復先前的查找。 這里有個例子:
~~~
The quick brown fox jumped over the lazy dog. It was cool.
Line 2
Line 3
Line 4
Line 5
~~~
把光標移動到文件的第一行。輸入:
~~~
/Line
~~~
然后鍵入回車。光標會移動到第二行。下一步,輸入 n,光標移到第三行。重復這個 n 命令,光標會 繼續向下移動直到遍歷了所有的匹配項。雖然目前,我們只是使用了單詞和短語來作為我們的查找 模式,但是 vi 允許使用正則表達式,一種強大的用來表示復雜文本模式的方法。我們將會在隨后 的章節里面詳盡地介紹正則表達式。
### 全局查找和替代
vi 使用 ex 命令來執行查找和替代操作(vi 中叫做“替換”)。把整個文件中的單詞“Line”更改為“line”, 我們輸入以下命令:
~~~
:%s/Line/line/g
~~~
我們把這個命令分解為幾個單獨的部分,看一下每部分的含義:
| 條目 | 含義 |
|-------|---------|
| : | 冒號字符運行一個 ex 命令。 |
| % | 指定要操作的行數。% 是一個快捷方式,表示從第一行到最后一行。另外,操作范圍也 可以用 1,5 來代替(因為我們的文件只有5行文本),或者用 1,$ 來代替,意思是 “ 從第一行到文件的最后一行。” 如果省略了文本行的范圍,那么操作只對當前行生效。 |
| s | 指定操作。在這種情況下是,替換(查找與替代)。 |
| /Line/line | 查找類型與替代文本。 |
| g | 這是“全局”的意思,意味著對文本行中所有匹配的字符串執行查找和替換操作。如果省略 g,則 只替換每個文本行中第一個匹配的字符串。 |
執行完查找和替代命令之后,我們的文件看起來像這樣:
~~~
The quick brown fox jumped over the lazy dog. It was cool.
line 2
line 3
line 4
line 5
~~~
我們也可以指定一個需要用戶確認的替換命令。通過添加一個”c”字符到這個命令的末尾,來完成 這個替換命令。例如:
~~~
:%s/line/Line/gc
~~~
這個命令會把我們的文件恢復先前的模樣;然而,在執行每個替換命令之前,vi 會停下來, 通過下面的信息,來要求我們確認這個替換:
~~~
replace with Line (y/n/a/q/l/^E/^Y)?
~~~
括號中的每個字符都是一個可能的選擇,如下所示:
表13-5: 替換確認按鍵
| 按鍵 | 行為 |
|-------|---------|
| y | 執行替換操作 |
| n | 跳過這個匹配的實例 |
| a | 對這個及隨后所有匹配的字符串執行替換操作。 |
| q or esc | 退出替換操作。 |
| l | 執行這次替換并退出。l 是 “last” 的簡寫。 |
| Ctrl-e, Ctrl-y | 分別是向下滾動和向上滾動。用于查看建議替換的上下文。 |
如果你輸入 y,則執行這個替換,輸入 n 則會導致 vi 跳過這個實例,而移到下一個匹配項上。
## 編輯多個文件
同時能夠編輯多個文件是很有用的。你可能需要更改多個文件或者從一個文件復制內容到 另一個文件。通過 vi,我們可以打開多個文件來編輯,只要在命令行中指定要編輯的文件名。
~~~
vi file1 file2 file3...
~~~
我們先退出已經存在的 vi 會話,然后創建一個新文件來編輯。輸入:wq 來退出 vi 并且保存了所做的修改。 下一步,我們將在家目錄下創建一個額外的用來玩耍的文件。通過獲取從 ls 命令的輸出,來創建這個文件。
~~~
[me@linuxbox ~]$ ls -l /usr/bin > ls-output.txt
~~~
用 vi 來編輯我們的原文件和新創建的文件:
~~~
[me@linuxbox ~]$ vi foo.txt ls-output.txt
~~~
vi 啟動,我們會看到第一個文件顯示出來:
~~~
The quick brown fox jumped over the lazy dog. It was cool.
Line 2
Line 3
Line 4
Line 5
~~~
### 文件之間轉換
從這個文件轉到下一個文件,使用這個 ex 命令:
~~~
:n
~~~
回到先前的文件使用:
~~~
:N
~~~
當我們從一個文件移到另一個文件時,如果當前文件沒有保存修改,vi 會阻止我們轉換文件, 這是 vi 強制執行的政策。在命令之后添加感嘆號,可以強迫 vi 放棄修改而轉換文件。
另外,上面所描述的轉換方法,vim(和一些版本的 vi)也提供了一些 ex 命令,這些命令使 多個文件更容易管理。我們可以查看正在編輯的文件列表,使用:buffers 命令。運行這個 命令后,屏幕頂部就會顯示出一個文件列表:
~~~
:buffers
1 # "foo.txt" line 1
2 %a "ls-output.txt" line 0
Press ENTER or type command to continue
~~~
注意:你不同通過:n 或:N 命令在由:e 命令加載的文件之間進行切換。這時要使用:buffer 命令, 其后加上緩沖區號碼,來轉換文件。
### 從一個文件復制內容到另一個文件
當我們編輯多個文件時,經常地要復制文件的一部分到另一個正在編輯的文件。使用之前我們學到的 拉(yank)和粘貼命令,這很容易完成。說明如下。以打開的兩個文件為例,首先轉換到緩沖區1(foo.txt) ,輸入:
~~~
:buffer 1
~~~
我們應該得到以下輸出:
~~~
The quick brown fox jumped over the lazy dog. It was cool.
Line 2
Line 3
Line 4
Line 5
~~~
下一步,把光標移到第一行,并且輸入 yy 來復制這一行。
轉換到第二個緩沖區,輸入:
~~~
:buffer 2
~~~
現在屏幕會包含一些文件列表(這里只列出了一部分):
~~~
total 343700
-rwxr-xr-x 1 root root 31316 2007-12-05 08:58 [
....
~~~
移動光標到第一行,輸入 p 命令把我們從前面文件中復制的一行粘貼到這個文件中:
~~~
total 343700
The quick brown fox jumped over the lazy dog. It was cool.
-rwxr-xr-x 1 root root 31316 2007-12-05 08:58 [
....
~~~
### 插入整個文件到另一個文件
也有可能把整個文件插入到我們所編輯的文件中。看一下實際操作,結束 vi 會話,重新 啟動一個只打開一個文件的 vi 會話:
~~~
[me@linuxbox ~]$ vi ls-output.txt
~~~
再一次看到我們的文件列表:
~~~
total 343700
-rwxr-xr-x 1 root root 31316 2007-12-05 08:58 [
~~~
移動光標到第三行,然后輸入以下 ex 命令:
~~~
:r foo.txt
~~~
這個:r 命令(是”read”的簡稱)把指定的文件插入到光標位置之前。現在屏幕應該看起來像這樣:
~~~
total 343700
-rwxr-xr-x 1 root root 31316 2007-12-05 08:58 [
....
The quick brown fox jumped over the lazy dog. It was cool.
Line 2
Line 3
Line 4
Line 5
-rwxr-xr-x 1 root root 111276 2008-01-31 13:36 a2p
....
~~~
## 保存工作
像 vi 中的其它操作一樣,有幾種不同的方法來保存我們所修改的文件。我們已經研究了:w 這個 ex 命令, 但還有幾種方法,可能我們也覺得有幫助。
在命令模式下,輸入 ZZ 就會保存并退出當前文件。同樣地,ex 命令:wq 把:w 和:q 命令結合到 一起,來完成保存和退出任務。
這個:w 命令也可以指定可選的文件名。這個的作用就如”Save As…“。例如,如果我們 正在編輯 foo.txt 文件,想要保存一個副本,叫做 foo1.txt,那么我們可以執行以下命令:
~~~
:w foo1.txt
~~~
* * *
注意:當上面的命令以一個新名字保存文件時,但它并沒有更改你正在編輯的文件的名字。 如果你繼續編輯的話,你還是在編輯文件 foo.txt,而不是 foo1.txt。
* * *
## 拓展閱讀
即使把這章所學的內容都加起來,我們也只是學了 vi 和 vim 的一點兒皮毛而已。這里 有一些在線的資料,你可以用來繼續 vi 學習之旅。
* 學習 vi 編輯器-一本來自于 Wikipedia 的 Wikibook,是一本關于 vi 的簡要指南,并 介紹了幾個類似 vi 的程序,其中包括 vim。它可以在以下鏈接中得到:
[http://en.wikibooks.org/wiki/Vi](http://en.wikibooks.org/wiki/Vi)
* The Vim Book-vim 項目,一本570頁的書籍,包含了(幾乎)所有的 vim 特性。你能在下面鏈接中找到它:
* Wikipedia 上關于 Bill Joy 的文章,vi 的創始人。
[http://en.wikipedia.org/wiki/Bill_Joy](http://en.wikipedia.org/wiki/Bill_Joy)
* Wikipedia 上關于 Bram Moolenaar 的文章,vim 的作者:
[http://en.wikipedia.org/wiki/Bram_Moolenaar](http://en.wikipedia.org/wiki/Bram_Moolenaar)
- 第一章:引言
- 第二章:什么是shell
- 第三章:文件系統中跳轉
- 第四章:研究操作系統
- 第五章:操作文件和目錄
- 第六章:使用命令
- 第七章:重定向
- 第八章:從shell眼中看世界
- 第九章:鍵盤高級操作技巧
- 第十章:權限
- 第十一章:進程
- 第十二章:shell環境
- 第十三章:VI簡介
- 第十四章:自定制shell提示符
- 第十五章:軟件包管理
- 第十六章:存儲媒介
- 第十七章:網絡系統
- 第十八章:查找文件
- 第十九章:歸檔和備份
- 第二十章:正則表達式
- 第二十一章:文本處理
- 第二十二章:格式化輸出
- 第二十三章:打印
- 第二十四章:編譯程序
- 第二十五章:編寫第一個shell腳本
- 第二十六章:啟動一個項目
- 第二十七章:自頂向下設計
- 第二十八章:流程控制 if分支結構
- 第二十九章:讀取鍵盤輸入
- 第三十章:流程控制 while/until 循環
- 第三十一章:疑難排解
- 第三十二章:流程控制 case分支
- 第三十三章:位置參數
- 第三十四章:流程控制 for循環
- 第三十五章:字符串和數字
- 第三十六章:數組
- 第三十七章:奇珍異寶