1. 程式人生 > >Linux桌面玩家裝B指南:02.以最簡潔的方式打造實用的Vim環境

Linux桌面玩家裝B指南:02.以最簡潔的方式打造實用的Vim環境

特別說明

要在我的隨筆後寫評論的小夥伴們請注意了:我的部落格是使用 Markdown 編寫的,並且啟用了 MathJax 數學公式支援。如果某條評論中出現了兩個$,則 MathJax 會認為這兩個$之間的內容是數學公式,從而出現格式混亂。如果大家確定自己寫的評論不是數學公式,請使用\$轉義一下,謝謝。

想從頭閱讀該系列嗎?下面是傳送門:

前言

本來我是想寫完 Linux 桌面系統的美化和字型配置之後再寫 Vim 的。但是等我寫完玩轉Linux系統的方法論一看,發現一個好用的文字編輯器在 Linux 系統中實在是太重要了,在玩轉Linux系統的方法論中,我的很多例子都是靠 Vim 展示出來的。沒有文字編輯器,怎麼去讀程式碼、改配置、寫指令碼呢?如果不能讀程式碼、改配置、寫指令碼,該系列後面的內容怎麼進行得下去呢?所以,我這一篇寫一寫 Vim 的配置。

先介紹一下 Vim。Vim 是 Linux 系統上的最著名的文字/程式碼編輯器,也是早年的 Vi 編輯器的加強版,被譽為文字/程式碼編輯器之中最為優秀經典的上古神器。 它之所以會獲得如此美譽,我想主要有以下原因:1.它古老而神祕,學習曲線陡峭,難以駕馭,但是一旦學會則受益匪淺。如今被看作是高手、Geek 們專用的編輯器。所以儘管 Vim 已經是古董級的軟體,但還是有無數新人迎著困難去學習使用。 2.輕便,無需多言,當僅僅只需要對某一文字檔案(指令碼程式碼、配置檔案)進行簡單的編輯的時候,所使用的工具當然是越輕便越好。Vim 同時也是閱讀文字檔案的利器。 3.經典巧妙的編輯方式及強大的功能。它全程使用鍵盤操作,使用者必須記住一堆快捷鍵、按鍵組合以及各種命令才能開始使用,一旦使用熟練則編輯效率遠超其餘編輯器,而且具有各種外掛、語法高亮、程式碼補全、配色方案等極其豐富的資源以及靈活的配置。

我主要在以下情況下使用 Vim: 1.用來修改伺服器系統的配置檔案。很多時候, Linux 作為伺服器是不會開啟圖形介面的,當需要遠端操作時,只能利用 SSH “命令字元式”的 Shell 介面對其進行操作,這種情況下,Vim 自然是首選。 2.用來閱讀核心原始碼和系統的指令碼。理由同上。 3.用來寫簡單的程式,一般都是單檔案的程式,或多檔案但是隻有少數幾個檔案的專案,例如學習一門程式語言的時候做練習題,喜歡看到資料夾內乾乾淨淨,不喜歡一大堆類似 .project 的檔案。 4.裝B,花花綠綠的純文字字元介面,很酷。

不適合 Vim 使用的場景: 1.大的程式設計專案,大的專案還是最好使用 IDE,如果要遠端連線沒有圖形介面的伺服器寫大專案,最好還是在伺服器上建立程式碼倉庫。理由:Vim 沒有好的專案管理功能,Vim 的自動補全只建立在文字匹配上,沒有程式語言的語義分析功能。 2.對內容的輸入要求不高,但是經常需要設定顯示格式,且每個動作之間本身就有很多的停頓的工作,用其他 GUI 編輯器( LibreOffice Writer、WPS)效率反而比 Vim 高。

有人說,Vim 是“成也外掛、敗也外掛”。Vim 靈活的配置和豐富的外掛極大地增強了它的功能,但是也極大地增加了我們管理 Vim 的難度。首先,在使用 Vim 之前,必須經過適當的配置,而 Vim 的配置又極其繁瑣。 Vim 的外掛豐富,在網上不乏使用各種外掛將Vim 配置成強大 IDE 的文章,但是 Vim 的外掛管理非常困難,因為每安裝一個外掛,都需要將該外掛的檔案分別放到 Vim 安裝路徑下的 plugin、autoload、syntax、doc 等目錄下。好在是目前有不少能管理外掛的外掛,它們不僅解決了 Vim 外掛在檔案系統中分散的問題,同時能夠自動搜尋和下載外掛。

Vim的現狀

