2100年12月31日 星期五

vim study 指令基本篇



========== 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 的環境中,按了上下左右時,有時反而會使得編輯中的文章多了不預期的英文字母呢?經大神指導後,這個現象除了可在使用 putty 時設定 Terminal->[Keyboard] 的部分來解決外,另一種可能的原因,是因為 vim 去相容 vi 的關係,而原先 vi 上是使用 HJKL 進行左下上右的移動,相對的方向鍵反而是要另外設定對應的囉。

說了那麼多,如果只是在一個暫時的環境中,可以使用以下的指令,要求 vim 不要相容 vi 即可啦,這是適合用在在別人機器上暫時閒晃晃而不是要久留的。

  • set nocompatible
另外,偶爾換環境時,程式無可讀性的色碼時,可以用下面指令
  • syntax on
我想,這兩個 vim 的指令在其他非屬於個人機器上,算是基本常使用的設定吧。



reference:http://help.cs.nctu.edu.tw/help/index.php/HOWTO_-_vi,_vim#Introduction





沒有留言:

張貼留言

有敘述錯誤或者是觀念有問題歡迎指正