一星期入門Vim
前言
都說使用了Vim後,編程體驗倍感絲滑,無奈起步坡度確實有點陡,總讓人望而卻步。
我之前嘗試過Vim兩次以上,每次都都因為搞不清其各種模式、各種按鍵命令,而用起來總磕磕絆絆,每次堅持不超過一個下午就放棄。
但是每次逛一些技術社區,總看到各路大神不經意地說一句Vim,又總覺得如此強大之物,不去一番體驗,實在遺憾,心裏又癢癢。
結合當前的狀況:
- 每個IDE的快捷鍵總是Ctrl、Alt、Shift加其他鍵組合,按鍵頻率左右手分配不均,使用多了總感覺小拇指有些發通
- 無法離開鼠標,無法形成流暢的工作流,每次編碼正起勁,但是要做點調整,雙手不得不停下來,右手離開鍵盤,去握住鼠標,看著光標移動,最後點一下,深感到非常不適的割裂感
以下則是我覺得必須體驗一番Vim的主要理由:
- 聽說Vim本身編輯器非常靈活,各種強大功能都可以定制出來。
- 另外使用Vim插件+現代編輯器,可以使用Vim鍵盤流操作無縫切換到各種現在編輯器,不會Vim的,換一個編輯器就得重新記其快捷鍵,這樣看來Vim雖然前期體驗可能較為痛苦,但是學會了可能一勞永逸,綜合起來,用來記住快捷鍵的時間應該是比非使用Vim的要少的
- Vim的鍵盤流不僅可以在編輯器上使用,基於其理念開發出的各種插件,還可以在瀏覽器、命令行等地方使用,大多數情況基本能拋棄鼠標,這對於鐘愛鍵盤操作的我來說實在誘惑巨大
於是,我決定再一次出發,還好這次終於堅持下來了,記錄一下本次經歷。
首先我改用Google搜索學習資源,然後發現一些很好玩和有用的東西,比如有些網站把學習Vim做成一個遊戲,讓你在遊戲中使用Vim的命令操作,這篇 博客 列舉出學習Vim的一些好網站。
最後我選擇 Vim Genius 這個網站作為學習陣地,它把Vim常用的幾個命令分成幾個關卡,讓你一個個地去學,每學一個關卡後都讓你用鍵盤按著要求輸入所學的命令,每個命令都會重復幾次,確保你能夠記住,並且不能跳過和不能任意選擇後面的關卡。
我的學習方法是這樣的:
- 先使用Vim Genius學習一個關卡並完成關卡的練習,然後把學到的命令記錄下來
- 邊學邊記錄命令的一些規律,其實Vim的鍵位設置是有規律的,找出其中的規律,可以幫助我們快速記住,並且能舉一反三。如大寫表示對整行或者反方向操作,兩個重復小寫表示對整行操作等
- 不要急於求成,不要一天就刷完Vim Genius,我想如果不紮實地做上面的練習並且做記錄,那刷新了估計也馬上就忘了,因此我每天只刷兩個關卡左右,每天早晚飯之後刷一次,這樣總共7個關卡,用三四天就刷完了
- 刷完了Vim Genius以後就實戰了,我使用
idea+ideavim插件
作為實戰陣地,首先,開始用要求不要高,先學會了最基本的操作,能夠會增刪改查、復制粘貼就可以,不要把Vim看做拯救你的神,而是先把Vim當做一個普通的編輯器來使用 - 學會了基本的操作後,遇到還不順手的地方再查相關的命令即可,慢慢地進步
使用以上方法,先在Vim Genius上刷三四天的基本命令,然後再咬著牙堅持實戰三四天,一個星期結束,此時使用Vim,至少能夠達到像用Windows記事本的效率了,算是基本入門了,後面再慢慢學高級特性就快多了。
回頭再看看Vim已經不再是一座不知從哪開始的高山,而是平滑的坡裏隱隱看到有一條小道可從中穿過
最後,奉上我記錄的命令和總結的規律,有誤的歡迎指出。
- 註:使用
-
號作為釋義和命令的分隔符
規律
- 大寫表示對整行或者反方向操作
- 兩個重復小寫表示對整行操作
- 數量放在命令單位前面完成批量操作:單獨的每個命令可以完成的事,可以稱為該命令的命令單位,如w的單位為一個單詞,dd的單位為一行,則可以在命令前加數量,使之批量操作,如3w、2dd,d2w,其中d2w,數量2後面為w,則表示操作單位為w(單詞),操作為d,因此表示刪除2個單詞
- 選擇單詞:從光標位置選擇到單詞末尾,並非從單詞首字符開始選擇
- ^表示行首字符,$表示行尾字符
- l表示向後(last),h表示向前(head)
- w表示保存(write)和單詞(word)
- x表示關閉、剪切
- w表示保存、單詞
- g表示跳轉
- c表示更改
- p表示粘貼(paste)
- d表示剪切、刪除(delete)
- r表示替換(replace)
- e表示編輯(edit)或末尾(end)
vim文檔特殊按鍵標記(key-notation)
<CR>
:確定鍵<C-大小寫字符>
:ctrl+對應字符
模式
- 回正常模式(Normal Mode)-Esc
- 入命令行模式(Command-Line Mode)-:
- 入替換模式(Replace Mode)-R,相當於普通編輯下按Insert鍵
- 入可視模式(Visual Mode)-v,打開此模式便於選擇
- 入可視模式並選擇光標下的單詞-vw
入可視模式選擇光標下的單詞並刪除-vwd或vwx
文件
- 閉文件-:q
- 閉文件但不保存-:q!
- 存文件-:w
- 閉文件並保存-:x或:wq或:ZZ
- 存文件為play.rb-:w play.rb
入文件hat.rb-:r hat.rb
輸入
- 光標前輸入-i
- 行首輸入-I
- 光標後輸入-a
- 行尾後輸入-A
- 下方添加新行-o
上方添加新行-O
跳轉
- 下左右-kjhl
- 到下一個單詞的首字符-w
- 後跳到第3個單詞前-3w
- 前跳到單詞首字符-b
- 後跳到單詞尾字符-e
- 後跳到第3個單詞後-3e
- 到上一個單詞尾字符-ge
- 到當前行的最後一個字符-$
- 到當前行的第一個字符-^
- 到行首-0
- 到第50行-50G或:50
- 到最後一行行首-G
- 到第一行行首-gg
- 到匹配的閉合括號-%
- 到上一次光標位置-ctrl+o
- 到下一次光標位置-ctrl+i
- 翻一屏(forward)-ctrl+f
- 翻一屏(back)-ctrl+b
- 翻半屏(down)-ctrl+d
- 翻半屏(up)-ctrl+u
- 下滾動(extra)-ctrl+e
- 上滾動-ctrl+y
當前光標位置垂直居中-zs
撤銷重做
- 銷-u
- 行撤銷-U
做-ctrl+r
查找
- 下查找“waldo”-/waldo
- 上查找“carmen”-?carmen
- 到下一個查找結果-n
- 到上一個查找結果-N
- 置查找忽略大小寫-:set ic或者:set ignorecase
置查找區分大小寫-:set noic或者:set noignorecase
更改替換
- 改光標下的字符-r
- 改單詞-cw,即刪除從光標處到單詞結尾並進入編輯模式
- 後更改3個單詞-c3w
- 後更改3個字符-c3l或3s
- 前更改3個字符-c3h
- 改到行尾-C或c$
- 當前行用good替換bad-:%s/bad/good
- 整個文件用bye題號hi-:%s/hi/bye/g
整個文件用y替換x並出現更改提示-:%s/x/y/gc,會高亮所有可被替換的位置,並需要一個個選擇是否確認替換
剪切
- 後剪切3個字符-3x或d3l
- 前剪切3個字符-3X或d3h
- 後剪切2個單詞-d2w
- 視模式下剪切選中內容-d
- 切到行尾-D或d&
- 切整行-dd
切兩行-2dd
復制粘貼
- 制單詞-yw
- 入可視模式選擇單詞並復制-vwy
- 制整行-yy
- 制到行首-y0
- 制到行尾-y$
- 貼到光標後-p
貼到光標前-P
寄存器
- 用方式:"寄存器名+操作命令
- 看幫助-:help register
- 看所有寄存器內容-:reg
- 名(默認)寄存器-"",存放最近一次內容
- 字寄存器-"0~"9,存放最近2~9次內容
- 名寄存器-"a~"z,可以通過名稱選擇把內容存入指定寄存器
- 擇和拖拽(系統)寄存器-"*、"+、"~,連接系統粘貼板
- 制單詞到a寄存器-"ayw
- 貼a寄存器的內容-"ap
- 貼系統粘貼板的內容-"+p
- 命令行模式粘貼默認寄存器的內容-ctrl+r+"
命令行模式粘貼系統粘貼板的內容-ctrl+r+*
代碼
- 改、剪切、復制包圍光標的配對字符之間的內容-ci+配對字符的前字符
- 改、剪切、復制包圍光標的配對字符之間的內容(包括配對字符)-ca+配對字符的前字符
- 行向左、右縮進-3<<、3>>
圖模式下向左、右縮進選中的行-<、>
其他
- 用shell運行命令ls-:!ls
- 開新文件sun.rb-:e sun.rb
- 看命令w幫助-:help w
- 常模型下反轉光標下字符大小寫-~
- 視模式下轉換為大寫-U,轉換為小寫-u
置光標上下至少有5行可見-:set scrolloff=5,可用於設置光標一直垂直居中
一星期入門Vim