題圖:from
最近微信后臺總收到 Vim 相關的提問,這讓我懷疑是不是新一代 Vim 程序員又成長起來了。Vim 是一款非常神奇的編程工具,我從2000年開始使用個人電腦c語言編輯工具,歷經16載,差不多是楊過苦等小龍女的歲月,幾乎每天都會打開這款工具。計算機編程歷史持續了數十年,誕生了無數的編程工具,Vim 在其中獨樹一幟,歷久彌新,穿透時光的迷霧,在今天依然閃耀著迷人的光芒,無數技術天才基于 Vim 開發出了偉大的軟件產品。
可以說,Vim 是最簡樸的編輯器,也可以說 Vim 是最繁復的編程工具,還可以說,Vim 是一款史詩般的編程軟件。我們部門編寫 PHP、Go 和 Lua 的程序員依然在用 Vim 編程,對有些人來說,Vim 甚至是他們唯一的編程工具,對于運維人員來說,Vim 也是必不可少的工具之一。
以前我在 中零零散散寫過一些 Vim 的內容,后來放到了《·人生元編程》這本書里,周末拿出來重新整理編排完善,發現居然有近2萬字的內容,于是去掉了插件篇和一些「廢話」,形成了今天的文章。
想看 Vim 插件篇的,去微信讀書搜索 ,就能找到。
歷史
Vim 源于 Vi,但不是 Vi,Vi 作為計算機的文本編輯器歷史極為悠遠,它是由美國計算機科學家比爾·喬伊編寫并于1976年發布的,同年蘋果公司成立。我在「傳統的黑客——史蒂夫·沃茲」中提到過比爾·喬伊,他是 Sun 公司的聯合創始人和首席科學家,一位傳奇的技術天才,我個人以為他最偉大的貢獻是獨立編寫 BSD 操作系統,開發 Vi 編輯器,創立 Sun 公司,當然,他還是 Java 語言的主要貢獻者之一,任何人有幸完成其中一項工作已經足以名垂計算機發展史,而喬伊則通過一己之力完成了這些科技成果,推動了整個計算機科技的發展。
Vim 誕生的要晚一些,它的第一個版本由布萊姆·米勒在1991年發布,這個兄弟也是一位聲名顯赫的程序員,80年代買了一臺 Amiga 電腦,打開電腦一看,米勒鼻子差點氣歪了,居然沒有他最常用的 Vi 編輯器!對于米勒來說這是不可接受的。
憤怒的米勒決定自己開發一個文本編輯器,完全復制 Vi 的功能,并起名為Vi (模擬)。事實證明,天才程序員都具備這種德行,伐開心,就會寫個東西出來,要么完善一下,要么創新一下,要么是你寫,要么是我寫,于是很多偉大的軟件程序就發明出來了。隨著 Vim 的不斷發展,更多更好的功能被加了進來,正式名稱改成了 Vi (增強),也就形成了現代的 Vim,目前最新的穩定版本是7.4,Vim 的開發語言是 C 和 (后續我們還會談到這門語言)。
場景
在不同的場景下采用最合適的工具,永遠是最佳選擇。這時就會有人問,Vim 適合什么場景呢?簡單說來,Vim 比較適合 Unix/Linux 服務器端編程,當然,這因人而異。我自己用 Vim 寫過 Java、Perl、、Lua、Go 等程序,當然編寫 Java 程序使用 IDEA 更多一些。在 Unix/Linux 服務器端編輯和修改文件也離不開Vim,另外,由于我一直用 Mac,所以改個文本讀讀代碼的,也就用 Vim 順手做了。
很多人覺得不用 Vim 一樣一身正氣,是的,編寫 、HTML/CSS/JS、-C,最優方案可能是 IDEA 和 XCode等,這些優秀的工具可以幫助我們提升效率,減少錯誤,但是如果你還想更進一步,Vim 值得擁有。
Vim 本身開箱即用,什么都不配置也可以使用其基本功能。如果大家已經掌握了基本操作,以下內容可以幫助你提升效率,打造你的專屬 Vim。
編輯模式
Vim 是一款完全面向程序員的軟件,活了這么多年我還沒有見到過用 Vim 編輯文字的普通用戶,如果你是,你一定要告訴我。
寫過程序的人都知道,編程的時候雙手大部分時間都放在鍵盤上,或編碼、或插入、或移動、或定位、或查找,這種連續操作的時間和頻率遠遠大于閱讀、翻頁、設置字體、擺弄樣式等文案工作,而二者往往產生很多停頓和間隙,而編程時的停頓是非常影響編程效率的,所以 Vim 的設計理念就是通過模式的轉換、命令的組合和不計其數的插件,保證程序員在編程的過程中,雙手盡可能保留在鍵盤中央的區域,并且,不需要鼠標。
想用好 Vim,先要理解 Vim 的模式轉換。Vim 常用的模式有四種:
普通模式:Vim 啟動后的默認模式,用來移動光標、刪除文本、覆蓋輸入文本、恢復操作、粘貼文本等等。
插入模式:輸入 i 或 a 進入插入模式,在這個模式下敲擊鍵盤會往文字緩沖區增加文字,相當于普通編輯器的編輯模式。
可視模式:選擇文本,可以行選、塊選和依次選擇,選擇后可以進行復制、刪除、排序等操作。
命令模式:執行內部和外部命令,通過「: / ? !」可以進入命令模式,分別對應的是:執行內部命令、向上或向下搜索、執行外部命令。
Vim 的模式和普通的編輯器有所不同,而且命令繁多千變萬化,所以初期的學習曲線較高,一旦你堅持練習并且度過了最早的平臺期,就會領略 Vim 的妙和全鍵盤的好。事實上 Vim 除了能夠快速編輯文本文件之外,還能夠通過簡單的命令做更多的事情,所以,「如果你認為Vim只是一個文本編輯器,你就輸了!」
舉幾個例子,大家領略一下 Vim 的風采:
1、如果你想在 Vim 打開的文本中插入一個1到100的序列,執行如下命令:
:r!seq 100
2、如果你想在當前的每一行文字前面增加“序號. ”,那么執行如下命令:
:let i=1 | g /^/ s//\=i.". "/ | let i+=1
3、如果你想把當前目錄下(包括子文件夾)所有后綴為 java 的文件中的 替換成 ,那么依次執行如下命令: 在當前目錄下執行:
vim
:n **/*.java
:argdo %s/apache/eclipse/ge | update
使用幫助
Vim 本身提供了非常詳細的幫助系統,初學者可以通過幫助手冊學習Vim的基礎內容。在Vim中輸入命令:help,即可進入幫助頁面,默認是英文幫助,如果你喜歡看中文,可以通過以下方式安裝中文幫助內容:
用戶手冊的界面是這樣的:
如何瀏覽幫助呢?請牢記如下秘籍:
當然,大家也可以從網上下載 PDF 版本的戶手冊和幫助文檔。
配置
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多行,這里的示例比較簡單個人電腦c語言編輯工具,適合入門級用戶
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 gt
nnoremap gT
nnoremap t : tabe
"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時通過命令呼出
當然,如果你已經安裝了足夠多插件,那么這個目錄下就會變得五花八門,、、等文件夾都會冒出來了。一個插件所包含的文件往往會分布在多個文件夾下,管理起來比較麻煩,稍后我們會介紹兩個管理插件的插件,讓這個目錄變得干凈整潔,容易管理,這兩個插件的名字叫和!
基本概念
下面我們來介紹一下Vim中的幾個基本概念:(緩沖區)、(窗口)和Tab-page(標簽頁)。
1、:很多讀者問,用 Vim 打開文件后,文件內容存哪了,每次修改都要讀寫硬盤嗎?顯然不會每次編輯都寫硬盤,事實上Vim打開的文件都會被加載到內存中,在內存中我們使用 來描述正在編輯的文件,一個對應一個被編輯的文件副本。當我們在完成了一個的編輯后就可以保存該文件。不僅包含了文件的內容,也記錄了該文件的編輯狀態等配置信息,比如激活、隱藏、上次編輯行數等。
用Vim可以打開多個文件同時編輯,也可以把不需要的文件關掉,但這時文件副本依然保存在緩沖區中,我們可以通過:ls或:查看這些,還可以通過類似: n的方式重新打開文件(n表示的序號)。當然,我們有更好的方式來處理這些,那就是 ,要想使用 ,先要安裝插件,請大家記住這個插件的名字,我們以后會用到。
2、:是對應的一個展示窗口。一個可以對應多個窗口,比如我們可以通過:split 或: 命令在多個窗口打開一個文件,當修改某一個窗口的文件時,其他窗口都會同步更新。當然我們也可以在多個窗口打開多個文件,編輯后用:wq保存退出,但是記住,只要沒有最終退出 Vim 進程,那么這些打開的文件 依然保存在緩存區中,可以隨時再次打開。
3、Tab-page:Tab-page 就比較容易理解,對應一組窗口,我們可以通過: 在另一個標簽頁中打開一個文件,在這個標簽頁中又可以打開多個窗口。
下圖清晰的表達出 、 和 Tab-page 的關系。
理解了這三個概念和三者之間的關系,對我們用好 Vim 有非常大的幫助。
幾個小技巧
1、打開 Vim之后,可以用:split 或: 或new 橫向或縱向切割窗口,使用 ctrl + w 可以在個窗口之間跳轉,使用 ctrl + 方向鍵可以按照方向切換窗口。
2、用 Vim 打開一個文件,如果我們想實現所有文本行翻轉,那么可以執行如下命令:
:g/^/m 0
3、在 Vim 中統計文本行數和當前光標的位置,可以使用 ctrl + g,統計字節數,可以使用 g + ctrl + g
4、對文本進行簡單排序:
用 shift v 選中多行文本,輸入: !sort,看看效果如何。
5、如果你想把當前目錄下(包括子文件夾)所有后綴為 java 的文件中的 替換成 ,那么依次執行如下命令: 在當前目錄下執行:
vim
:n */.java
:argdo %s///ge |
第四個技巧之前提到過,解釋一下,這就用到了 的概念,通過正則表達式在內存中打開多個文件,argdo 表示在內存中執行 Vim 的命令,%s///ge表示在內存中執行字符串替換,g 表示全局替換,e 表示如果文件中沒有可替換字符串不報錯繼續執行,| 是管道標識符, 表示替換完之后更新并寫入文件。
Vim 是一款越用越愛的編輯器,看了這篇文章,希望你也能愛上 Vim,它的名字叫做「唯快不破」。
整理完這篇文章,已經周六下午4點多了,不過距天黑尚有不少時間,所以我去睡了個午覺。
那么,你用過哪些好用的編程工具呢?可以在評論里說說。
8月份更換了底部 贊助商:掘金。注意,這不是個炒股軟件。
掘金是一個高質量的技術社區,從 Swift 到 React ,從性能優化到開源類庫,讓你不錯過互聯網開發的每一個技術干貨。長按圖片二維碼識別或者各大應用市場搜索「掘金」,技術干貨盡在掌握中。