快速提高 Vi Vim 使用效率

2021-07-11 22:37:31 字數 4598 閱讀 6687

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...