========== command mode ==========
insert mode
由 command mode 進入 insert mode 有六個常用的按鍵: i I a A o O
i Insert text before the cursor
I Insert text Before the first non-blank in the line
a Append text after the cursor
A Append text at the end of the line
o Begin a new line below the cursor and insert text
O Begin a new line above the cursor and insert text (並把文字往下推一行)
常見移動指令
# 註 : C-f 表示先按著 Ctrl 鍵不放,接著再按下 f
0 移至行首(zero)
^ 移至行首第一個非空白處
$ 移至行尾
w 向前一個 word
e 向前一個 word (的結尾)
b 向後一個 word
gg 檔案開頭
G 檔案結尾
:n 移動到 line n # nG /ngg 也可以
C-f Page Down (C for Ctrl) # 記法 => Forward
C-b Page Up # 記法 => Backward
C-u half Page Up # 記法 => Upward
C-d half Page Down # 記法 => Downward
C-y 往上捲一行
C-e 往下捲一行 # 記法 => extra lines
% 相匹配的括號 () {} [] 等
[ 移至上一個function的開頭"{"符號
] 移至下一個function的開頭"{"符號
刪除指令
x Delete characters under and after the cursor # 就是 delete
X Delete characters before the cursor # 就是 Backspace
dd delete one line #del後刪除所在行的換行符號
dw delete 到游標所在的 word 結尾
d0 delete 到 0 (行首) #del 後保留所在行的換行符號
d$ delete 到 $ (行尾) # 大寫 D 也是一樣的功能
修改指令
(change => delete and insert)
cw change a word
cc change a line
C change to the end of the line
J 串接相鄰行
u 復原 # 記法 => undo
C-r Redo changes which were undone
. (一個點) 重複上一個步驟
複製貼上
vi 的複製是 y (yank), 貼上是 p (put),所以 vi 裏面複製貼上會說 yank and put
最常見的用法:
yy 將游標所在行 yank 起來 => 然後將游標移至所要貼的行之處按 p ( P 則會出現在游標之上 )
"指令 + 數字"
在指令模式中,你可以在任何前面提到的動作前面加上數字 n,則你所做的動做將會被重覆n次,
如要刪除十行可以按 10dd ,要複製十行可以用 10yy,
要將同樣的文字重覆寫十次可以用 10i (離開 insert mode 之後,剩下的九次會自動重複)
檔案操作
vi filename 打開 filename 這個檔案,如果缺省 filename 的話會開一個新的檔案
:q quit vi
:wq write and quit
:x 類似 :wq 不過只有檔案有更動時才會寫入
ZZ 類似 :wq 不過只有檔案有更動時才會寫入
:q! force to quit
:e 完全改爛了的時候,重新讀取檔案 # 記法 => edit
:w [filename] 將編輯的資料儲存成另一個檔案(類似另存新檔)
:! command 暫時離開 vi 到指令列模式下執行 command 的顯示結果!
例如『:! ls /home』即可在 vi 當中察看 /home 底下以 ls 輸出的檔案資訊
:set 觀看有做過修改的set
:set all 列出所有set
:n,mw filename 將 n 到 m 行寫到 filename 裏面
搜尋
/string 向下尋找 string
?string 向上尋找 string
n 找下一個 string 的位置 # 記法 => next
N 找上一個 string 的位置
* Search forward for the word nearest to the cursor. (搜尋這個光標的word)
# Search backward for the word nearest to the cursor.
n1,n2s/word1/word2/g
n1 與 n2 為數字。在第 n1 與 n2 行之間尋找 word1 這個字串,並將該字串取代為 word2 !舉例來說,在 100 到 200 行之間搜尋 vbird 並取代為 VBIRD 則:
『:100,200s/vbird/VBIRD/g』。(常用)
:1,$s/word1/word2/g
從第一行到最後一行尋找 word1 字串,並將該字串取代為 word2 !(常用)
:1,$s/word1/word2/gc 從
第一行到最後一行尋找 word1 字串,並將該字串取代為 word2 !且在取代前顯示提示字元給使用者確認 (confirm) 是否需要取代!(常用)
編碼設定
vi 對編碼的支援比較不完善,可以透過 locale 或是 screen 來調整
請參考: Setting - 工作站編碼設定(UTF-8)
移動
參考 :h motion.txt
# 移動游標到螢幕某處
H To Home (top) line
M To Middle line
L To Last line
# 移動游標到某個字元
find / to + {char}
f 向右找到 {char} 在本行的位置然後把游標移過去
t 跟 f 一樣,但是是移動到 {char} 的前一格
F 向左找
T 向左找
# 移動到某個句子或段落
{ 向前一個段落
} 向後一個段落
( 向前一個句子
) 向後一個句子
# 捲動螢幕到某處
zt 把現在的這行捲到螢幕的最上方 # 記法 => top
zz 把現在的這行捲到螢幕的中央
zb 把現在的這行捲到螢幕的底部 # 記法 => bottom
*重新縮排
gg #先跳至首行
=G #縮排 另一種做法 (gg v G =)
r{char} 把游標上的字元替換成替換 {char} # 記法 => Replace the character
# 重複操作就是改變整行
~ 改變大小寫
g~~ 改變整行的大小寫
gU uppercase
gUU 整行 uppercase
gu lowercase
guu 整行 lowercase
C-a 將目前游標上的數字加 1 # 記法 => add 和 screen C-a 衝突
C-x 將目前游標上的數字減 1 # 記法 => x 掉就是減少
>> 縮排 # 記法 => 往內推一層縮排
<< 反縮排 # 記法 => 往外推一層縮排
Visual Mode
如果你想對某段文字做一些操作 (像是 delete, yank...等) ,那麼你要先選取一段文字。
visual mode 就是選取一段文字,接著可以對選取的文字操作
v 進入 visual mode
V 行模式的 visual mode
C-v 區塊模式的 visual mode
C-v I 選取某個區塊,然後對於每行選取的位置插入文字
========== insert mode ==========
C-N 自動補齊next搜尋
C-P 自動補齊previous搜尋
Ctrl-X Ctrl-F 自動補齊檔名
K 函式查詢 ,若您在 VIM 中撰寫 C/C++ 程式,可以在 C/C++ 標準函式厙提供的函式名 字上按「K」,便可以呼叫出 man page 查詢該函式的用法
========== ex mode ==========
vi 在 command mode 下輸入 : (冒號) 可以開啟 ex mode
常見的用法:
:n,m d :刪除自第 n 行至第 m 行的文字
:n,m w :刪除自第 n 行至第 m 行的文字
:n,m s/patern1/patern2/[g][c] :將自第 n 行至第 m 行的文字中,把 patern1 substitute 成 patern2
# g flag 是指要不要全部都換
# c flag 是在替換前可以確認
:set helplang =en/cn #設定語言
:set mouse =a #設定可以用滑鼠
:set nu #顯示行數
:set nonu #取消顯示行數
[VIM] 當上下左右都不正常時
說了那麼多,如果只是在一個暫時的環境中,可以使用以下的指令,要求 vim 不要相容 vi 即可啦,這是適合用在在別人機器上暫時閒晃晃而不是要久留的。
- set nocompatible
- syntax on
reference:http://help.cs.nctu.edu.tw/help/index.php/HOWTO_-_vi,_vim#Introduction
沒有留言:
張貼留言
有敘述錯誤或者是觀念有問題歡迎指正