誰說Vim不是IDE?

來源:互聯網
上載者:User

標籤:


話 說作業系統、程式設計語言和編輯器似乎是程式員永恒的吐槽話題,技術發展了幾十年,大家討論起這幾個“之爭”還是充滿憤怒、津津樂道。有人描述過Emacs和 VI程式員,大家沿著不同的道路和目標前進,但總是會在某個點交叉相遇,互相扔石頭,砸到對方鼻青臉腫,然後收拾心情又繼續前行。

前一陣子我在微博上寫了一條微博回複,是關於Vim和IDE討論的:Vim和那些IDE的應用情境還是有區別的,在我看來Vim也是IDE,是程式員的必備技能之一。這基本表達了我的觀點。

原微博是@玉伯也叫射鵰發 布的,這條微博轉寄了評論了幾百次。其實表達的意思很清楚,而且主要是針對前端開發的,但是140個字實在是太少了,以至於還沒來得及解釋,很多服務端程 序員已經擼著胳膊衝上去了,玉伯後來還是在Github上寫了片長文,才算告一段落。文章很好,有興趣的童靴就別看微博了,累,直接看這篇文章就好。

這件事的直接後果,或者說給我留下的後遺症就 是,每次自己使用Vim的是總會琢磨一下這檔子事,都是程式員,都是編輯器,怎麼就那麼大的區別呢?有那麼大的區別嗎?越琢磨越覺得該寫篇文章說說Vim 這點事。非爭論,僅闡述和分享,因為工作十幾年來我從來就不是用一種編程工具搞定一切的主兒,不同情境下各種編輯器都用過。用錯過,也用對過,能在最合適 的情境使用最合適的工具已經是了不起的成就了。每種優秀的編輯器都有一些傳奇的故事,都值得大書特書,但這次我只想聊一聊Vim。

很多人把Vim和Emacs相提並論,有人說 Emacs這貨就是個捆綁了文字編輯器的作業系統,我很少用Emacs,不熟,但感覺這話大氣磅礴。Vim雖比不了作業系統,但也形成了自己的生態環境。 看似簡單的工具,似乎就是個充滿快速鍵和速度感的文字編輯器而已,一旦深入進去,卻充滿了無窮的樂趣……

至於為什麼給這篇文章起這麼個名字,讀者就當做是個噱頭好了。其實Vim、Emacs、ST2等已經和IDE沒有太大區別了。

編程人生

我個人接觸vim從2000年開始,當時正值第一波互連網浪潮,我剛畢業不久,一如現在的熱血青年,投身到互連網的大熔爐中(當然和現在的互連網弄潮兒不一樣的,當年我們大部分都被熔掉了),我參與的第一款互連網產品是洪恩線上。

當時洪恩聚集了很多清華北大的學子,有很多技 術牛人,比如Baby、Star、Panpan等等,都是響噹噹的人物,後來這些人有的離開開創了自己的事業,有的留在洪恩組成了完美世界遊戲平台的技術 班底。在當時都是需我仰望的角色,他們清一色都使用Vim在伺服器端編程,連文法高亮都不設定,搭建的BBS也是當年水木清華那種,通過終端Telnet 訪問。一進辦公室,清一色都是黑漆漆的螢幕,黑地綠字,劈劈啪啪的在那裡敲鍵盤,非常有韻律,我想,這簡直酷斃了。

那會兒用的伺服器端作業系統記得是 Redhat Linux和FreeBSD,程式設計語言是Perl、HTML4和Javascript。在這種的環境下,對我這樣一個常年使用Editplus的菜鳥來說 壓力非常大,別人的開發、編譯和發布環境都在伺服器端,而我則需要在本地編寫好程式,通過Editplus的ftp功能上傳到伺服器端,再進行調試、測試 和發布,非常麻煩。所以我的工作除了學習編程技巧,還需要掌握Linux操作和Vim編輯器。當時吃住都在公司,時間充裕到讓你不學習都不好意思,於是很 快掌握了Linux和Vim的基本操作,編碼時雙手在鍵盤上下翻飛非常有成就感。我對文法高亮情有獨鐘,經常把自己的介面配置的花花綠綠,沒事看看也是一 種樂趣。

