vi/vim 是所有 unix/linux 作業系統預設配備的編輯器。因其強大的功能和高效的操作,vi/vim 也成為眾多 unix/linux 使用者、管理員必須掌握並熟練使用的編輯工具之一。尤其是在沒有圖形介面的情況下,更是離不開 vi/vim。vi/vim 命令非常多、用法極為靈活,掌握起來有一定的難度。本文作者將結合自己的使用經驗,分七個方面著重介紹哪些原則、途徑或命令能快速提高 vi/vim 檔案編輯效率,從而達到事半功倍的效果。
vi 最初是由 bill joy 在 1976 年編碼實現的。而 vim (vi improved) 則是改進的 vi,由 bram moolenaar 在 1991 年開發並發布。vi/vim 是所有 unix/linux 作業系統預設配備的編輯器。因其強大的功能和高效的操作,vi/vim 也成為眾多 unix/linux 使用者、管理員必須掌握並熟練使用的編輯工具之一。尤其是在沒有圖形介面的情況下,更是離不開 vi/vim。vi/vim 命令非常多、用法極為靈活,掌握起來有一定的難度。詳細介紹 vi/vim 使用方法的文章有很多,因而本文就不一一述及 vi/vim 的諸多功能及命令。本文作者將結合自己的使用經驗,分七個方面著重介紹哪些原則、途徑或命令能快速提高 vi/vim 檔案編輯效率,從而達到事半功倍的效果。本文述及的途徑或命令均只針對系統預設配置的 vi/vim。關於 vi/vim 各種定製後的功能不在本文討論範圍之列。(注:本文中提到的所有命令均在 red hat enterprise linux server release 6.1 上測試通過。)
「工欲善其事,必先利其器」。在 vi/vim 版本的選擇上,原則是「能用 vim 就不要使用 vi;能用最新版就不要守著舊版本」。vim 提供的功能和特性要比 vi 多得多,如語法加亮著色功能等。就使用效果及效率來說,編輯同樣的檔案,使用 vim 更勝一籌;就版本來說,新版的往往會修復舊版的一些缺陷及不足。這就要求我們在可能的情況下一定要使用最新版的 vim。
小技巧:
在 linux 下,如果以 root 使用者登入系統的話,通過 vi 命令開啟的 vim 編輯器往往只載入最基本的功能,像語法加亮著色的功能基本上沒有。在 root 使用者下使用 vim 所有功能的技巧是用 vim 命令開啟 vim 編輯器。
開啟及關閉 vi/vim 的方法有很多,既可以只啟動 vi/vim 編輯器本身,也可以在啟動 vi/vim 編輯器的同時開啟乙個或多個檔案;既可以放棄存檔退出,也可以只儲存檔案的一部分。以下為相關命令列表:
表 1. 啟動及關閉 vi/vim 的基本命令
功能命令
說明啟動
vi 開啟 vi/vim
vi 開啟 vi/vim 並載入檔案
退出zq 無條件退出
:q! 無條件退出
zz 存檔並退出
:wq 存檔並退出
儲存部分檔案
:m,nw 將 m 行到 n 行部分的內容儲存到檔案 中
:m,nw >> 將 m 行到 n 行的內容新增到檔案 的末尾
掌握並熟練這些基本命令是使用 vi/vim 的基本要求。只有這樣,才能在實際使用過程中做到按需選擇,靈活使用,提高 vi/vim 的使用效率。需要說明的一點是:在使用 vi/vim 的時候,有時想臨時退出 vi/vim,轉到 shell 環境裡去做一些操作,等這些操作結束後,再繼續回到剛才的 vi/vim 狀態。針對這一經常碰到的現實需求,很多人在大多數情況下會將儲存退出 vi/vim,進入 shell 執行操作,然後再重新開啟剛才編輯的檔案。其實這是乙個很低效的方法,因為再次開啟需要重新定位剛才編輯的地方,麻煩不說,vi/vim 編輯器的狀態也完全不一樣了。其實,有兩種方法可以可以實現臨時退出 vi/vim、進入 shell 環境後再回來的要求:
方法一:使用 ctrl-z 以及 fg 這兩個命令組合。
這一解決方法主要利用了 linux/unix 的作業機制。具體原理是:ctrl-z 命令將當前的 vi/vim 程序放到後台執行,之後 shell 環境即可為你所用;fg 命令則將位於後台的 vi/vim 程序放到前台執行,這樣我們就再次進入 vi/vim 操作介面並恢復到原先的編輯狀態。
方法二:使用行命令 :sh。
在 vi/vim 的正常模式下輸入 :sh即可進入 linux/unix shell 環境。在要返回到 vi/vim 編輯環境時,輸入 exit 命令即可。
這兩種方法實現機制不一定,但效果一樣,都非常快捷有效。
vi/vim 中關於游標移動的命令非常多,這也是很多人經常困惑並且命令用不好的地方之一。其實 vi/vim 中很多命令是針對不同的操作單位而設的,不同的命令對應不同的操作單位。因而,在使用命令進行操作的時候,首先要搞清楚的就是要採用哪種操作單位,也就是說,是要操作乙個字元,乙個句子,乙個段落,還是要操作一行,一屏、一頁。單位不同,命令也就不同。只要單位選用得當,命令自然就恰當,操作也自然迅速高效;否則,只能是費時費力。這也可以說是最能體現 vi/vim 優越於其它編輯器的地方之一,也是 vi/vim 有人愛有人恨的地方之一。在操作單位確定之後,才是操作次數,即確定命令重複執行的次數。要正確高效的運用 vi/vim 的各種操作,一定要把握這一原則:先定單位再定量。操作物件的範圍計算公式為:操作範圍 = 操作次數 * 操作單位。比如:5h 命令左移 5 個字元,8w 命令右移 8 個單詞。
注:有些操作單位(如檔案)是不能加操作次數。具體說明請參考 vi/vim 使用手冊。
vi/vim 中操作單位有很多,按從小到大的順序為(括號內為相應的操作命令):字元(h、l)→ 單詞 (w、w、b、b、e) → 行 (j、k、0、^、$、:n) → 句子((、))→ 段落()→ 屏 (h、m、l) → 頁(ctrl-f、ctrl-b、ctrl-u、ctrl-d) → 檔案(g、gg、:0、:$)。
具體命令解釋如下:
表 2. 移動游標的基本命令
操作單位
命令說明
字元h 左移一字元
l 右移一字元
單詞w/w 移動到下一單詞的開頭
b/b 移動到上一單詞的開頭
e/e 移動到游標所在單詞的末尾
w、b、e 命令操作的單詞是以空白字元(空格、tab)分隔的字串,比如字串「str1-str2 str3-str4」,對 w、b、e 命令來說是兩個單詞,而對 w、b、e 命令來說則是四個單詞。
行j 下移一行
k 上移一行
0 移到當前行開頭
^ 移到當前行的第乙個非空字元
$ 移到當前行末尾
:n 移動到第 n 行
0 為數字零(zero)
句子) 移動到當前句子的末尾
( 移動到當前句子的開頭
段落} 移動當前段落的末尾
)。這些操作單位有些可以加操作次數。操作物件的範圍計算公式為:操作範圍 = 操作次數 * 操作單位。比如:d3w 命令刪除三個單詞,10dd 命令刪除十行。
具體命令解釋如下:
表 3. 文字編輯的基本命令
操作單位
命令說明
字元x 刪除游標位置的字元
c 更改當前字元並進入插入模式
s 替換游標位置的字元並進入插入模式
r 替換游標位置的字元但不進入插入模式
i 在當前位置的字元之前進入插入模式
a 在當前位置的字元之後進入插入模式
單詞cw/cw 刪除當前單詞從游標開始的部分並進入插入模式
cb/cb 刪除當前單詞從游標所在位置至單詞開始的部分並進入插入模式
dw/dw 刪除當前單詞從游標開始的部分但不進入插入模式
db/db 刪除當前單詞從游標所在位置至單詞開始的部分但不進入插入模式
cw、cb、dw、db 命令操作的單詞是以空白字元(空格、tab)分隔的字串,比如字串「str1-str2 str3-str4」,對 cw,cb,dw,db 命令來說是兩個單詞,而對 cw、cb、dw、db 命令來說則是四個單詞。
行dd 刪除當前行
d0 刪除從當前游標開始到行末的內容
d$ 刪除從當前游標開始到行末的內容
i 在當前行的行首進入插入模式
a 在當前行的行尾進入插入模式
o 在當前行下方另起一行進入插入模式
o 在當前行上方另起一行進入插入模式 句子
d) 刪除當前句子從游標位置開始到句末的內容
d( 刪除當前句子從游標位置開始到句首的內容
段落d} 刪除當前段落從游標位置開始到段末的內容
d撤銷一次或n次操作
u
(大寫)
撤銷當前行的所有修改
ctrl+r
redo,即撤銷undo的操作
這一小節學習如何在vim中進行快速縮排,縮排操作均在普通模式下有效
開啟檔案進行編輯
$ vim protocols
2.shiftwidth命令
shiftwidth
命令是指上一節>>
命令產生的縮排(可以簡寫成sw
) 普通模式下輸入:
進入命令列模式下對shiftwidth
值進行設定可以控制縮排和回退的字元數 獲取目前的設定值
:set shiftwidth?
設定縮排為10個字元
:set shiftwidth=10
輸入esc
回到普通模式,再次嘗試>>
看縮排量是否變化 提高eclipse使用效率
編輯 常用快捷鍵 格式化 的快捷鍵 ctrl shift f 格式化縮排的快捷鍵是 ctrl i,只能對選中的文字進行縮排 刪除一行的快捷鍵是 ctrl d 當前視窗最大化最小化切換 ctrl m 轉到最後進行修改的位置 ctrl q 快速查詢選中的字元 ctrl k 向下 ctrl shift k...
使用WITH提高查詢效率
前兩天的業務需求裡需要關聯好幾張表出乙個詳單報表,這個需求其實很簡單,但是資料量大,源表又不是分割槽表,就變得很頭疼了。最初我的 大概是這樣子的 select a.id,a.name,a.code,b.type,select p name from c c where c.pid b.pid fro...
使用WITH提高查詢效率
前兩天的業務需求裡需要關聯好幾張表出乙個詳單報表,這個需求其實很簡單,但是資料量大,源表又不是分割槽表,就變得很頭疼了。最初我的 大概是這樣子的 select a.id,a.name,a.code,b.type,select p name from c c where c.pid b.pid fro...