從前面的介紹可知,Vim 神祕高效水又深,所以吸引了一大批信徒。在網路上關於 Vim 的自定義配置汗牛充棟。既有高手 Tim Pope 的極簡配置 tpope/vim-sensible(這個配置一個外掛都沒有),也有 spf13/spf13-vim 和 SpaceVim 這樣大而全的配置。而對我來說,我喜歡簡潔而優雅,一大堆 Plugin 堆砌起來的東西我固然不喜歡,但是一個外掛都沒有的極簡配置那用起來也不太順手。所以我必須得自己配。

自己配 Vim,必然涉及到 Plugin 的選型的問題。說到選型,那就有很多話要說了。首先是 Vim 自身版本的進步和功能的進步,目前 Vim 已經進入到 Vim 8 的時代,增加了不少新功能,像非同步啊、內建 Terminal 啊之類的。而且還有 NeoVim 和它搶飯碗。其次就是 Vim 外掛的作者的理念發生了變化,他們逐漸瞧不上純粹 VimScript 寫的外掛,畢竟純 VimScript 寫的外掛功能比較有限,速度也不夠快。目前的 Vim 外掛有幾個發展趨勢:一是要充分利用非同步的支援,二是往往使用某些後端提供更強大的功能支援,三是喜歡搞大而全的框架。下面我來逐一舉例說明。

例如管理外掛的外掛,我以前一直都是用 Vundle,我覺得挺好用的。但是這幾年又雨後春筍般的冒出了幾種新的管理外掛的外掛,像 junegunn/vim-plug 和 Shougo/dein.vim,看一下它們的說明,無一例外都是說使用了併發技術,加快了外掛的下載速度。

再例如 Vim 中的自動補全。其實 Vim 自身就支援補全功能,不過使用起來一點都不自動,需要使用 Ctrl+P 或者 Ctrl+X Ctrl+O 這樣的快捷鍵才會調出補全功能。Vim 自身的補全功能支援 buffers 中的單詞,也支援 dictionary 和 tags 中的條目。但是不管怎麼說,都只是基於字面意義上的補全,不支援深層次的對程式語言的語義分析。但是可以用後端解決這個問題啊。像 Valloric/YouCompleteMe,在網路上的名聲就是典型的難安裝難配置,因為它需要使用 Clang 作為後端提供對 C/C++ 語義的支援,使用 Jedi 提供對 Python 的支援,使用 OmniSharp 提供對 C# 的支援,等等……。正是如此,使得我們若是想使用某些外掛,還不得不在系統上安裝 Clang、Python、Lua 這樣的一些程式,比較複雜。

自動補全中還有大名鼎鼎的 Shougo/neocomplete.vim。但是我到 github 上一看,好傢伙,居然說在 Vim 8 上建議就不要用了,要用就用 Shougo/deoplete.nvim。這也算是 Vim 版本的升級推動外掛的升級吧,雖然怎麼看怎麼像這些外掛傾向於 NeoVim 更多一點。而 deoplete 也只是一個自動補全的框架,它還是需要很多後端對程式語言的語義分析提供支援。看下面這個截圖,這些都是 deoplete 所需要的後端:

再來一個例子,關於 Vim 的目錄樹外掛,老牌的 NERDTree 不用說了吧,我用著挺舒服的。但現在流行的趨勢是 vimfiler。然後我到 github 上一看,馬上發現兩個難題。一是 vimfiler 需要 unite.vim 支援,二是這個外掛也不更新了,在 Vim 8 或者 NeoVim 的時代,請使用 Shougo/defx.nvim ,而且在 Defx 的文件中,赤裸裸地寫明瞭,需要 Python 3.6.1+ 的支援。哦對了,必須提一下,Defx 我試用了,根本沒配成功。

通過前面的介紹,發現這個 Shougo 還真是有點高產。前面提到的 unite.vim 也是他寫的,而且又升級了。在 Vim 8 或 NeoVim 中建議使用 Shougo/denite.nvim。這裡的 unite 和 denite 就是我前面說的大而全的框架,框架之下,需要別的更多的外掛作為 source 來提供更多的功能,而這個框架,負責把控 Vim 的介面。

還有一個網紅外掛 Yggdroot/LeaderF,主要是為了取代經典的 ctrlp,而且其功能比 ctrlp 強大不少。這個倒是沒有要求 Vim 8,不過還是要求 Python。值得一用。

鑑於以上提到的錯綜複雜的關係,以及我自身的強迫症,我決定還是迴歸經典。Vim 7 就能用多好,純 VimScript 多好,不想整那後端這後端的。所以我還是使用 Vundle 管理外掛,並選擇了 7 個最常用的外掛,其中一個還是 colorscheme。唯一的升級,可能算是把 Taglist 升級為 Tagbar 了吧。另外,我還是選擇了 CtrlP,沒有選擇 LeaderF。我覺得功能夠用了。至於 tpope/vim-surround 、nerdcommenter 之類的,那就不要了吧,不要它們也多敲不了幾下鍵盤,還可以省下學習成本。如果為了美觀,這個 vim-airline/vim-airline 外掛倒是不錯,這個 Lokaltog/vim-powerline 也不錯,但是以上兩個外掛需要特殊字型的支援,到這裡 powerline/fonts 可以下載字型,我一般選擇 DejaVu Sans Mono for Powerline。如果需要語法檢查,vim-syntastic/syntastic 可以試一下。

