1. 程式人生 > >一星期入門Vim

一星期入門Vim

ctrl+ 遺憾 快捷鍵 應該 位置 當前 快捷 extra 字符

前言

都說使用了Vim後,編程體驗倍感絲滑,無奈起步坡度確實有點陡,總讓人望而卻步。

我之前嘗試過Vim兩次以上,每次都都因為搞不清其各種模式、各種按鍵命令,而用起來總磕磕絆絆,每次堅持不超過一個下午就放棄。

但是每次逛一些技術社區,總看到各路大神不經意地說一句Vim,又總覺得如此強大之物,不去一番體驗,實在遺憾,心裏又癢癢。

結合當前的狀況:

  1. 每個IDE的快捷鍵總是Ctrl、Alt、Shift加其他鍵組合,按鍵頻率左右手分配不均,使用多了總感覺小拇指有些發通
  2. 無法離開鼠標,無法形成流暢的工作流,每次編碼正起勁,但是要做點調整,雙手不得不停下來,右手離開鍵盤,去握住鼠標,看著光標移動,最後點一下,深感到非常不適的割裂感

以下則是我覺得必須體驗一番Vim的主要理由:

  1. 聽說Vim本身編輯器非常靈活,各種強大功能都可以定制出來。
  2. 另外使用Vim插件+現代編輯器,可以使用Vim鍵盤流操作無縫切換到各種現在編輯器,不會Vim的,換一個編輯器就得重新記其快捷鍵,這樣看來Vim雖然前期體驗可能較為痛苦,但是學會了可能一勞永逸,綜合起來,用來記住快捷鍵的時間應該是比非使用Vim的要少的
  3. Vim的鍵盤流不僅可以在編輯器上使用,基於其理念開發出的各種插件,還可以在瀏覽器、命令行等地方使用,大多數情況基本能拋棄鼠標,這對於鐘愛鍵盤操作的我來說實在誘惑巨大

於是,我決定再一次出發,還好這次終於堅持下來了,記錄一下本次經歷。

首先我改用Google搜索學習資源,然後發現一些很好玩和有用的東西,比如有些網站把學習Vim做成一個遊戲,讓你在遊戲中使用Vim的命令操作,這篇 博客 列舉出學習Vim的一些好網站。

最後我選擇 Vim Genius 這個網站作為學習陣地,它把Vim常用的幾個命令分成幾個關卡,讓你一個個地去學,每學一個關卡後都讓你用鍵盤按著要求輸入所學的命令,每個命令都會重復幾次,確保你能夠記住,並且不能跳過和不能任意選擇後面的關卡。

我的學習方法是這樣的:

  1. 先使用Vim Genius學習一個關卡並完成關卡的練習,然後把學到的命令記錄下來
  2. 邊學邊記錄命令的一些規律,其實Vim的鍵位設置是有規律的,找出其中的規律,可以幫助我們快速記住,並且能舉一反三。如大寫表示對整行或者反方向操作,兩個重復小寫表示對整行操作等
  3. 不要急於求成,不要一天就刷完Vim Genius,我想如果不紮實地做上面的練習並且做記錄,那刷新了估計也馬上就忘了,因此我每天只刷兩個關卡左右,每天早晚飯之後刷一次,這樣總共7個關卡,用三四天就刷完了
  4. 刷完了Vim Genius以後就實戰了,我使用 idea+ideavim插件 作為實戰陣地,首先,開始用要求不要高,先學會了最基本的操作,能夠會增刪改查、復制粘貼就可以,不要把Vim看做拯救你的神,而是先把Vim當做一個普通的編輯器來使用
  5. 學會了基本的操作後,遇到還不順手的地方再查相關的命令即可,慢慢地進步

使用以上方法,先在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