vim 是 vi 編輯器的升級版,是 Linux 世界最為著名的一款文本編輯器,國外有個叫 vimgolf 的網(wǎng)站,將 vim 操作比作打高爾夫球芍瑞,里面設(shè)計了很多挑戰(zhàn)答捕,你可以在那里測試持际、提高自己的 vim 水平呜叫。
那么傲诵,如何衡量你的vim水平?
最簡單粗暴的方式就是計算擊鍵數(shù)镇防,修改同樣一段文本缕溉,擊鍵次數(shù)越少泉褐,水平越高,一鍵對應(yīng)一分狂丝,即分?jǐn)?shù)越少易猫,水平越高怜跑。
下面這個挑戰(zhàn)叫:逗號問題
初始文本
,0,1,2,3,4,5,6,7,89
,1,2,3,4,5,6,7,8,90
,2,3,4,5,6,7,8,9,01
,3,4,5,6,7,8,9,0,12
,4,5,6,7,8,9,0,1,23
56,7,8,9,0,1,2,3,4,
67,8,9,0,1,2,3,4,5,
78,9,0,1,2,3,4,5,6,
89,0,1,2,3,4,5,6,7,
90,1,2,3,4,5,6,7,8,
目標(biāo)文本
0,1,2,3,4,5,6,7,8,9
1,2,3,4,5,6,7,8,9,0
2,3,4,5,6,7,8,9,0,1
3,4,5,6,7,8,9,0,1,2
4,5,6,7,8,9,0,1,2,3
5,6,7,8,9,0,1,2,3,4
6,7,8,9,0,1,2,3,4,5
7,8,9,0,1,2,3,4,5,6
8,9,0,1,2,3,4,5,6,7
9,0,1,2,3,4,5,6,7,8
觀察初始文本與目標(biāo)文本差異可知狮暑,作者的目標(biāo)是褐奴,除了第一列前和最后一列后無逗號,其余每一位數(shù)字均由,
隔開踊兜,原始文本需要改的地方是:
- 前五行
- 第一列逗號刪掉
- 最后一列兩位數(shù)字用
,
分隔開
- 后五行
- 第一列兩位數(shù)字用
,
分隔開 - 最后一列逗號刪掉
- 第一列兩位數(shù)字用
知道了不同筷频,現(xiàn)在就讓我們瞄準(zhǔn)目標(biāo)蓬网,開始打vim高爾夫吧!ready go皮官!
第一局:29分
第一局摄乒,我的得分是29分梨水,也就是擊了29鍵逼龟。既然是批量操作之斯,我首先想到的是命令模式扁眯,該模式也被稱為冒號模式壮莹,因為以冒號開頭。
:1,5norm x$P<CR>
- 首先輸入
:
進(jìn)入命令模式
姻檀,要操作前五行命满,需輸入1,5
,這里1
也可以換成.
绣版,因為進(jìn)入文件時胶台,光標(biāo)在第一行狭莱,命令模式
中.
代表光標(biāo)所在行
-
norm
是normal
的縮寫(可以省兩鍵),即普通模式
概作,兩個模式各有千秋腋妙,普通模式
擅長近程攻擊,操作范圍窄讯榕;命令模式
適合遠(yuǎn)程攻擊骤素,操作范圍廣,二者優(yōu)勢互補(bǔ)愚屁,珠聯(lián)璧合济竹。 -
norm
后空一格以輸入普通模式
命令,刪(x)第一個字符(,
)霎槐,跳到行位($
在普通模式
中是指作用到行尾)送浊,在最后一個字符前粘貼(P
)之前刪掉的字符(,
),按<CR>
(Enter)鍵執(zhí)行操作 - 至此丘跌,首輪操作完畢袭景,光標(biāo)跳到第5行倒數(shù)最后一個逗號上
:6,$norm $x0p<CR>ZZ
- 同樣是在
命令模式
中調(diào)用普通模式
,操作范圍是第6行到最后一行闭树,$
在命令模式
中代表最后一行耸棒。 -
$x
代表挑戰(zhàn)到行尾,然后刪掉最后一個字符(,
)报辱,因為操作范圍是最后五行与殃,所以最后一列的逗號都會被刪掉 -
0
代表絕對行首,也可以叫它硬行首碍现,軟行首是^
,光標(biāo)跳轉(zhuǎn)到行首后幅疼,執(zhí)行p
,就會粘貼剛才刪掉的逗號昼接,刪掉的字符會保存在寄存器中爽篷,大寫的p在光標(biāo)前粘貼寄存器中的字符,小寫的p在光標(biāo)后粘貼寄存器中的字符辩棒。按<CR>
(Enter)鍵執(zhí)行操作 - 至此全部修改完成狼忱,但是別忘了膨疏,我們還要保存退出的一睁,這里用的是
ZZ
,還可以用:wq
和:x
佃却,不過命令模式
執(zhí)行需要按<CR>
(Enter)鍵者吁,這樣一來,:wq
需要按四個鍵饲帅,:x
需要按三個鍵复凳,而ZZ
只需要按兩個鍵便可
第二局:26分
使用命令模式
雖然簡單易懂瘤泪,但是局限也很明顯,那就是無法再降低擊鍵數(shù)了育八,這次我們換一個模式:可視模式
对途,所謂可視模式
其實還是在普通模式
中,只不過可以像鼠標(biāo)一樣選中字符髓棋、行实檀、塊。
<C-V>4jx$<C-V>4jI,<Esc>6G<C-V>4jA,<Esc>$<C-V>4jdZZ
-
<C-V>
(ctrl+v)進(jìn)入塊選擇模式按声,我們想操作前五行的第一列膳犹,就向下選中4行(執(zhí)行4j
),刪除(x
)第一列逗號; -
$<C-V>4jI,<Esc>
签则,意思是跳到行尾须床,進(jìn)入可視化模式
,選中前五行最后一列渐裂,在選中列開頭插入逗號豺旬,然后按ESC
退出插入模式
-
6G<C-V>4jA,<Esc>
,意思是跳到第6行(普通模式
中跳轉(zhuǎn)到第n行柒凉,命令是nG)哈垢,進(jìn)入可視化模式
,選中后五行第一列扛拨,在選中列末尾插入逗號耘分,然后按ESC
退出插入模式
-
$<C-V>4jdZZ
,意思是跳到行尾绑警,進(jìn)入可視化模式
求泰,選中后五行最后一列,然后刪除該列计盒,最后按ZZ
保存退出
第三局:19分
第二次嘗試雖然比第一次降低3次按鍵渴频,但是還有很大的優(yōu)化空間,我們先把他放在一邊北启,這次我們換一種方式卜朗,利用 vim 的錄制宏來操作。
qa<C-V>4jx6G$q@a0p{$PZZ
-
qa
輸完就代表開始錄制了咕村,接下來的操作<C-V>4jx6G$
场钉,先是刪除前五行第一列第一個字符,
- 然后
6G
跳轉(zhuǎn)到第6行,$
跳轉(zhuǎn)到該行尾部懈涛,q@a
代表結(jié)束錄制逛万,然后重復(fù)一次剛才的操作,后五行最后一個字符便被刪掉了 -
0p
回到第六行行首批钠,并在第一列后粘貼剛才刪掉的,
-
{
跳轉(zhuǎn)到段首宇植,這里便是第一行第一個字符得封,$P
跳到行尾并在前一個字符前粘貼寄存器里內(nèi)容,即,
-
ZZ
保存退出
第四局:14分
<C-V>Mx$P}<C-V>4kx0pZZ
還記得第二局吧指郁,現(xiàn)在我們來優(yōu)化下
-
<C-V>Mx
進(jìn)入可視化模式忙上,選中前五行第一個字符并刪掉,M
代表屏幕中間行 -
P}<C-V>4kx
闲坎,P
這里直接粘貼,
晨横,不用像之前那樣還選中再粘貼,}
跳到段尾箫柳,進(jìn)入可視化模式手形,4k
像上移動4行,即選中最后五行的最后一列悯恍,然后刪掉(x
) -
0pZZ
跳到行首库糠,直接p
粘貼寄存器里的,
,然后保存退出涮毫,一共才用14鍵
這是我能想出來的最少鍵數(shù)了瞬欧,不過還有更變態(tài)的
終極操作:12分
qaxpeq98@aZZ
只有你的擊鍵數(shù)足夠少才能看到比你更少的,我玩到第四局才看到世界排名第一的操作罢防,他是用錄制宏的方式解決的
-
qa
開始錄制宏艘虎,xp
刪掉第一個字符(,
),并將其粘貼到后面咒吐,e
跳到詞尾野建,即跳到剛才粘貼的那個逗號上,然后停止錄制恬叹,重復(fù)98次上述操作 - 有個更變態(tài)的候生,其實只需要重復(fù)94次就可以了