Vim技巧之四大模式_普通模式 一見不鐘情的普通模式 普通模式下面的強悍操作 什麼是操作符 什麼是動作命令 誤操作怎麼辦 那種操作更划算 普通模式下的神秘大招
Vim技巧之四大模式_普通模式
眾所周知,vim裡面最具特色的東西就是它可以切換模式,那什麼是模式呢。可以簡單的理解為在不同的模式下面按相同的鍵而得到不同的效果。比如Vim在插入模式下面連按兩次d,那麼就會在游標位置插入兩個字母d,如果在普通模式下面連按兩次d,那麼游標所在當前行將會被刪除。
既然說是Vim的四大模式,那麼Vim到底有那四大模式呢。 普通模式 插入模式 可視模式 命令列模式
使用者可以通過按<ESC>來在各個模式之間進行切換,下面我們將詳細的介紹普通模式,其他模式我們將在後續的文章中進行詳細介紹 一見不鐘情的普通模式
像Emacs,Sublime Text這些主流的編輯器在開啟以後直接就可以向裡面輸入自己的想要的內容,但是對於第一次使用Vim的新手來說,並不和自己想象中的一樣,倒騰了一會兒就會開始抓狂: 怎麼在這個框框裡面輸入文本啊。 天啦嚕,怎麼退出這個黑框框。。。。。(博主一開始都是kill -9關掉的,哭死)
Vim在開啟的時候預設是使用普通模式的,如下圖所示
如果你需要在這個黑框框裡面輸入一些什麼東西的話,你可以在螢幕上按下面任意一個健,Vim就會進入插入模式,接著就可以輸入文本了
按鍵 |
功能 |
a |
在游標後面進行插入 |
A |
在當前游標所在行末尾插入 |
i |
從游標所在出插入 |
I |
在當前游標所在行首插入 |
o |
在當前行下面建立一行,並進行插入 |
O |
在當前行上面建立一行,並進行插入 |
那要是退出插入模式回到之間的普通模式呢。直接按<ESC>就可以啦
這時候你可能就會問了,不是有一個插入模式就可以了麼。為啥還要加一個普通模式呢。你看其他編輯器都沒有這麼多的模式。。。這就是Vim的精化所在,對於其他編輯器來說,如果要實現一個比較複雜的操作,基本上都是通過<Ctrl>,<Alt>,<Shilt>組合來完成的,但是Vim偏不這樣,Vim是通過在不同模式之間的切換來實現複雜的操作,簡單來說,普通模式就是用來發動技能的。而插入模式則是進行簡單的文本操作
比如需要刪除當前游標所在行,對於沒有模式的編輯器是這樣發動這個技能的
<CTRL-K>(Emacs)
<CTRL-L><Backspace>(Sublime Text)
如果是Vim,那麼首先進入普通模式,然後發動刪除行的技能
<ESC>(進入到普通模式),dd(刪除當前行)
個人還是比較喜歡Vim一點,簡潔明了;之前也試過Ctrl到死的Emacs,組合按鍵真是多,對與手小的人來說簡直就是一種折磨。 普通模式下面的強悍操作
普通模式下面的操作可以解釋為下面這個公式:
操作符+動作命令=操作 操作符 + 動作命令 = 操作
什麼是操作符。
操作符就是你打算接下來要幹什麼。比如上文中提到的d,就是刪除操作符,除了刪了操作符,還有下面這些操作符:
操作符 |
用途 |
c |
修改 |
d |
刪除 |
y |
複製 |
g~ |
大小寫反轉 |
gu |
轉為小寫 |
gU |
轉為大寫 |
> |
向右縮排 |
< |
向佐縮排 |
= |
自動縮排 |
什麼是動作命令。
操作符是用來指定一個操作,這個操作也不能瞎操作吧。我要刪除一行文本,不能把整個檔案的全部內容都給刪了吧。。。所以,簡單來說,動作命令就是用來指定操作符作用的範圍
那動作命令有那些呢。其實動作命令比較靈活,這裡我總結為有兩類: 一類是文字物件,比如aw , ap 一類是位置範圍, 比如l ,j,k,f{char},$,^,0…
文字物件類型的動作命令
文字物件 |
操作範圍 |
aw |
游標所在單詞加上一個空格 |
iw |
游標所在單詞 |
ap |
游標所在段落 |
i< |
<>裡面的文本 |
i{ |
{}裡面的文本 |
i” |
""裡面的文本 |
假設現在有這樣一行文本
I am a Vimer
我們需要刪除Vimer這個單詞
$ (移動到行尾)
daw(刪除游標所在單詞以及一個空格)
最後得到:
I am a
位置範圍類型的動作命令
那什麼是位置範圍呢。就是從當前游標開始,經過一次移動命令以後新的游標位置之間的文本,比如3j,10<Space>,3l,f{char}等等等等,只要可以移動游標的命令都可以
假設現在有這樣一行文本
I am a Vimer
我們要將Vimer這個單詞字幕e之間的文本全部轉為大寫
0 (移動到行首)
gUte(操作符(gU)+(新的游標位置te))
最後得到:
I AM A VIMer
注意一點:
當一個操作符當被連續兩次調用的時候,對應的作用範圍就是當前行,比如dd就是刪除當前行,yy就是複製當前行,gUgU就是將當前行轉為大寫 誤操作怎麼辦。
我們可以切換到普通模式,然後u,就可以撤消之前進行的誤操作,比如用dd誤刪了一行文本,我們直接輸入u就可以撤消之前的刪除操作
下面我們來看一個栗子:
輸入一行文本
I am a Vimer
發現將Vimer誤輸為Vier,於是返回到普通模式,點擊u希望撤消這個錯誤的單詞輸入,但是驚奇的發現之前輸入的I am a文本也不見了,Vim撤消的太多了。。
那該怎麼辦。怎麼控制Vim撤消的粒度呢。
u鍵會觸發撤消命令,它會撤消最新的修改。一次修改可以是改變文檔內文本的任意操作,其中包括了在普通模式,可視模式,以及命令列模式中所觸發的命令,而且一次修改也包括了在一次插入模式中輸入或者刪除的文本,也就是說i{insert some stuff}<ESC>算是一次修改
所以我們還是可以控制u撤消的粒度的,在插入模式中,每一次<ESC>就算是一次粒度的控制 那種操作更划算。
什麼叫做划算。那就是用最少的按鍵動作完成更多的文本操作
舉個栗子:
現在需要刪除下面文本的最後一個單詞
I am a Vimer
操作一:
$
db(向前刪除單詞)
x(刪除x)
操作二:
$
b(最後一個單詞的詞首)
dw(刪除單詞)
操作三:
$
daw
上面三個操作都是用相同的按鍵數,這一步上大家打成平手,要是我們還要把剩下的兩個單詞都刪除呢。前兩個操作明顯還需要從頭重複一次,但是第三個操作我們只需要用.操作就可以重複修改命令,所以操作三明顯更划算。所以划算的更寬廣的定義不僅是當前操作,還有將來的操作也要計算進來 普通模式下的神秘大招
這個神秘大招其實就是 <C-a>:對數字進行加操作 <C-x>:對數字進行減操作
<C-a>命令會把當前游標之上或者之上的數加1,如果需要加多次,可以[count]<C-a>,這樣就會使數值加上count
舉個栗子:
現有一段文本:
I am 23 years old
現在需要將23改為24,如果現在你不知道這個技巧,那就只有
f3(移動到3)
r4(將3改為4)
未免太繁瑣了
現在我們只需要
<Ctrl-a>(游標立馬跳轉到23上,並將數值加1,變為24)
要是現在需將23改為1023(千年老妖了)
只需要
1000<Ctrl-a>
同理可得<C-x>