vim 讓人愛不釋手的編輯器之神

雲崖君發表於2021-10-29

VIM

基本介紹

vim誕生已有20多年,它常被人稱之為編輯器之神,vim的操作理念可以說是獨具一格而又出類拔萃,使用vim能極大的提升文字處理效率,因此熟練掌握vim應該是每個程式設計師都應該做到的事情。

vim目前有3個較常見的版本:

  • vi:只保留了一些基礎功能,在絕大多數Linux發行版中都內建了vi
  • vim:相較於vi功能更加完善,是標準的版本,但是在某些Linux發行版中需要手動安裝
  • neovim:目前最火熱的一個vim分支,它在vim原本的基礎上做了一些改進,使其更加的優秀

img

安裝nvim

由於neovim是今後的主流,所以我們選擇安裝neovim,可參閱官方文件查閱安裝方法,我這裡是以MAC平臺為例。

1)下載neovim的安裝包:

$ wget https://github.com/neovim/neovim/releases/download/stable/nvim-macos.tar.gz

2)解壓到指定的目錄:

$ tar xzf ./nvim-macos.tar.gz -C /usr/local/application/
$ mv /usr/local/application/nvim-osx64/ /usr/local/application/nvim

3)將neovim新增到系統環境變數,並將nvim alias 為 vim:

$ vim /etc/profile

alias vim='nvim'
PATH=/usr/local/application/nvim/bin:$PATH

$ source /etc/profile

4)輸入vim後能夠看到neovim的字樣則代表安裝成功:

image-20211025194455456

模式介紹

vim有4種模式,分別是:

  • NORMAL:普通模式、使用ESC進入
  • INSERT:插入模式、使用i、a、o、I、A、O、s、S、c進入,使用ESC退出
  • COMMAND:命令模式、使用 : 進入,輸入命令後要回車才會生效,使用ESC退出
  • VISUAL:可視模式、使用v、V進入,使用ESC或者v、V退出

首先當我們進入vim後,它會處於普通模式中,普通模式是vim最強大的也最常用的模式。

普通模式

游標移動

普通模式下游標移動命令如下:

命令 描述
h 游標向左移動一個字元
l 游標向右移動一個字元
j 游標向下移動一行
k 游標向上移動一行
w 向後移動一個單詞,游標位於單詞首部
b 向前移動一個單詞,游標位於單詞首部
e 向後移動一個單詞,游標位於單詞尾部
f {char} 向後查詢一個字元,並將游標跳轉到目標處
F {char} 向前查詢一個字元,並將游標跳轉到目標處
t {char} 向後查詢一個字元,並將游標跳轉到目標前一個位置
T {char} 向前查詢一個字元,並將游標跳轉到目標後一個位置
0 游標移動到本行的起始位置
$ 游標移動到本行的結束位置
^ 游標移動到本行的第一個非空白字元處
$_ 游標移動到本行的最後一個非空白字元處
G 游標移動到檔案的開頭
gg 游標移動到檔案的末尾

注意w、b、e如果游標正位於當前單詞的中間,那麼它將會先把游標移動到當前單詞的首部或者尾部。

文件瀏覽

普通模式下文件瀏覽命令如下:

命令 描述
H 游標移動到當前螢幕展示內容區域第一行的第一個字元
M 游標移動到當前螢幕展示內容區域中間行的第一個字元
L 游標移動到當前螢幕展示內容區域最後一行的第一個字元
zt 將游標所在行設為螢幕展示區域的首行
zz 將游標所在行設為螢幕展示區域的中心
zb 將游標所在行設為螢幕展示區域的尾行
ctrl + u 檢視上半頁內容
ctrl + d 檢視下半頁內容
ctrl + f 檢視下一頁內容
ctrl + b 檢視上一頁內容
[ 與 ] 跳轉到上一句、下一句
{ 與 } 跳轉到上一段、下一段
gt 切換下一個選項卡
gT 切換上一個選項卡

文件插入

普通模式下文件插入命令如下,若想從編輯模式回到普通模式,只需要按下ESC鍵即可:

命令 描述
a 游標後進行插入,進入編輯模式
i 游標前進行插入,進入編輯模式
o 下一行進行插入,進入編輯模式
A 當前行尾插入,進入編輯模式
I 當前行首插入,進入編輯模式
O 上一行進行插入,進入編輯模式
s 刪除當前游標下的內容,並進入編輯模式
S 刪除當前行的內容,並進入編輯模式
cc 刪除當前行的內容,並進入編輯模式

複製貼上

普通模式下複製命令如下:

命令 描述
y 複製當前游標下的內容
yy 複製當前行中的內容
p 將內容貼上至下一行
P 將內容貼上至上一行

刪除替換

普通模式下刪除替換命令如下:

命令 描述
dd 刪除當前行的內容
cc 刪除當前行的內容,並進入編輯模式
r 替換當前游標下的內容
R 替換當前游標後的內容,按ESC鍵回到普通模式
s 刪除當前游標下的內容,並進入編輯模式
S 刪除當前行的內容,並進入編輯模式

注意,dd命令刪除其實是剪下的意思,你可以通過p或者P來進行貼上。

撤銷重做

普通模式下撤銷重做命令如下:

命令 描述
u 撤銷
ctrl + r 重做

數字加減

普通模式下數字加減命令如下:

命令 描述
ctrl + a 數字自加1
ctrl + x 數字自減1

字元轉換

普通模式下字元轉換命令如下:

命令 描述
~ 將游標下的字母切換大小寫
g ~~ 將當前行的字母切換大小寫
gUU 將當前行的字母改成大寫
guu 將當前行的字母改成小寫
gUaw 將當前單詞改成大寫
guaw 將當前單詞改成小寫

縮排重複

普通模式下縮排重複命令如下:

命令 描述
>> 進行縮排,預設為8個空格
<< 進行反縮排
. 重複上一次的動作

指令動作

vim裡分為指令和動作,我們可以通過它們的組合定義出一系列的動作鏈進行執行。

比如,向右移動3個字元:

3l

再比如,向後查詢第二個以f開頭的字元:

2ff

刪除全文:

dG
dgg

令數字自增或者自減n個值:

100 ctrl+a
100 ctrl+x

在文件操作中,有一類操作很常見,比如刪除下面Array的內容:

[1, 2, 3, 4, 5]

我們可以將游標移動到該陣列上,輸入以下命令即可,其中i代表inner,即不包含[]自身:

ci[

# change inner []

如果你想連同[]也一起刪除,可以輸入以下命令,其中a代表all,即包含[]自身:

ca[

# change all []

同理,[]、()、{}以及""和''都支援這樣操作。

在HTML文件操作中,刪除一個標籤的內容可能會經常常用,對此你可以直接在將被刪除的標籤上使用cit命令即可:

cit

# change inner the

同理,若要連標籤一起刪除,可以使用cat命令:

cat

# change all the

常用組合

以下的n均代表數字。

文件插入:

命令 描述
:n 跳轉到指定的行數
nh、nl、nj、nk 向左右移動n個字元、向上下移動n行
nw、nb 向前或後移動n個單詞
nf{char}、nF{char} 向前或後查詢第n個字元,並將游標跳轉到此處
0、^、$_、$ 游標移動到本行的起始或結束位置
G、gg 游標移動到檔案的開頭或者末尾

複製貼上:

命令 描述
nyw 複製n個詞語
yy 複製一整行
nyy 複製n行
yi" 複製本行的""中的內容
ya" 複製本行的""
p、P 將內容貼上至下一行或上一行

刪除文字:

命令 描述
r 替換當前游標下的內容
R 替換當前游標後的內容,按ESC鍵回到普通模式
ndw 刪除n個單詞,也可以使用dnw
ndd 刪除n行,也可以使用dnd
dG 從文字開頭刪到文字結束
dgg 從文字結束刪到文字開頭
df{char} 刪除本行中f之前的內容
di" 刪除本行的""中的內容
da" 刪除本行的""
dit 刪除HTML標籤中的內容
dat 刪除HTML標籤
cat 刪除HTML標籤,並且進入編輯模式,通常情況下c要比d更常用

數字加減:

命令 描述
ctrl + a 數字自加1
ctrl + x 數字自減1
n ctrl + a 數字自加n
n ctrl + x 數字自減n

縮排重複:

命令 描述
>> 進行縮排,預設為8個空格
<< 進行反縮排
. 重複上一次的動作

命令模式

檔案開關

命令模式下檔案開關命令如下:

命令 描述
:w 與 :w! 儲存當前檔案但不退出、加!是強制儲存
:wa 與 :wa! 儲存所有檔案但不退出、加!是強制退出
:q 與 :q! 退出當前檔案但不儲存、加!是強制退出
:qa 與 :qa! 退出所有檔案但不儲存、加!是強制退出
:x 與 :x! 退出當前檔案並儲存、加!是強制退出並儲存
:wq 與 :wq! 退出當前檔案並儲存、加!是強制退出並儲存
:xa 與 :xa! 退出所有檔案並儲存、加!是強制退出並儲存
:wqa與:wqa! 退出所有檔案並儲存、加!是強制退出並儲存
:saveas file 將檔案另存為
:tabnew file 在選項卡中開啟另一個檔案
:tabn 與 :tabp 切換下一個或上一個選項卡
:tabc 與 :tabo 關閉當前或其他選項卡
:bn 與 :bp 開啟上一次或下一次瀏覽的選項卡

行號相關

命令模式下行號相關命令如下:

命令 描述
:set nu 顯示行號
:set nonu 隱藏行號
:set rnu 設定相對行號
:set nornu 關閉相對行號
:n 定位到n行

拼寫檢查

命令模式下拼寫檢查相關命令如下:

命令 描述
:set spell! 開啟或關閉拼寫檢查

查詢替換

命令模式下查詢替換命令如下:

命令 描述
: /{char} 查詢字串,通過n或者N進行游標的上下跳轉
:{range}s/{target}/{replace}/{mode} 查詢並替換字串
:noh 取消搜尋高亮

查詢並替換字串裡其中range是範圍,不寫代表當前行、%代表全文。

而mode是查詢模式,如i是大小寫不敏感、I是大小寫敏感、g是行模式等、c代表是替換確認:

:s/http/https/i   # 將當前行的http替換為https
:%s/http/https/gi # 將全文的http替換為https

貼上模式

有的時候我們複製一部分文字在vim中貼上時可能會發生格式錯亂的問題。

此時你只需要開啟貼上模式然後再p即可:

命令 描述
:set paste 開啟貼上模式
:set nopaste 退出貼上模式

執行命令

在開啟vim指令碼時我們希望再到終端中執行某些命令,並且將命令的結果輸入到當前檔案中:

:r !command  # 如 :r !ls

ab替換

有些單詞可能很長,如Elasticsearch,我們希望今後在輸入es的時候vim會自動將它替換為Elasticsearch,為此我們可以定義一條ab規則:

:ab es Elasticsearch

可視模式

基本概述

可視模式相當於多選操作,類似於滑鼠左鍵一直摁住選擇一塊區域。

  • v:進入字元視覺化模式,按v或者ESC鍵可退回到普通模式
  • V:進入行視覺化模式,按V或者ESC鍵可退回到普通模式
  • ctrl + v : 進入塊視覺化模式,按ctrl + v或者ESC鍵可退回到普通模式

在可視模式下,一些按鍵被賦予了特殊的意義:

  • y:複製選擇區域
  • d:刪除選擇區域
  • p:貼上選擇區域
  • >:進行縮排
  • <:進行反縮排
  • vi":選擇"之中的內容,不包括""
  • va":選擇"的內容,包括""

高階操作

分屏

我們可以在開啟檔案的時候進行分屏瀏覽:

$ vim -on file1, filen ... filen  # 注意!小寫on代表上下分屏
$ vim -On file1, filen ... filen  # 注意!大寫On代表左右分屏

若想在開啟檔案後進行分屏操作,則需要:

ctrl + w  s     # 按照當前檔案新拆分一個上下分屏
:sp file        # 按照指定檔案新拆分一個上下分屏

ctrl + w  v     # 按照當前檔案新拆分一個左右分屏
:vsp file       # 按照指定檔案新拆分一個左右分屏

移動上下分屏的位置:

ctrl + w  H	    # 將當前游標定位的分屏向左移
ctrl + w  L	    # 將當前游標定位的分屏向右移

ctrl + w  J	    # 將當前游標定位的分屏向下移
ctrl + w  K	    # 將當前游標定位的分屏向上移

切換左右分屏的游標:

ctrl + w  h     # 將當前游標定位到左邊分屏
ctrl + w  l	    # 將當前游標定位到右邊分屏

ctrl + w  j	    # 將當前游標定位到下邊分屏
ctrl + w  k	    # 將當前游標定位到上邊分屏

關閉當前分屏的命令:

ctrl + w  c     # 關閉當前分屏
ctrl + w  q     # 關閉當前分屏,如果是最後一個分屏將退出vim

巨集錄製

在很多情況下我們希望重複一個動作,此時就可以使用巨集錄製功能。

在普通模式下進行操作:

  • 按q啟動巨集錄製
  • 為你的巨集取一個名字,如t
  • 開始錄製你的操作
  • 錄製完成之後按q結束錄製
  • 按下@t執行巨集

如我想生成一個從1到10的數字自增列:

i 1 ESC              # 進入插入模式,輸入1,然後退到普通模式
q t yy p ctrl+a q    # 錄製1次巨集
8@t                  # 啟動8次巨集

配置檔案

vim和neovim的配置檔案存放地方有些不一樣:

  • vim:~/.vimrc檔案
  • neovim:~/.config/nvim/init.vim檔案

如下是常用設定,其中"是註釋:

" 顯示行號
set number
" 設定相對行號
set relativenumber
" 設定行寬
set textwidth=80
" 設定自動這行
set wrap
" 是否顯示狀態列
set laststatus=2
" 語法高亮
syntax on
" 支援滑鼠
set mouse=a
" 設定編碼格式
set encoding=utf-8
" 啟用256色
set t_Co=256
" 開啟檔案型別檢查
filetype indent on
" 設定自動縮排
set autoindent
" 設定tab縮排數量
set tabstop=4
" 設定>>與<<的縮排數量
set shiftwidth=4
" 將縮排轉換為空格
set expandtab
" 自動高亮匹配符號
set showmatch
" 自動高亮匹配搜尋結果
set nohlsearch
" 開啟逐行搜尋,也就是說按下一次按鍵就繼續一次搜尋
set incsearch
" 開啟型別檢查
" set spell spelllang=en_us
" 開啟命令補全
set wildmenu
" 不建立備份檔案
set nobackup
" 不建立交換檔案
set noswapfile
" 多視窗下游標移動到其他視窗時自動切換工作目錄
set autochdir

更多的情況下我們會替換掉一些預設普通模式下的vim快捷鍵,在配置前我們需要了解一些概念:

  • leader:前導鍵,類似於Thinkpad的小紅點,它是vim的一個功能鍵
  • map:會遞迴的對映方式、a對映b、c對映a、那麼按c其實就等於按了b
  • noremap:不會遞迴的對映方式
  • nnoremap:只會在普通模式下生效的對映方式
  • inoremap:只會在插入模式下生效的對映方式
  • vnoremap:只會在可視模式下生效的對映方式

配置檔案如下,其中<cr>代表Enter鍵:

" 配置vim的前導鍵
let mapleader = "\<space>"

" 簡化分屏模式快捷鍵
noremap <C-j> <C-W>j
noremap <C-k> <C-W>k
noremap <C-h> <C-W>h
noremap <C-l> <C-W>l

" 修改選項卡操作,取消e和E的跳詞
nnoremap e gt
nnoremap E gT
nnoremap <leader>n :tabnew 
nnoremap <leader>cc :tabc<cr>
nnoremap <leader>co :tabo<cr>

" 修改回到普通模式的按鍵
inoremap jj <Esc>

外掛安裝

vim的強大之處就在於它可以支援各種各樣的外掛。

在vim中,我們要想管理外掛,就必須依賴另一款外掛vim-plug

下載vim-plug(需要上梯):

$ sh -c 'curl -fLo "${XDG_DATA_HOME:-$HOME/.local/share}"/nvim/site/autoload/plug.vim --create-dirs \ 
       https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

將下面2行加入到~/.config/nvim/init.vim中,後續我們的外掛都放在這2行中間:

" begin指定外掛存放目錄
" 如果是vim,則指定到~/.vim/autoload/中
call plug#begin('~/.config/nvim/autoload/')
" 外掛放在這裡
call plug#end()

到github上尋找你要安裝的外掛,我們以配色外掛舉例,將它新增到init.vim檔案中:

call plug#begin('~/.config/nvim/autoload/')
" 載入配色外掛
Plug 'theniceboy/vim-deus'
call plug#end()

然後只需要進入vim在命令模式下輸入以下命令即可完成以新增的外掛安裝:

:PlugInstall

如果想更新以安裝的外掛,可以在vim命令模式下輸入以下命令:

:PlugUpdate

當需要解除安裝外掛時,你只需要在init.vim檔案中將載入的外掛行進行刪除或註釋即可,這樣vim下次啟動時就不會載入該外掛了:

" 註釋該外掛
" Plug 'theniceboy/vim-deus'

vim也提供了懶載入機制,只有在特定條件下該外掛才會被載入,如下所示:

" 只有在開啟php、html、javascript型別檔案時才載入該外掛
Plug 'yuezk/vim-js', { 'for': ['php', 'html', 'javascript'] }

有些vim外掛可能在安裝後需要做一些額外的操作,你可以在這些外掛的自述文件中找到這些說明,比如在安裝完成後執行一段指令碼:

Plug 'Yggdroot/LeaderF', { 'do': './install.sh' }

推薦在init.vim檔案首行新增上這樣一段程式碼,它的作用在於每次啟動vim前都會檢查是否安裝了vim-plug外掛,如果沒有安裝它將自動嘗試安裝且執行:PlugInstall命令:

if empty(glob('~/.config/nvim/autoload/plug.vim'))
silent !curl -fLo ~/.config/nvim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
autocmd VimEnter * PlugInstall --sync | source $MYVIMRC
endif

443問題

在安裝vim-plug時curl:433這個問題一直困擾我很久,我嘗試了各種辦法如掛代理、修改hosts檔案等都沒得到有效解決。

最後我在chrome中開啟了vim-plug的url:

https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

將裡面的內容copy下來後到~/.config/nvim/autoload中touch了一個vim-plug檔案,並將內容貼上進去得到了解決。

相關文章