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

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

特別說明:要在個人隨筆後寫評論的小夥伴們請注意了,個人博客開啓了 MathJax 數學公式支持,MathJax 使用$標記數學公式的開始和結束。若是某條評論中出現了兩個$,MathJax 會將兩個$之間的內容按照數學公式進行排版,從而致使評論區格式混亂。若是你們的評論中用到了$,可是又不是爲了使用數學公式,就請使用\$轉義一下,謝謝。html

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

前言

原本我是想寫完 Linux 桌面系統的美化和字體配置以後再寫 Vim 的。可是等我寫完玩轉 Linux 系統的方法論一看,發現一個好用的文本編輯器在 Linux 系統中實在是過重要了,在玩轉 Linux 系統的方法論中,個人不少例子都是靠 Vim 展現出來的。沒有文本編輯器,怎麼去讀代碼、改配置、寫腳本呢?若是不能讀代碼、改配置、寫腳本,該系列後面的內容怎麼進行得下去呢?因此,我這一篇寫一寫 Vim 的配置。c++

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

我主要在如下狀況下使用 Vim: 1.用來修改服務器系統的配置文件。不少時候, Linux 做爲服務器是不會開啓圖形界面的,當須要遠程操做時,只能利用 SSH 「命令字符式」的 Shell 界面對其進行操做,這種狀況下,Vim 天然是首選。 2.用來閱讀內核源代碼和系統的腳本。理由同上。 3.用來寫簡單的程序,通常都是單文件的程序,或多文件可是隻有少數幾個文件的項目,例如學習一門編程語言的時候作練習題,喜歡看到文件夾內乾乾淨淨,不喜歡一大堆相似 .project 的文件。 4.裝B,花花綠綠的純文本字符界面,很酷。github

不適合 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 神祕高效水又深,因此吸引了一大批信徒。在網絡上關於 Vim 的自定義配置汗牛充棟。既有高手 Tim Pope 的極簡配置 tpope/vim-sensible(這個配置一個插件都沒有),也有 spf13/spf13-vimSpaceVim 這樣大而全的配置。而對我來講,我喜歡簡潔而優雅,一大堆 Plugin 堆砌起來的東西我當然不喜歡,可是一個插件都沒有的極簡配置那用起來也不太順手。因此我必須得本身配。後端

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

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

再例如 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-surroundnerdcommenter 之類的,那就不要了吧,不要它們也多敲不了幾下鍵盤,還能夠省下學習成本。若是爲了美觀,這個 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 把上次在插入模式下輸入的文本再輸入一次
CTRL-@ 同上,但插入後退出插入模式
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

求打賞

我對此次寫的這個系列要求是很是高的:首先內容要有意義、夠充實,信息量要足夠豐富;其次是每個知識點要講透徹,不能模棱兩可含糊不清;最後是包含豐富的截圖,讓那些不想裝 Linux 系統的朋友們也能夠領略到 Linux 桌面的風采。若是個人努力獲得你們的承認,能夠掃下面的二維碼打賞一下:

版權申明

該隨筆由京山遊俠在2018年09月11日發佈於博客園,引用請註明出處,轉載或出版請聯繫博主。QQ郵箱:1841079@qq.com

相關文章
相關標籤/搜索