必須得說明一下:怎麼為 Vim 配外掛還得看自己的需求。我主要是看文件和看程式碼,偶爾改改配置檔案,有時還要在非 GUI 環境下改配置檔案。就算寫程式碼也只用 Vim 寫非常簡單的。所以我這個經典配置完全夠用了,而且開箱即用,超級方便。至於需求比較複雜的,建議玩玩我前面提到的 SpaceVim 。

安裝和配置Vim

我的配置非常簡單,加上空行,也不超過 75 行,我只選擇了 7 個外掛,所有的外掛都是純 VimScript 的,所有外掛都是開箱即用,不需要額外配置。依賴方面,除了 ctags,不需要任何後端的支援。ctags 軟體用來分析程式原始碼,生成 tags 檔案,可不僅僅只支援 C/C++喲,它還支援一大票程式語言。使用man ctags可以檢視 ctags 的用法,使用ctags --list-languages可以檢視 ctags 支援哪些程式語言。Vim 自身就有很多地方需要用到 tags 檔案。首先是 Vim 的跳轉功能,快捷鍵是 Ctrl+],需要 tags 檔案支援。其次,Vim 的自動補全功能,不僅支援 buffers 中的單詞,也支援 dictionary 和 tags 中的條目。而在我選擇的幾個外掛中,Tagbar 外掛可以呼叫 ctags 對當前編輯的檔案進行分析,生成符號表。

目錄樹外掛,我還是選擇老牌的 NERDTree。檔案搜尋外掛,我還是選擇 CtrlP。自動補全外掛,我選擇的是 OmniCppComplete 和 AutoComplPop,免除了我按 Ctrl+P、Ctrl+X Ctrl+O 這樣的操作,當我輸入單詞時,補全就自動跳出來了。使用 syntastic 進行語法檢查。沒有使用 airline,也沒有使用 powerline,一是它們需要專用字型的支援,二是我個人對酷炫屌炸天的介面並不是很感興趣,而且這些酷炫的效果一到 Linux 的純字元介面就抓瞎,三是如果使用這些外掛,配置檔案中就必須增加針對這些外掛的配置,影響配置檔案的簡潔。我還是使用 Vundle 管理以上這些外掛。只需三步,即可完成 Vim 的安裝和配置。

第一步、安裝Vim、GVim、exuberant-ctags、curl和git

sudo aptitude install vim vim-gtk3 exuberant-ctags curl git

第二步、把以下程式碼拷貝到配置檔案~/.vimrc中

程式碼非常簡潔,如下:

set nocompatible

filetype off
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
Plugin 'VundleVim/Vundle.vim'
Plugin 'majutsushi/tagbar'
Plugin 'kien/ctrlp.vim'
Plugin 'scrooloose/nerdtree'
Plugin 'vim-scripts/AutoComplPop'
Plugin 'vim-scripts/OmniCppComplete'
Plugin 'vim-syntastic/syntastic'
Plugin 'altercation/vim-colors-solarized'
call vundle#end()
filetype plugin indent on

set history=1000
set ruler
set number
set showcmd
set showmode
set laststatus=2
set cmdheight=2
set scrolloff=3

set fillchars=stl:\ ,stlnc:\ ,vert:\ 

set noerrorbells
set novisualbell
set t_vb=

set background=dark
syntax on
colorscheme desert
set cursorline
hi CursorLine term=NONE cterm=NONE ctermbg=0 guibg=Gray40

set backspace=2
set whichwrap+=<,>,h,l

set expandtab
set smarttab
set shiftwidth=4
set tabstop=4
set autoindent
set cindent

set nobackup
set noswapfile
set autoread
set autowrite
set autochdir
set fileencodings=utf-8,cp936
set fileformats=unix,dos,mac

set showmatch
set matchtime=2
set hlsearch
set incsearch
set ignorecase
set smartcase
set magic
set lazyredraw
set nowrapscan
set iskeyword+=_,$,@,%,#,-,.

if has("gui_running")
    colorscheme solarized
    set guifont=DejaVu\ Sans\ Mono\ 12
    set guioptions=aegicmT
endif

map <F2> :NERDTreeToggle<CR>
map <F3> :TagbarToggle<CR>
map <F4> :CtrlPMixed<CR>

