VIM
基本介紹
vim誕生已有20多年,它常被人稱之為編輯器之神,vim的操作理念可以說是獨具一格而又出類拔萃,使用vim能極大的提升文字處理效率,因此熟練掌握vim應該是每個程式設計師都應該做到的事情。
vim目前有3個較常見的版本:
- vi:只保留了一些基礎功能,在絕大多數Linux發行版中都內建了vi
- vim:相較於vi功能更加完善,是標準的版本,但是在某些Linux發行版中需要手動安裝
- neovim:目前最火熱的一個vim分支,它在vim原本的基礎上做了一些改進,使其更加的優秀
安裝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的字樣則代表安裝成功:
模式介紹
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檔案,並將內容貼上進去得到了解決。