自此以後,十幾年過去了,自己的工作一直沒有 離開過Vim,2001年開始使用Java、Jsp,當時Eclipse、IDEA、Netbeans這樣的“神器”還未崛起,大家依舊在伺服器端編程, 通過make編譯和調試,通過編寫Shell指令碼進行整合測試和發布,包括產品安裝。後來隨著這些牛IDE的發展,JavaEE相關的工作大部分轉移到 IDE中完成,接著寫了兩年Python等指令碼,又開始大量使用Vim,編程環境是Solaris。此後的工作涉及了很多技術,Vim斷斷續續一直在用。 到了2009年,我開始把工作環境完全切換到了Mac上,記得當時開啟Mac的終端,欣喜若狂的想,這不就是Vim、Shell和IDE的完美集合嗎?後 來還專門寫了一篇部落格來介紹這段經曆。

直到現在,Vim依然是我工作和學習中不可缺少的一個工具平台,單單就Vim來說,還有太多東西要學…

使用情境

我提倡在不同的情境下採用最合適的工具,這一 點和 @玉伯也叫射鵰 是一致的。那麼就有人問,Vim適合什麼情境呢?簡單說,Vim比較適合Unix/Linux伺服器端編程,當然這因人而異。我個人使用Vim主要用來進 行Shell/Python/C編程。Ruby也寫,但更多使用Textmate。在Unix/Linux伺服器端編輯和修改檔案也離不開Vim,另外由 於我個人工作環境是Mac,所以改個文字檔什麼的,也就用Vim順手做了。

和現實中很多程式員交流時,大家會認為不用 Vim一樣能修改伺服器端的檔案,ftp拉下來,改好了再傳上去。這當然是一種方案,但不是最優方案。而且極端情況下需要直接在客戶服務器上解決問題,你 總不能說對不起我不會在Linux下編輯檔案,Down一份下來先?這就像用Vim編寫Markdown檔案一樣,能不能用,當然可以,甚至有人已經為 Vim開發了MD外掛程式,可以編寫時通過快速鍵查看轉換的HTML文本,但是這顯然不如Mou+Byword。

編寫JavaEE、HTML/CSS/JS、Objective-C,最優方案可能是Eclipse、IDEA、XCode等,這些優秀的工具可以協助我們提升效率,減少錯誤,但是如果你還想更進一步,那麼Vim絕對值得你擁有。

Vim用了很多年,一直沒有總結過(這個人很 懶),我想正好用這篇文章分享一下心得和用法。網路上介紹Vim的文章浩如煙海,各種精巧的用法數不勝數,看起來還是比較費時費力。Vim本身開箱即用, 什麼都不配置也可以使用其準系統,如果大家掌握了基本操作,以下內容可以協助提升效率,打造你的專屬Vim。

 <待續,下一篇介紹VIM的基礎概念和配置,然後是外掛程式,然後是VIM編程......>

環境配置

“如果你認為Vim只是一個文字編輯器,你就輸了”——來自Vim老鳥

Vim以簡潔的方式提供了豐富的配置功能,主要配置體系由一個檔案和檔案夾組成。在一台安裝了Vim的OS X/Linux/Unix機器上,進入使用者主目錄,可以找到.vimrc檔案和.vim檔案夾,這就是Vim所有的配置資訊。

(1).vimrc介紹