Vim 是可以訪問全域性剪下板的,所以只需要複製上面的程式碼,然後使用vim ~/.vimrc命令編輯~/.vimrc檔案,在 Vim 的 Normal 模式下鍵入"*p就可以把以上內容貼上到 Vim 中。然後鍵入:wq儲存退出即可。如下圖:

第三步、下載Vundle,再用Vundle安裝其它的外掛

先建立Vundle需要用到的目錄,然後使用 git 從 github 上下載 Vundle,命令如下:

mkdir ~/.vim
mkdir ~/.vim/bundle
cd ~/.vim/bundle
git clone https://github.com/VundleVim/Vundle.vim.git

然後,再開啟 Vim,在 Normal 模式下鍵入:PluginInstall,靜靜地等待它安裝完成就可以了。如下圖:

在使用過程中,按 F2 鍵調出 NERDTree,按 F3 鍵調出 Tagbar,按 F4 鍵調出 CtrlP。如果只寫個簡單的程式,單視窗就夠了。寫個簡單的 C 程式碼看看效果,return 0後面故意不寫分號看一下 syntastic 的語法糾錯功能,printf故意寫個開頭看看自動補全功能(這裡需要按 Ctrl+P 調出補全),如下圖:

使用Vim閱讀Linux核心原始碼

實戰一下,看看用 Vim 閱讀 Linux 核心原始碼是什麼效果。首先,我們需要安裝 linux-source 軟體包,然後解壓縮,再然後生成 tags 檔案。命令如下:

sudo apt install linux-source
cd /usr/src/
sudo tar jxvf linux-source-4.15.0.tar.bz2
cd linux-source-4.15.0
sudo ctags -R --c++-kinds=+p --fields=+ias --extra=+q

最後,在/usr/src/linux-source-4.15.0/目錄中執行vim命令就可以了。按 F4 調出 CtrlP,輸入我們想看的原始碼檔名進行查詢,例如紅黑樹的實現 rbtree.c,你只要輸入rbtree,CtrlP就會自動找到lib/rbtree.c。如果想要在程式碼間跳轉,或者自動補全,就需要在 Vim 中加入 tags 檔案,使用:set tags+=/usr/src/linux-source-4.15.0/tags命令即可。我在使用 Vim 寫 C/C++ 程式時,常常喜歡在/usr/include目錄下生成 tags 檔案,然後把它新增到 Vim 中,這樣,C/C++ 標準庫和 Linux 系統庫的自動補全就全有了。在控制檯下執行的效果,如下圖:

我特意退出全屏模式進行展示,因為上一篇一開頭就向大家展示過全屏半透明控制檯的威力了。在 GVim 中執行的效果,如下圖:

Vim學習之路

Vim 雖好,但是學習曲線還是有點陡的。有沒有人記得第一次使用 Vim 時什麼都做不了的那種無力感呢?在 Stack Overflow 上有一個問題——怎麼退出 Vim——在五年的時間裡獲得了一百多萬的瀏覽量。有的人第一次使用 Vim 時,怎麼都輸入不了文字;有的人第一次使用 Vim 時,怎麼都退出不了 Vim。這些人往往都是誤入 Vim 的,而我不一樣,我學 Linux 的時候是按教科書來的,Vim 也是教科書推薦給我的,所以基本操作還是知道一點點的,不至於完全用不了。其實讓 Vim 開始工作,只需要瞭解最簡單的一點點知識就可以了。

首先,要知道 Vim 分為兩種不同的模式:Normal 模式和 Insert 模式。剛啟動時,Vim 處於 Normal 模式,是不能向文件中輸入文字的,必須按i鍵,進入插入模式,才能向文件中插入文字。這時,Vim 就和普通的文字編輯器沒啥區別了,要移動游標,用方向鍵,要刪除文字,用 Backspace 鍵。等編輯完文件,怎麼儲存和退出呢?這時,必須退出 Insert 模式,回到 Normal 模式,按 ESC 鍵可以回到 Normal 模式。然後再輸入:wq儲存退出,只輸入:w是儲存,只輸入:q是退出,但是修改過的文件不儲存是退出不了的,如果想放棄修改直接退出,輸入:q!命令即可。這幾個命令比較好記,i就是 Insert 的首字母,:w就是 Write 的首字母,:q就是 Quit 的首字母,而:q!後面的感嘆號,可以理解為強制的意思,強制退出。所以,Vim 的最小工作子集非常簡單,找到正確的資料的話一分鐘就學會了。如下表:

命令 功能
i 進入 Insert 模式
<Esc> 退出 Insert 模式,回到 Normal 模式
<Left>、<Right>、<Up>、<Down> 移動游標
<Backspace> 刪除游標前的文字
:w 儲存文件
:q 退出 Vim
:q! 不儲存文件,強制退出 Vim

