菜鳥vimer成長記——第1章、統一概念


  不管學什么技術,我都深信概念是最重要的。是影響整個學習軌跡,決定能在這個技術領域高度。

  當然如果你現在的目的不是在學習而在於解決問題(很多人不願意承認,或者沒發現),那概念就暫時沒那么重要了。

目的

   弄清楚這些概念,有助於記憶,舉一反三。重復的東西只學一次!!

用鍵盤不用鼠標

  第一關是理解vim的設計思路,vim設計之初就是整個文本編輯都用鍵盤而非鼠標來完成,鍵盤上幾乎每個鍵都有固定的用法。

  

  具體有兩個要注意的建議:

學會盲打

  如果你要低頭看着鍵盤打字,或者鍵位不熟悉,或者指法不舒服,那學習Vim 的好處不會立竿見影地顯現出來。要高效地使用Vim,必須學會盲打。

不要離開主鍵盤

  手指千萬不要離開主鍵盤。很多人會說用光標鍵盤也沒事,偶爾用一下或者設置一下鼠標。

  不離開的理由:任何操作通過鍵盤都是可以完成的,只是不知道或者不熟悉而已,只要練習這些時間最終是可以被消除的。而回來切這中間是需要時間的,這些時間再怎么練習也是不可避免的。

組合式的設計理念

  vim的學習,特別像漢字學習或者linux學習,通過組合。漢字你只要記幾個部首和意義字,很多你沒學過字組合在面前也能看得懂。linux,只要記住基本的命令,通過組合可以實現強大復雜的功能。

  所以重點在於,通過各個維度划分快捷成獨立概念。然后在操作的時候通過組合的方法去思維

每個快捷即是獨立概念

  這里要描述的是概念,所以不會窮舉快捷。具體的快捷到時會打散到各個模式里的常用操作。

  比如:

  • 表示動作的有: d(刪除),m(移動),co(復制),s(替換),y(復制)等
  • 表示移動的有:$(詞尾),0(詞首),w|b|e(詞),G(行),h|j|k|l(方向)等
  • 表示重復的量詞:n(表示任何正數)

組合這些概念來完成命令

  有一句話:越簡單越靈活,實現的能力越強大。這是因為組合的存在。

  比如:

  • "dd" 刪除當前行
  • "3dd" 刪除三行
  • "d$" "d"表示刪除,$"代表行尾,刪除到行尾的內容(包含光標);
  • "dw"  表示刪除一個單詞
  • "dG"  表示刪除到文件末尾
  • "dff"  表示刪除到第一個f

正則表達式

  vim的操作核心是文本,既然是文本必須會提到正則。如果正則不熟悉,那很多地方是很糾結的。

  這里只描述vim使用正則的場景。這里我划分的是兩大塊內容:通過正則匹配定位到文本,然后通過動作去操作

  想了解更多正則,可以參考下面資源:

  幾個正則表達式文章

  正則表達式30分鍾入門教程

  正則基礎之——NFA引擎匹配原理

應用場景

  • 查找(閱讀):/|?
  • 替換:s
  • 刪除:d
  • 拷貝:co
  • 移動:m

  更細則的東西將在normal模式里記敘。

所有重復都可以被解決

  本質上講,我們的工作是重復性的。不論是在幾個不同的地方做相同的小改動,還是在文檔的相似結構間移動,我們都會重復很多操作。凡是可以簡化重復性操作的方式,都會成倍地節省我們的時間,都會被vim解決。

  下面的舉例只為說明問題,可能還不是最佳的方案。

文本操作

  vim通過:.命令,;命令,量詞,history,宏,vimscript等手段來實現消除重復操作。

  但是消除這些重復的關鍵是以下的思想

不要自我重復

  舉例說明:

//有以下的文本
//要實現的效果,每行遞進縮進一行。
Line one
Line two
Line three
Line four
//千萬不要這么操作
    //>G
    //j >G
    //j >G
    //j >G
//上面的做法不斷再重復>G這兩個操作。
//合理一些的操作是
    //>G
    //j .
    //j .
    //j .
//當然再合理一些是用宏錄制或者還有其他辦法

  只要是重復的任何操作都可以被解決。這點非常重復!

 絕不多使用一個命令

  舉例說明:

//現在光標在行中間,但是發現行尾沒有分號,或者說這行暫時不需要想給注釋掉。
//千萬不要這么做
    //移動$|0
    //按i
    //輸出符號
//合理做法
    //直接使用I|A
    //輸出符號

  只要一個命令可以完成的,堅決不使用二個或者多個命令。換句話說,每一個vim命令都是有原子的獨立的概念,請最終獨立記憶。  

使修改可重復

  舉例說明:

//給+號左右都多加一個空格
var foo = "method(" + argument1 +","+argument2+")";
//千萬不要這么做:
    //f+
    //i空格->(移動光標)空格
    //f+ .
    //f+ .
//合理作法:
    //f+
    //s空格+空格
    //f+ .
    //f+ .

  首先,第一種使用了光標移動,這是很費時的,因為要在主鍵盤和光標區切換。其次也不能實現效果,因為.命令重復的是vim的操作,光標不包括在內。

  所以很多時候要思考修改可被重復。 

使移動可重復

  上面的例子可以再簡化。;命令會重復上次查找。因此后面可以輸入兩次按;即可。

  所以,盡量讓移動也可以重復。就可以使用;來簡化。

理想模式

  ;命令帶我們到下一個目標字符上,而.命令則重復上次的修改。因為連續輸入2次;.就可以完成全部。理想的模式:用一鍵移動,另一鍵執行

IDE操作|個性化操作

  只要是重復的都可以被解決。上面說的是文本的重復操作解決方案。除了文本之外還有更多的重復。比如在不同使用功能時使用不同插件。根據自己的個人喜愛,把重復的設置通過配置文件來固化。

  比如說

  • 在標記快速定位,可以使用ctags插件等。
  • 你不用每次都set nu,不用每次都設置縮進。

回退everything

  當vim讓一個操作或者移動可以方便地重復時,我們經常會不小心操作太快過了頭。這時不用擔心,vim提供了強大的回退機制。

//目的                          操作                      重復          回退 
//做出一個修改                   {edit}                    .              u 
//在行內查找下一指定字符           f{char}/t{char}          ;              , 
//在行內查找上一指定字符           F{char}/T{char}          ;              , 
//在文檔中查找下一處匹配項         /pattern<CR>              n              N 
//在文檔中查找上一處匹配項         ?pattern<CR>              n              N 
//執行替換                      :s/target/replacement      &              u 
//執行一系列修改                 qx{changes}q              @x            u 

 

模式

  Vim 提供一個區分模式的用戶界面,就是 說在Vim中按鍵盤上的任意鍵所產生的結果可能會不一樣,而這取決於當前處於哪種模式 (mode)。知道當前正處於哪種模式,以及如何在各模式間切換,是極其重要的。在后面的系列文章中,這個是重中之重,也會圍繞着這些來記敘。主要記敘常用的4種模式。insert,normal,command-line,visual。

無處不在的help

  有任何的不清楚或者想知道,都可以通過h: xx,來閱讀更詳細的幫助信息。

  比如 

  • :h .
  • :h ;
  • :h vim-modes

  還有一個快捷鍵,K(Shift+k),它能給出你光標上的文本的幫助信息。

 


 

vim統一概念很多,不可能一下子所有列舉出來。會在后面的文章邊學習邊總結邊補充。如果大家有什么好的想法也歡迎一起探討。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM