Vim from zero to hero - Vim 從入門到精通javascript
Vim 是一個歷史悠久的文本編輯器,能夠追溯到 qed). Bram
Moolenaar 於1991年發佈初始版本.php
該項目託管在 vim.org.html
獲取Vim: 使用你最喜歡的包管理器安裝,或者在vim.org上下載 .java
討論使用相關問題最好使用 vim_use 郵件列表或者使用IRC (Freenode) 的 #vim
頻道。
歡迎加入咱們的中文討論羣:node
項目在 Github 上開發, 項目討論請訂閱 vim_dev 郵件列表.linux
經過閱讀 Why, oh WHY, do those #?@! nutheads use vi? 來對Vim進行大體的瞭解.git
Vim 堅持着模式編輯的理念. 這意味着他提供了多種模式,並根據模式,同一按鍵有不一樣含義。你能夠在 普通模式 下瀏覽文件, 在 插入模式 下插入文本, 在 可視模式 下選擇行, 在 命令模式 下執行命令.
起初這聽起來可能很複雜, 可是這有一個很大的優勢: 不須要經過同時按住多個鍵來完成操做,而是經過連續地單次按鍵。越經常使用的操做,所須要的按鍵數量越少. github
「動做」和「操做符」是一個能在模式編輯中獲得良好體現的概念。操做符開始一些行爲, 例如:修改, 刪除, 或者選擇文本。以後你要用一個動做來指定須要操做的文本區域。好比,要改變括號內的文本, 須要執行ci(
(讀作 change inner parentheses);刪除整個段落的內容, 須要執行 dap
(讀作: delete
around paragraph)。shell
若是你能看見 Vim 老司機操做,你會發現他們使用 Vim 腳本語言就如同鋼琴師操做本身的樂器同樣。複雜的操做只須要幾個按鍵就能完成。他們甚至不用刻意去想,由於這已經成爲肌肉記憶了. 這減小認識負荷並幫助人們專一與實際任務。vim
Vim 自帶一個交互式的教程,內含你須要瞭解的最基礎的信息,你能夠經過終端運行如下命令打開教程:
$ vimtutor複製代碼
不要由於這個看上去很無聊而跳過,按照此教程多練習。你之前用的 IDE 或者其餘編輯器不多是有「模式」概念的,所以一開始你會很難適應模式切換。可是你 Vim 使用的越多,肌肉記憶 將越容易造成。
Vim 基於一個 vi 克隆, 叫作 Stevie),支持兩種運行模式:"compatible" 和 "nocompatible"。在兼容模式下運行 vim 意味着使用 vi 的默認設置,而不是 vim 的默認設置。只要你沒有新建一個用戶的 vimrc 或者使用 vim -N
命令啓動 vim,那就是在兼容模式下運行 vim! 請你們不要在兼容模式下運行 vim。
下一步:
最後一個建議:使用插件以前,請先掌握 vim 的基本操做。不少插件都只是對 vim 自帶功能的封裝。
用戶的 vimrc 配置文件能夠放在 ~/.vimrc
,或者爲了更好的分離放在 ~/.vim/vimrc
,後者更便於經過版本控制軟件備份和同步整個配置,比方說github。
你能夠在網上找到許多精簡的 vimrc 配置文件, 個人版本可能並非最簡單的版本, 可是個人版本提供了一套我認爲良好的,很是適合入門的設置.
最終你須要閱讀完那些設置,而後自行決定須要使用哪些. :-)
精簡的 vimrc 地址: minimal-vimrc
若是你有興趣, 這裏是我(原做者)的 vimrc.
建議:大多數插件做者都維護不止一個插件而且將他們的 vimrc 放在 Github 上展現(一般放在叫作 "vim-config" 或者 "dotfiles" 的倉庫中),因此當你發現你喜歡的插件時,去插件維護者的 Github 主頁看看有沒有這樣的倉庫。
使用 :version 命令將向你展現當前正在運行的 vim 的全部相關信息,包括它是如何編譯的。
第一行告訴你這個二進制文件的編譯時間和版本號,好比:7.4。接下來的一行呈現Included patches: 1-1051
, 這是補丁版本包. 所以你 vim 確切的版本號是 7.4.1051。
另外一行顯示着一些像 Tiny version without GUI
或者 Huge version with GUI
的信息。很顯然這些信息告訴你當前的 vim 是否支持 GUI,例如:從終端中運行 gvim
或者從終端模擬器中的 vim 內運行 :gui
命令。另外一個重要的信息是 Tiny
和 Huge
。Vim 的特性集區分被叫作 tiny
,small
,normal
,big
and huge
,全部的都實現不一樣的功能子集.
:version
主要的輸出內容是特性列表.+clipboard
意味這剪貼板功能被編譯支持了, -clipboard
意味着剪貼板特性沒有被編譯支持.
一些功能特性須要編譯支持才能正常工做。例如:爲了讓 :prof
工做, 你須要使用 huge
模式編譯的 vim, 由於那種模式啓用了 +profile
特性。
若是你的輸出狀況並非那樣,而且你是從包管理器安裝 vim 的, 確保你安裝了 vim-x
,vim-x11
,vim-gtk
,vim-gnome
這些包或者類似的, 由於這些包一般都是 huge
模式編譯的.
你也能夠運行下面這段代碼來測試 Vim 版本以及功能支持:
" Do something if running at least Vim 7.4.42 with +profile enabled.
if (v:version > 704 || v:version == 704 && has('patch42')) && has('profile')
" do stuff
endif複製代碼
相關幫助:
:h :version
:h feature-list
:h +feature-list複製代碼
爲了不版權問題, 我只貼出連接:
或者在 vim 中快速打開備忘錄:vim-cheat40。
Vim 是一個文本編輯器。每次文本都是做爲緩衝區的一部分顯示的。每一份文件都是在他們本身獨有的緩衝區打開的,插件顯示的內容也在它們本身的緩衝區中。
緩衝區有不少屬性,好比這個緩衝區的內容是否能夠修改,或者這個緩衝區是否和文件相關聯,是否須要同步保存到磁盤上。
窗口 是緩衝區上一層的視窗. 若是你想同時查看幾個文件或者查看同一文件的不一樣位置,那樣你會須要窗口.
請別把他們叫作分屏. 你能夠把一個窗口分割成兩個, 可是這並無讓這兩個窗口徹底分離.
窗口能夠水平或者豎直分割而且現有窗口的高度和寬度都是能夠被調節設置的,所以,若是你須要多種窗口布局,請考慮使用標籤。
標籤頁 (標籤) 是窗口的集合. 所以使用標籤當你想使用多種窗口布局的時候.
簡單的說, 若是你啓動VIM的時候沒有附帶任何參數,你會獲得一個包含着一個呈現一個緩衝區的窗口的標籤.
順帶提一下, 緩衝區列表是全局可見的,你能夠在任何標籤中訪問任何一個緩衝區.
用相似 vim file1
的命令啓動 vim 。這個文件的內容將會被加載到緩衝區中,你如今有一個已載入的緩衝區。若是你在 vim 中保存這個文件,緩衝區內容將會被同步到磁盤上(寫回文件中)。
因爲這個緩衝區也在一個窗口上顯示, 因此他也是一個已激活的緩衝區。若是你如今經過 :e file2
命令加載另外一個文件,file1
將會變成一個隱藏的緩衝區,而且 file2
變成已激活緩衝區。
使用 :ls
咱們可以列出全部能夠列出的緩衝區。插件緩衝區和幫助緩衝區一般被標記爲不能夠列出的緩衝區,由於那並非你常常須要在編輯器中編輯的常規文件。經過 :ls!
命令能夠顯示被放入緩衝區列表的和未被放入列表的緩衝區。
未命名的緩衝區是一種沒有關聯特定文件的緩衝區,這種緩衝區常常被插件使用。好比 :enew
將會建立一個無名臨時緩衝區。添加一些文本而後使用 :w /tmp/foo
將他寫入到磁盤,這樣這個緩衝區就會變成一個已命名的緩衝區。
全局緩衝區列表是 vim 的特性。在這以前的 vi 中,僅僅只有參數列表,參數列表在 vim 中依舊可使用。
每個經過 shell 命令傳遞給 vim 的文件名都被記錄在一個參數列表中。能夠有多個參數列表:默認狀況下全部參數都被放在全局參數列表下,可是你可使用 :arglocal
命令去建立一個新的本地窗口的參數列表。
使用 :args
命令能夠列出當前參數。使用 :next
,:previous
,:first
,:last
命令能夠在切換在參數列表中的文件。經過使用 :argadd
,:argdelete
或者 :args
等命令加上一個文件列表能夠改變參數列表。
偏心緩衝區列表仍是參數列表徹底是我的選擇,個人印象中大多數人都是使用緩衝區列表的。
然而參數列表在有些狀況下被大量使用:批處理
使用 :argdo
! 一個簡單的重構例子:
:args **/*.[ch]
:argdo %s/foo/bar/ge | update複製代碼
這條命令將替換掉當前目錄下以及當前目錄的子目錄中全部的C源文件和頭文件中的"foo",並用"bar"代替。
相關幫助::h argument-list
使用 :map
命令家族你能夠定義屬於你本身的快捷鍵。該家族的每個命令都限定在特定的模式下。從技術上來講 vim 自帶高達12中模式,其中6種能夠被映射。另一些命令做用於多種模式:
Recursive | Non-recursive | Modes |
---|---|---|
:map |
:noremap |
normal, visual, operator-pending |
:nmap |
:nnoremap |
normal |
:xmap |
:xnoremap |
visual |
:cmap |
:cnoremap |
command-line |
:omap |
:onoremap |
operator-pending |
:imap |
:inoremap |
insert |
例如:這個自定義的快捷鍵只在普通模式下工做,
:nmap:echo "foo" 複製代碼
使用 :nunmap <space>
能夠取消這個映射。
對於更少數,不常見的模式(或者他們的組合),查看 :h map-modes
。
到如今爲止還好,對新手而言有一個問題會困擾他們::nmap
是遞歸執行的!結果是,右邊執行可能的映射。
你自定義了一個簡單的映射去輸出"Foo":
:nmap b :echo "Foo"<cr>複製代碼
可是若是你想要映射 b
(回退一個單詞)的默認功能到一個鍵上呢?
:nmap a b複製代碼
若是你敲擊a,咱們指望着光標回退到上一個單詞,可是實際狀況是「Foo」被輸出到命令行裏!由於在右邊,b
已經被映射到別的行爲上了,換句話說就是 :echo "Foo"<cr>
。
解決此問題的正確方法是使用一種非遞歸的映射代替:
:nnoremap a b複製代碼
經驗法則: 除非遞歸是必須的,不然老是使用非遞歸映射.
經過不給一個右值來檢查你的映射. 好比:nmap
顯示因此普通模式下的映射, :nmap <leader>
顯示全部以 <leader>
鍵開頭的普通模式下的映射。
若是你想禁止用標準映射,把他們映射到特殊字符 <nop>
上, 例如::noremap <left> <nop>
。
相關幫助:
:h key-notation
:h mapping
:h 05.3複製代碼
能夠協助咱們覈對翻譯,或者從章節列表中認領章節進行翻譯。