如果這時還沒有被 Vim 嚇退,就可以更進一步地學習,可以從 Vim 的官方幫助文件入手。在 Vim 中輸入:help就可以檢視 Vim 的文件。Vim 啟動時有一個空白視窗,輸入:help後,Vim 被分割為兩個視窗,上面一半顯示幫助文件,這看著肯定不舒服啊,怎麼辦呢?只需要輸入:only,就可以只保留文件視窗了。Vim 的文件非常詳細,在該幫助文件的一開始,就告訴大家可以使用 Ctrl+] 進行跳轉,使用 Ctrl+T 或者 Ctrl + O 跳回。所以,就算是新手,使用該幫助文件也是沒有什麼困難的。我建議順著 usr_toc.txt 一章一章的往下讀。

一般使用者對 Vim 的興趣就是在這個階段培養起來的。因為讀著讀著就會發現,哎喲,我可以不用滑鼠耶,手指不離開鍵盤,速度快了不少耶;哎喲,我可以不用方向鍵耶,手指不用離開主鍵盤區,速度又快了不少耶;哎喲,游標的定位好像更方便耶,編輯文件好像更快耶,查詢替換更流暢耶,等等……信徒就是這樣產生的。同時也發現,Vim 這種充分利用鍵盤上的字母當命令的方式好像確實很神奇耶,而且命令很多,幾乎鍵盤上的每個按鍵都有它的意義。有哪些命令呢?我放個圖片毒大家一下:

有人可能會說,我英文不好呀,這全英文的文件我讀不懂怎麼辦啊?不用著急,Vim 流行了這麼多年,中文文件肯定是有的啦。Github 上有一個 Vim 中文文件計劃 vimcdoc,大家可以直接去這裡下載最新的中文文件。而且有 pdf 格式的,放到手機上慢慢看吧。

讀了文件後會發現,Vim 不止我前面說的兩種模式,除了 Normal 模式和 Insert 模式之外,還有可視模式、替換模式和命令模式。在 Normal 模式下按v或者V可以進入可視模式,可以用視覺化的方式選擇一塊文字。在 Normal 模式下按R就會進入替換模式,輸入文字時會覆蓋存在的字元。在 Normal 模式下按:就會進入命令模式,除了:,在 Normal 模式下按!/ 和 ? 也可以進入命令模式,它們分別執行的是過濾、搜尋和反向搜尋。

好吧,關於 Vim 的學習我就寫這麼多,資料我是給足了的,至於能夠達到什麼高度就要看自己的修行了。反正我到現在也只是一個入門水平,不過夠用了。下面是我以表格的形式整理的我的學習筆記,都是常用命令。

usr_01.txt 關於 Vim 幫助手冊的簡單介紹

命令 功能
CTRL-] 跳轉到當前游標下的標籤
CTRL-O 回跳(重複這個操作可以回跳多次)
:set compatible? 檢視 Vim 是否關閉了對 Vi 的相容
:scriptnames 檢視配置檔案的位置和檔名

usr_02.txt Vim 初步,講一些簡單的命令

命令 功能
i 從普通模式進入插入模式,在當前游標前插入文字
:set showmode 開啟模式提示,便於使用者知道自己在什麼模式
<Esc> 回到普通模式,敲一次不行就敲兩次
h 向左移動游標
j 向下移動游標
k 向上移動游標
l 向右移動游標
x 刪除游標處的字元
dd 刪除一行
J 刪除一個換行符,把兩行連起來
u 撤銷之前的操作
CTRL-R 重做,就是撤銷之前的撤銷操作
a 在游標之後新增字元
o 在當前行的下方建立一個新的空行,並進入插入模式
O 在當前行的上方建立一個新的空行,並進入插入模式
1-9 在命令前加一個數字,表示重複這個命令相應的次數
ZZ 儲存檔案並退出
:q! 放棄修改並退出

usr_03.txt 主要是講怎麼在檔案中快速移動的

命令 功能
w 移動到下一個單詞的詞首
b 移動到上一個詞的詞首
e 移動到下一個詞的詞尾
ge 移動到上一個詞的詞尾
:set iskeyword 定義哪些字元允許出現在單詞中,而不是單詞分隔符
W 移動到以空白符分割的下一個詞的詞首
B 移動到以空白符分割的上一個詞的詞首
E 移動到以空白符分割的下一個詞的詞尾
gE 移動到以空白符分割的上一個詞的詞尾
$ 移動到當前行的行尾
^ 移動到當前行的第一個非空白字元
0 移動到當前行的行首
f 向前查詢並移動到一個指定的字元
F 向後查詢並移動到一個指定的字元
t 向前查詢一個字元並移動到這個字元的前一個字元上
T 向後查詢一個字元並移動到這個字元的後一個字元上
; 重複上面的四個命令
, 反向重複上面的四個命令
% 移動到匹配的 ()、[]、{}上
G 移動到檔案最後一行
gg 移動到檔案的第一行
數字+% 移動到檔案的百分之多少
數字+G 移動到指定的行
H 移動到當前視窗的第一行
M 移動到當前視窗的中間一行
L 移動到當前視窗的最後一行
CTRL-G 確定當前位置
:set number 顯示行號
:set ruler 在右下角顯示當前游標的位置
CTRL-U 向下滾動半屏
CTRL-D 向上滾動半屏
CTRL-E 向上滾動一行
CTRL-Y 向下滾動一行
CTRL-F 向前滾動一整屏
CTRL-B 向後滾動一整屏
zt 把游標所在的行移動到螢幕頂部
zz 把游標所在的行移動到螢幕中間
zb 把游標所在的行移動到螢幕底部
/ 查詢匹配的字串
? 反向查詢匹配的字串
n 重複上面的查詢
N 反向重複上面的查詢
:set ignorecase 查詢時忽略大小寫
* 查詢當前游標所在的單詞
# 反向查詢當前游標所在的單詞
:set hlsearch 查詢時高亮顯示所有匹配的地方
:set incsearch 在輸入字串的過程中就顯示匹配點
:set nowrapscan 正向查詢時,到檔案結尾就停止查詢,反向查詢是,到檔案開頭就停止查詢
:nohlsearch 關閉高亮顯示
' ' 跳回原來的地方,反覆使用可以在兩個位置上跳來跳去
CTRL-O 跳到一個較老的地方
CTRL-I 跳到一個較新的地方
:jumps 列出所有可跳往的位置
m 放置位置標記,位置標記可以是 a 到 z 共 26 個
' 跳轉到位置標記
:marks 列出所有的位置標記
' " 跳到最後編輯的游標位置
' [ 跳到最後修改的開始位置
' ] 跳到最後修改的結束位置

這一章的命令主要講的是怎麼移動游標,也就是 {motion} ,有兩點說明:一是移動游標的命令前面可以加數字,表示重複移動的次數;二是查詢單詞時,使用\<匹配單詞開頭,使用\>匹配單詞結尾,使用^匹配一行的開頭,使用$匹配一行的結尾,使用.匹配任意字元,而對於單詞中的特殊字元需要轉義。

usr_04.txt 這一章主要講操作和移動的結合使用。前面學過的d就是操作,這裡記作 {operator},表示刪除,w就是移動,這裡記作 {motion},表示移動一個單詞。所以dw就是刪除一個單詞。操作命令和移動命令前面都能加數字,表示重複的次數,這裡記作 [n]。所以操作和移動相結合遵循如下模式:[n] {operator} [n] {motion}

命令 功能
d4w 刪除 4 個單詞
d$ 刪除到行尾
c 修改文字
x 表示 dl,刪除當前游標下的字元
X 表示 dh,刪除游標左邊的字元
D 表示 d$ ,刪除到行尾
C 表示 c$ ,修改到行尾
s 表示 cl,修改一個字元
S 表示 cc,修改一整行
r 替換一個字元
. 重複最後一次的修改操作
v 啟動可視模式
V 啟動按行選擇的可視模式
CTRL-V 啟動按塊選擇的可視模式
可視模式下的 o 和 O 把游標移動到被選擇文字的另一端
p 貼上到游標的後面
P 貼上到游標的前面
y 拷貝
yy 拷貝一整行
Y 表示 y$ ,拷貝到行尾
"* 使用全域性剪下板
R 進入替換模式
~ 修改游標下字元的大小寫,並移動到下一個字元,後面不能跟移動指令
I 移動到當前行的第一個非空字元並啟動插入模式
A 移動到行尾並啟動插入模式

操作後面還可以接文字物件。文字物件有哪些呢?見下表:

文字物件 意義
a" 雙引號字串
a’ 單引號字串
a( 等同於 ab
a) 等同於 ab
a< "一個 <> 塊" 從 ’<’ 到匹配的 ’>’
a> 等同於 a<
aB "一個大塊" 從 "[{" 到 "]}" (帶上括號)
aW "一個字串" (帶上空白)
a[ "一個 [] 塊" 從 ’[’ 到匹配的 ’]’
a] 等同於 a[
a` 反引號字串
ab "一個塊" 從 "[(" 到 "])" (帶上括號)
ap "一個段落" (帶上空白)
as "一個句子" (帶上空白)
at "一個標籤塊" (帶上空白)
aw "一個單詞" (帶上空白)
a{ 等同於 aB
a} 等同於 aB
i" 雙引號字串,不帶引號
i’ 單引號字串,不帶引號
i( 等同於 ib
i) 等同於 ib
i< "內含 <> 塊" 從 ’<’ 到匹配的 ’>’
i> 等同於 i<
iB "內含大塊" 從 "[{" 到 "]}"
iW "內含字串"
i[ "內含 [] 塊" 從 ’[’ 到匹配的 ’]’
i] 等同於 i[
i` 反引號字串,不帶反引號
ib "內含塊" 從 "[(" 到 "])"
ip "內含段落"
is "內含句子"
it "內含標籤塊"
iw "內含單詞"
i{ 等同於 iB
i} 等同於 iB

usr_05.txt 這一章主要是講配置檔案的。這一章大家看一看就可以了,不用記。我覺得有必要設定的選項我已經放到配置檔案中了。關於安裝外掛的內容,瞭解即可。

usr_06.txt 關於設定語法高亮的。瞭解即可。

usr_07.txt 這一章是講編輯多個檔案的。

命令 功能
:edit 開啟一個檔案
:edit! 放棄對當前檔案的修改,開啟另一個檔案
:hide edit 不放棄對當前檔案的修改,隱藏當前檔案,開啟另一個檔案
:next 可以在啟動 Vim 的時候開啟一堆檔案,使用該命令在檔案之間切換
:write 儲存當前檔案
:wnext 先儲存,再切換到下一個檔案
:next! 放棄對當前檔案的修改,切換到下一個檔案
:args 檢視整個檔案列表,後面跟檔名可以編輯另外一個檔案列表
:previous 切換到上一個檔案
:first 切換到第一個檔案
:last 切換到最後一個檔案
:set autowrite 設定自動儲存
CTRL-^ 在兩個檔案間快速跳轉
' " 跳轉到上次離開這個檔案時的位置
' . 跳轉到最後一次修改檔案的位置
m 後面跟大寫字母可以設定在所有檔案中共享的位置標記
:marks 檢視位置標記
" 使用暫存器進行復制貼上,後面可跟小寫字母 a 到 z
:saveas 另存為
:file 把當前檔案用另外的名字建一個新檔案進行編輯,不立即儲存

usr_08.txt 這一章講視窗和標籤頁的,其中關於調整視窗寬度的快捷鍵是我在 index.txt 中找出來的。

命令 功能
:split 垂直分割視窗
CTRL-W w 在視窗之間跳轉
:close 關閉視窗
:only 關閉其它視窗
CTRL-W + 增加視窗高度
CTRL-W - 減少視窗高度
{height}CTRL-W _ 指定視窗高度
:vsplit 水平分割視窗
CTRL-W h/j/k/l 跳轉到上下左右的視窗
CTRL-W t/b 跳轉到最頂上或最底部的視窗
CTRL-W H/J/K/L 把當前視窗移動到最左邊最下邊最上邊最右邊
CTRL-W > 增加當前視窗的寬度
CTRL-W < 減少當前視窗的寬度
:tabedit 新建標籤頁
:tab split 新建標籤頁

usr_09.txt 使用 GUI 版本。瞭解即可。關於 GUI 的設定就不囉嗦了,我主要是取消了滾動條。另外,這一章講到了當前選區和真剪下板的概念,主要是熟悉兩個暫存器"*"+

usr_10.txt 其它一些修改檔案的手段,包括錄製命令和回放命令

命令 功能
q{register} 記錄命令,{register}可以使用小寫字母 a 到 z
@{register} 回放記錄的命令
@@ 回放剛執行的命令
:[range]substitute/from/to/[flags] 替換字串,涉及的資訊量比較多,請自行閱讀文件
:[range]global/{pattern}/{command} 找到一個匹配點,並在那裡執行一個命令
> 把選中的文字右移一個“平移單位 ”
< 把選中的文字左移一個“平移單位”
:read 讀取檔案到當前檔案
gq 自動排版命令
gu/gU 改變大小寫
! 過濾操作
:! 執行外部命令
:read !{command} 讀取外部命令的輸出到當前文件

usr_11.txt 從崩潰中恢復,瞭解即可。

usr_12.txt 關於使用 Vim 的一些小竅門,瞭解即可。

usr_20.txt 關於命令列編輯、命令列縮寫、命令列補全、命令列歷史的,瞭解即可。需要記住一個開啟命令列視窗的命令。

命令 功能
q: 開啟命令列視窗

usr_21.txt 離開和返回

命令 功能
CTRL-Z 掛起 Vim,回到 Shell
fg 從 Shell 回到 Vim

其它關於會話和檢視的內容,瞭解即可。關於 modeline 的內容瞭解一下。

usr_22.txt 講 netrw 檔案瀏覽器的,瞭解一下即可。還有多緩衝區編輯的命令。

命令 功能
:buffers 檢視緩衝區列表
:ls 同上
:buffer {number} 編輯緩衝區,也可以使用檔名
:bnext 編輯下一個緩衝區
:bprevious 編輯上一個緩衝區
:bfirst 編輯第一個緩衝區
:blast 編輯最後一個緩衝區
:bdelete 刪除緩衝區

usr_23.txt 編輯特殊檔案,Vim 功能挺強大的,可以編輯網路檔案、加密檔案、二進位制檔案、壓縮檔案等,瞭解一下即可。

usr_24.txt 快速插入,以下快捷鍵都是在插入模式下執行的。

命令 功能
CTRL-W 快速刪除一個單詞
CTRL-U 快速刪除到行首
CTRL-P 自動補全,搜尋匹配的單詞
CTRL-N 自動補全,反向搜尋匹配的單詞
CTRL-X CTRL-F 自動補全檔名
CTRL-X CTRL-L 自動補全整行
CTRL-X CTRL-D 自動補全巨集定義
CTRL-X CTRL-I 自動補全當前檔案及所包含的檔案
CTRL-X CTRL-K 自動補全字典檔案內的單詞
CTRL-X CTRL-T 自動補全同義詞詞典檔案內的單詞
CTRL-X CTRL-] 自動補全標籤
CTRL-X CTRL-V 自動補全 Vim 命令列
CTRL-X CTRL-O 自動補全程式程式碼
CTRL-A 把上次在插入模式下輸入的文字再輸入一次
[email protected] 同上,但插入後退出插入模式
CTRL-Y 從游標上面一行拷貝
CTRL-E 從游標下面一行拷貝
CTRL-R 插入暫存器裡面的內容
CTRL-O 在插入模式下執行普通模式的命令

關於縮寫功能,因為用得少,我這裡就沒有總結出來。而且從這裡可以看到,Vim 自帶的補全功能還是很強大的,但是我們用自動補全的外掛代替了,所以這些快捷鍵用得少。

usr_25.txt 編輯帶格式的文字,瞭解一下即可。記住其中增加縮排和減少縮排的命令,這個用得比較多。

命令 功能
>> 增加當前行的縮排,前面帶數字可以縮排多行
<< 減少當前行的縮排,前面帶數字可以縮排多行

usr_26.txt 重複,瞭解一下即可。

usr_27.txt 查詢命令即模式,瞭解一下即可。

usr_28.txt 摺疊

命令 功能
zf 產生一個摺疊
zo 展開摺疊的內容
zc 摺疊展開的內容
zr 減少摺疊
zm 增加摺疊
zR 展開所有巢狀的摺疊
zM 關閉所有的摺疊

摺疊有很多方法,可以按縮排進行摺疊,也可以按標誌進行摺疊,也可以按語法進行摺疊。瞭解一下即可。

usr_29.txt 在程式碼間移動。主要是使用 tags,我前面已經講過 ctags 程式和 tagbar 外掛。但是這裡講到了預覽視窗,值得學習一下。

命令 功能
:ptag 開啟預覽視窗顯示函式資訊
CTRL-W } 開啟預覽視窗顯示函式資訊
:pclose 關閉預覽視窗
:pedit 在預覽視窗中編輯一個檔案
:psearch 在預覽視窗中搜索
] 開頭和 [ 開頭的命令 在程式中跳轉

usr_30.txt 編輯程式,主要是和 quickfix 有關的命令和縮排有關的命令。

命令 功能
:cnext 將游標移動到下一個錯誤所在的行
:cc 檢視詳細的出錯資訊
:clist 列出所有的出錯資訊
:set cindent siftwidth=4 設定 C 風格的縮排
= 自動對選定的範圍進行縮排
> 增加縮排
< 減少縮排
:set expandtab 將<Tab>展開為空格
CTRL-T 在插入模式下,增加一個縮排
CTRL-D 在插入模式下,減少一個縮排

usr_31.txt 利用 GUI,瞭解一下。

usr_32.txt 撤銷樹,瞭解一下。

usr_40.txt 建立新的命令,usr_41 編寫 Vim 指令碼,usr_42.txt 新增新的選單,對於有志於編寫外掛的朋友可以學一下,相當於又多學了一門程式語言。對於我這樣的懶人,從這裡開始到後面的內容我都跳過了。

讀完 Vim 幫助中的 usr_toc 系列,並做好筆記,大概需要兩天時間吧。唯一的問題是如果不經常用的話,很快就會忘記了。必要時可以隔一段時間再讀一遍。如果需要更詳細地瞭解 Vim 的所有內容,可以參考 quickref.txt 和 index.txt 中的內容,也可以讀其它的專題內容。

最後,再向大家推薦一個比我總結得更好的 Vim 學習資料:vim-galore-zh_cn