使用者目錄下的.vimrc檔案就是Vim針對目前使用者的主設定檔,該檔案不是必備的,沒有的話就建立它。檔案位於目前使用者的主目錄下,可以用~/.vimrc找到,Vim啟動時會自動運行檔案中的每條命令。
通過.vimrc我們可以為Vim進行個人化配置,包括使用方式、顯示風格、編寫函數和運行外掛程式等,.vimrc中所有的命令都可以在Vim運行時通過類似:comm args[=args1]的方式動態運行,即時生效。
以下是一個.vimrc的範例指令碼,包含了一些常用配置,後面的注釋是簡要說明。

.vimrc的注釋用雙引號(")表示 ,範例中的大括弧僅表示功能區,屬於注釋的一部分,無其他含義
.vimrc的配置非常豐富,可以定義各種宏、函數、外掛程式和映射,我見過最長的.vimrc配置有1000多行,這裡的樣本比較簡單,適合入門級使用者

syn on                      "文法支援 "common conf {{             通用配置 set ai                      "自動縮排 set bs=2                    "在insert模式下用退格鍵刪除 set showmatch               "代碼匹配 set laststatus=2            "總是顯示狀態行 set expandtab               "以下三個配置配合使用,設定tab和縮排空格數 set shiftwidth=4 set tabstop=4 set cursorline              "為游標所在行加底線 set number                  "顯示行號 set autoread                "檔案在Vim之外修改過,自動重新讀入  set ignorecase              "檢索時忽略大小寫 set fileencodings=uft-8,gbk "使用utf-8或gbk開啟檔案 set hls                     "檢索時高亮顯示匹配項 set helplang=cn             "協助系統設定為中文 set foldmethod=syntax       "程式碼摺疊功能 "}} "conf for tabs, 為標籤頁進行的配置,通過ctrl h/l切換標籤等 let mapleader = ‘,‘ nnoremap <C-l> gt nnoremap <C-h> gT nnoremap <leader>t : tabe<CR> "conf for plugins {{ 外掛程式相關的配置 "狀態列的配置  "powerline{ set guifont=PowerlineSymbols\ for\ Powerline set nocompatible set t_Co=256 let g:Powerline_symbols = ‘fancy‘ "} "pathogen是Vim用來管理外掛程式的外掛程式 "pathogen{ call pathogen#infect() "} "}}

 

(2).vim檔案夾

.vim是Vim的主設定檔夾,位於目前使用者的主目錄下,可以用cd ~/.vim進入。該檔案夾一般用來放置外掛程式和相關的協助文檔,常用的目錄結構包括:

doc                           //協助文檔目錄 autoload                      //Vim啟動時自動載入的外掛程式目錄 plugin                        //外掛程式目錄,一般在使用Vim時通過命令呼出

當然,如果你已經安裝了足夠多外掛程式,那麼這個目錄下就會變得五花八 門,syntax、snippets、indent等檔案夾都會冒出來了。一個外掛程式所包含的檔案往往會分布在多個檔案夾下,管理起來比較麻煩,稍後我們會 介紹一個管理外掛程式的外掛程式,讓這個目錄變得乾淨整潔,容易管理,這個外掛程式的名字叫pathogen

在Vim中輸入命令:help,即可進入協助頁面,預設是英文協助,如果你喜歡看中文,可以通過以下方式安裝中文協助內容:

  1. 下載中文協助的檔案壓縮包

  2. 解壓,把doc目錄下的檔案複製到~/.vim/doc下

  3. 確認在.vimrc中設定了set helplang=cn

  4. 輸入命令:help即可進入中文協助

基本概念

下面我們來介紹一下Vim中的幾個基本概念:Buffer、Window和Tab-page。

  1. Buffer:使用Vim開啟的檔案都會被載入到記憶體中,在記憶體中我們使用 Buffer來描述被編輯的檔案,一個Buffer對應一個被編輯的檔案副本。當我們在完成了一個Buffer的編輯後就可以儲存該檔案。Buffer不 僅包含了檔案的內容,也記錄了該檔案的編輯狀態等配置資訊,比如啟用、隱藏、上次編輯行數等,具體可以查閱協助文檔。
    用Vim可以開啟多個檔案同時編輯,也可以把不需要的檔案關掉,但這時檔案副本依然儲存在緩衝區中,我們可以通過 :ls:buffers查看這些Buffer,還可以通過類似:buffer n的方式重新開啟檔案(n表示Buffer的序號)。當然,我們有更好的方式來處理這些Buffer,那就是CommandTBuffer,要想使用CommandTBuffer,先要安裝CommandT外掛程式,請大家記住這個外掛程式的名字,稍後介紹。

  2. Window:是對應Buffer的一個展示視窗。一個Buffer可以對應多個視窗,比如我們可以通過:split filename:vsplit filename命令在多個視窗開啟一個檔案,當修改某一個視窗的檔案是,其他視窗都會同步更新。當然我們也可以在多個視窗開啟多個檔案,編輯後用:wq儲存退出,但是記住,只要沒有最終退出Vim進程,那麼這些開啟的檔案Buffer依然儲存在緩衝區中,可以隨時再次開啟。

  3. Tab-page:Tab-page就比較容易理解,對應一組視窗,我們可以通過`:tabedit filename`在另一個標籤頁中開啟一個檔案,在這個標籤頁中又可以開啟多個視窗。

可以清晰的表達Buffer、Window和Tab-page的關係:

理解了這三個概念和三者之間的關係,對我們用好Vim有非常大的協助。

待續,下一篇是Vim的外掛程式篇......

之所以說Vim形成了自己的生態環境,就是因為Vim具備開放的外掛程式體系,開發人員為了提升開發效率,為Vim編寫了數以萬計的外掛程式,我們可以根據需要任意選擇,也可以基於Vimscript語言開發自己的專屬外掛程式。

每個外掛程式都是以Vim為尾碼的指令檔,編寫外掛程式的語言一般採用 Vimscript。Vimscript是Vim自己的程式設計語言,我們在後續會介紹到它。儘管Vimscript幾乎為可以Vim做任何事,但還是會存在 一些情境,用其他語言更好更快。考慮到這一點,Vim的開發人員為其他指令碼語言設計了介面,用來編寫Vim外掛程式,比如Perl,Python和Ruby,後 續我們會示範如何使用python語言為Go語言編寫Vim外掛程式,在Vim中執行Go程式。

常用外掛程式分為四種:

  1. 通用外掛程式:適用於所有類型的檔案,在使用Vim的時候可以通過外掛程式命令呼出。比如用來快速定位檔案的外掛程式CommandT,使用:CommandT即可啟動該功能,對任何類型都適用。該類外掛程式一般放置在.vim/plugin/目錄下。

  2. 檔案類型外掛程式:適用於特定類型的檔案,比如c、java、xml等檔案。在編輯 特定類型的檔案時,外掛程式功能才會啟用,該類外掛程式一般放置在.vim/ftplugin/目錄下。比如我們常用的編輯xml/html/jsp等檔案的外掛程式 xmledit,安裝了該外掛程式後,編輯xml檔案時,鍵入<modules>,當完成了最後的>時,xmledit會自動為你添加閉合標籤,<modules></modules>,如果輸入了最後一個>,標籤會自動延伸,方便輸入子標籤或常值內容。這時如果你用Vim開啟一個txt檔案,這些功能就消失了。當然,xmledit功能遠不止這麼簡單,我們稍後再詳細介紹。

  3. 文法外掛程式:顧名思義,文法外掛程式主要為程式設計語言提供文法高亮功能,一般放置在.vim/syntax/下。Vim已經預設提供了大部分語言的文法高亮功能,但對於一些比較新的語言,就需要開發人員編寫支援文法高亮的外掛程式,比如Go語言。

  4. 編譯器外掛程式:針對不同語言編寫的編譯器外掛程式,主要用來設定相關語言的編譯器選 項。比如針對C、C++、Java、Python等可以編寫各自的編譯器外掛程式,外掛程式內容並不複雜,主要定義"errorformat"(錯誤格式定義) 及"makeprg"(編譯器和參數)的內容即可。通過:make可以編譯正在編輯的檔案。

瞭解了Vim外掛程式的基本概念,再來講下面的這些常用外掛程式,就比較容易理解了。

pathogen

我們首先來介紹這款用來管理外掛程式的外掛程式——pathogen。

1、

https://github.com/tpope/vim-pathogen

2、功能說明

一個外掛程式包往往具備多種功能,每個檔案根據Vim的路徑約定會放置到不同的目錄 下,通用外掛程式放到plugin下,文法高亮外掛程式放到syntax下,自動載入外掛程式放到autoload下,檔案類型外掛程式放到ftplugin下,編碼格式 外掛程式的放到indent下......如果你是重度外掛程式使用者,你會發現在.vim主目錄下會有一堆檔案夾,無論是你想要安裝新外掛程式,還是想刪除舊外掛程式,都 非常麻煩,你不得不在每個檔案夾下找相關的vim檔案。

pathogen是管理外掛程式的外掛程式,主要用來解決上述問題。pathogen採用 了bundle的概念來管理外掛程式,如果你熟悉OSGi或OS X,那麼對bundle就不會陌生。OSGi以bundle的形式封裝Java程式和資源檔,而OS X中的大部分應用程式都是bundle,正是bundle的概念讓OSGi可以動態管理Java組件,OS X安裝大部分程式都是“綠色安裝”。

pathogen在.vim目錄下建立bundle檔案,所有的外掛程式都會在該目錄下管理。當Vim啟動時,會自動執行runtimepath(rtp)列表中所包含檔案夾下的vim指令碼,pathogen會在啟動時把./vim/bundle下的檔案夾中的外掛程式按照一定順序遞迴載入到rtp中,這樣Vim啟動時,通過pathogen管理的外掛程式就生效了。

有了pathogen之後,一般.vim檔案夾下只有三個檔案夾:autoload、bundle和doc,其他外掛程式將被安裝在bundle檔案夾下,:

如無特殊說明,後面提到的外掛程式都採用pathogen方式安裝,我會以NERDTree外掛程式為例說明安裝方式。

3、安裝
  1. .vim檔案夾下建立autoload和bundle目錄

  2. 從擷取pathogen.vim檔案,將其複製到autoload目錄下

  3. .vimrc檔案中增加如下代碼:

     call pathogen#infect()
4、使用說明

5、注意事項

新外掛程式安裝到bundle目錄下後,如果外掛程式中包含doc,則需要在Vim中運行:Helptags來產生線上協助tags。

NERDTree

我們在介紹pathogen的時候,用一張圖展示了外掛程式的目錄結構,這個目錄結構就是基於NERDTree外掛程式實現的。

1、

https://github.com/scrooloose/nerdtree

2、功能說明

NERDTree是Vim最常用的外掛程式之一,可以在Vim運行時顯示目錄和檔案結構,類似TextMate左側的檔案瀏覽器,但操作起來更為方便,你可以在手不離開鍵盤的情況下快速探索檔案,並在檔案和檔案夾之間進行切換。

3、安裝
  1. 進入.vim/bundle目錄

  2. 執行git clone git://github.com/scrooloose/nerdtree.git

  3. 下載完成後,在bundle下會多出一個nerdtree的檔案夾,所有相關外掛程式都在該檔案夾下

  4. 在Vim中運行:Helptags來產生NERDTree的線上協助tags

4、使用說明

開啟Vim,輸入:NERDTree,即可呼出執行Vim命令的目前的目錄的檔案目錄。為了方便使用,我在.vimrc中定義了快速鍵,可以用Ctrl+t開啟NERDTree,你可以定義自己習慣的快速鍵。

NERDTree提供了豐富的鍵盤操作方式來瀏覽和開啟檔案,我簡單介紹一些常用的快速鍵:

和編輯檔案一樣,通過h j k l移動游標定位o 開啟關閉檔案或者目錄,如果是檔案的話,游標出現在開啟的檔案中go 效果同上,不過游標保持在檔案目錄裡,類似預覽檔案內容的功能i和s可以水平分割或縱向分割視窗開啟檔案,前面加g類似go的功能t 在標籤頁中開啟T 在後台標籤頁中開啟p 到上層目錄P 到根目錄K 到同目錄第一個節點J 到同目錄最後一個節點m 顯示檔案系統菜單(添加、刪除、移動操作)? 協助q 關閉

想瞭解更多操作方式,可以通過? 查看詳細的協助資訊。

Command-T 1、

https://wincent.com/products/command-t

2、功能說明

Command-T是一個基於Ruby和C擴充實現的快速檔案瀏覽的外掛程式,類似 TextMate的Go to File(Command+T呼出)功能,或Eclipse的Open Resource(Command+Shift+r)功能,可以通過模糊比對快速定位並開啟檔案。

3、安裝
  1. 從下載最新版本的vba檔案,目前最新版本是1.4,所以安裝檔案是command-t-1.4.vba

  2. ~/.vim/bundle目錄下建立檔案夾command-t

  3. 用Vim開啟command-t-1.4.vba

  4. 執行:UseVimball ~/.vim/bundle/command-t

  5. 進入ruby目錄下編譯C擴充

      cd ~/.vim/bundle/command-t/ruby/command-t  ruby extconf.rb  make
4、使用說明

輸入:CommandT可進入檔案快速定位功能,:

  1. ctrl+j/k 上下選擇檔案,選中後斷行符號開啟檔案

  2. ctrl+t 以tab方式開啟檔案

  3. ctrl+s/v 可以水平或垂直分割視窗開啟檔案

  4. ctrl+c 退出該模式

該外掛程式還有個常用命令,:CommandTBuffer,可以瀏覽緩衝區的檔案,並重新開啟。操作方式同上。

5、注意事項

Vim版本需要支援ruby擴充。我們可以在Vim中輸入:ruby 1檢查,如果出現E319: Sorry, the command is not available in this version就表示不支援。

如果出現上述情況,我們就需要自己去編譯能夠支援ruby的Vim,嫌麻煩的話可以直接安裝vim-nox,內建Ruby支援,在Ubuntu下安裝命令如下:sudo apt-get install vim-nox

執行ruby extconf.rb命令時如果出現找不到mkmf包的情況,說明你需要安裝ruby-dev的包,在Ubuntu下安裝命令如下:sudo apt-get install ruby1.8-dev

Powerline 1、

https://github.com/Lokaltog/vim-powerline

2、功能說明

Powerline是Vim的一個非常漂亮的狀態列外掛程式,安裝了 Powerline之後,Vim底部將會出現一個增強型狀態列,當Vim處於NORMAL、INSERT、BLOCK等狀態時,狀態列會呈現不同的顏色, 同時狀態列還會顯示當前編輯檔案的格式(uft-8等)、檔案類型(java、xml等)和游標位置等,喜歡的就裝。

3、安裝
  1. 進入.vim/bundle目錄

  2. 執行git clone git://github.com/Lokaltog/vim-powerline.git

  3. .vimrc中設定狀態列主題

     "powerline{ set guifont=PowerlineSymbols\ for\ Powerline set nocompatible set t_Co=256 let g:Powerline_symbols = ‘fancy‘ "}
4、使用說明

安裝之後,再次開啟Vim,你就會發現底部已經多了一個彩色的狀態列了。

未完待續,第四篇擬講ctags、taglist、foldmethod、xmledit、visualmark、vim-markdown等,第五篇擬講python、go相關的外掛程式,第六篇講vim編程技巧,第七篇......


誰說Vim不是IDE?

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.