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 | 向后移動一個單詞,光標位於單詞首部 |
W | 向后移動一組單詞,光標位於單詞首部,如class-name就會被認為是一組單詞 |
b | 向前移動一個單詞,光標位於單詞首部 |
B | 向前移動一組單詞,光標位於單詞首部,如class-name就會被認為是一組單詞 |
e | 向后移動一個單詞,光標位於單詞尾部 |
E | 向后移動一組單詞,光標位於單詞尾部,如class-name就會被認為是一組單詞 |
f | 向后查詢一個字符,並將光標跳轉到目標處 |
F | 向前查詢一個字符,並將光標跳轉到目標處 |
t | 向后查詢一個字符,並將光標跳轉到目標前一個位置 |
T | 向前查詢一個字符,並將光標跳轉到目標后一個位置 |
; | 重復上一次的f、F、t、T查詢 |
0 | 光標移動到本行的起始位置 |
$ | 光標移動到本行的結束位置 |
^ | 光標移動到本行的第一個非空白字符處 |
$_ | 光標移動到本行的最后一個非空白字符處 |
G | 光標移動到文件的開頭 |
gg | 光標移動到文件的末尾 |
注意w、b、e如果光標正位於當前單詞的中間,那么它將會先把光標移動到當前單詞的首部或者尾部。
文檔瀏覽
普通模式下文檔瀏覽命令如下:
命令 | 描述 |
---|---|
H | 光標移動到當前屏幕展示內容區域第一行的第一個字符 |
M | 光標移動到當前屏幕展示內容區域中間行的第一個字符 |
L | 光標移動到當前屏幕展示內容區域最后一行的第一個字符 |
zt | 將光標所在行設為屏幕展示區域的首行 |
zz | 將光標所在行設為屏幕展示區域的中心 |
zb | 將光標所在行設為屏幕展示區域的尾行 |
ctrl + e | 將頁面移動一個光標 |
ctrl + u | 查看上半頁內容 |
ctrl + d | 查看下半頁內容 |
ctrl + b | 查看上一頁內容 |
ctrl + f | 查看下一頁內容 |
ctrl + o | back 到之前的位置 |
ctrl + i | foward 到之前的位置 |
[ 與 ] | 跳轉到上一句、下一句 |
跳轉到上一段、下一段 | |
gt | 切換下一個標簽欄 |
gT | 切換上一個標簽欄 |
gf | 當處於一個 文檔鏈接 上時,可以直接在新的標簽頁打開該文件 |
注意,當打開新的 vim 時(無內容),可以按下 ctrl + o 打開上次的文件。
文檔插入
普通模式下文檔插入命令如下,若想從編輯模式回到普通模式,只需要按下ESC鍵即可:
命令 | 描述 |
---|---|
a | 光標后進行插入,進入編輯模式 |
i | 光標前進行插入,進入編輯模式 |
o | 下一行進行插入,進入編輯模式 |
A | 當前行尾插入,進入編輯模式 |
I | 當前行首插入,進入編輯模式 |
O | 上一行進行插入,進入編輯模式 |
s | 刪除當前光標下的內容,並進入編輯模式 |
S | 刪除當前行的內容,並進入編輯模式 |
cc | 刪除當前行的內容,並進入編輯模式 |
復制粘貼
普通模式下復制命令如下:
命令 | 描述 |
---|---|
y | 復制當前光標下的內容 |
yy | 復制當前行中的內容 |
p | 將內容粘貼至下一行 |
P | 將內容粘貼至上一行 |
刪除替換
普通模式下刪除替換命令如下:
命令 | 描述 |
---|---|
dd | 刪除當前行的內容 |
cc | 刪除當前行的內容,並進入編輯模式 |
r | 替換當前光標下的內容 |
R | 替換當前光標后的內容,按ESC鍵回到普通模式 |
s | 刪除當前光標下的內容,並進入編輯模式 |
S | 刪除當前行的內容,並進入編輯模式 |
xp | 交互當前字符和下一個字符的位置 |
注意,dd命令刪除其實是剪切的意思,你可以通過p或者P來進行粘貼。
字符查找
普通模式下字符查找命令如下:
命令 | 描述 |
---|---|
/ | 正向查找字符串,通過n或者N進行光標的上下跳轉 |
? | 反向查找字符串,通過n或者N進行光標的上下跳轉 |
# | 向前查找光標所在處的單詞 |
* | 向后查找光標所在處的單詞 |
撤銷重做
普通模式下撤銷重做命令如下:
命令 | 描述 |
---|---|
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 to
同理,若要連標簽一起刪除,可以使用cat命令:
cat
# change all to
常用組合
以下的n均代表數字。
文檔插入:
命令 | 描述 |
---|---|
:n | 跳轉到指定的行數 |
nh、nl、nj、nk | 向左右移動n個字符、向上下移動n行 |
nw、nb | 向前或后移動n個單詞 |
nf{char}、nF | 向前或后查詢第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 | 刪除本行中f之前的內容 |
di" | 刪除本行的""中的內容 |
da" | 刪除本行的"" |
dit | 刪除HTML標簽中的內容 |
dat | 刪除HTML標簽 |
cat | 刪除HTML標簽,並且進入編輯模式,通常情況下c要比d更常用 |
ciw | 刪除當前單詞、不包含后面的空格 |
caw | 刪除當期單詞、包含后面的空格 |
數字加減:
命令 | 描述 |
---|---|
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 | 關閉當前或其他標簽欄 |
:e | 將文件以buffer的形式打開 |
:bn 與 :bp | 打開上一次或下一次瀏覽的buffer |
:source nvim配置文件 | 刷新配置文件 |
行號相關
命令模式下行號相關命令如下:
命令 | 描述 |
---|---|
:set nu | 顯示行號 |
:set nonu | 隱藏行號 |
:set rnu | 設置相對行號 |
:set nornu | 關閉相對行號 |
:n | 定位到n行 |
拼寫檢查
命令模式下拼寫檢查相關命令如下:
命令 | 描述 |
---|---|
:set spell | 打開拼寫檢查 |
:set nospell | 關閉拼寫檢查 |
:set spell! | 打開或關閉拼寫檢查 |
:set spelllang=en_us,cjk | 設置拼寫檢查語言(忽略中文) |
[s | 移動到上一個拼寫錯誤處 |
]s | 移動到下一個拼寫錯誤處 |
z= | 給出正確拼寫的建議 |
zg | 添加到用戶拼寫中(標識為正確) |
zw | 從用戶平寫中刪除(取消標識) |
字符替換
命令模式下查找替換命令如下:
命令 | 描述 |
---|---|
:{range}s/{target}/{replace}/ | 查找並替換字符串 |
:noh | 取消搜索高亮 |
查找並替換字符串里其中range是范圍,不寫代表當前行、%代表全文。
而mode是查找模式,如i是大小寫不敏感、I是大小寫敏感、g是行模式等、c代表是否彈出 確認替換:
:s/http/https/gi # 將當前行的http替換為https
:%s/http/https/gi # 將全文的http替換為https
:2,10s/http/https/gi # 將第2到第10行的http替換為https
:2,+3s/http/https/gi # 將第2到后3行的http替換為https
:2,-3s/http/https/gi # 將第2到前3行的http替換為https
粘貼模式
有的時候我們復制一部分文本在vim中粘貼時可能會發生格式錯亂的問題。
此時你只需要打開粘貼模式然后再p即可:
命令 | 描述 |
---|---|
:set paste | 打開粘貼模式 |
:set nopaste | 退出粘貼模式 |
ab替換
有些單詞可能很長,如Elasticsearch,我們希望今后在輸入es的時候vim會自動將它替換為Elasticsearch,為此我們可以定義一條ab規則:
:ab es Elasticsearch
代碼折疊
vim的代碼折疊方式共有6種,每次只能使用一種:
- manual:手動通過zf定義折疊
- indent:利用縮進自動定義折疊
- expr:利用表達式自動定義折疊
- syntax:利用語法高亮自動定義折疊
- diff:對沒有更改的文本進行折疊
- marker:對文中的標准進行折疊
設置默認的折疊方式,你可以將它設置到配置文件中:
" 自動按照縮進進行代碼折疊
set foldmethod=indent
以下是一些常見的代碼折疊相關操作:
- zf:創建折疊
- zo:打開折疊
- zc:關閉折疊
- zR:打開所有
- zM:關閉所有
- zj:移動到下一個折疊
- zk:移動到上一個折疊
執行命令
在打開vim腳本時我們希望再到終端中執行某些命令:
:! command # 如 :! ls
將命令的結果輸入到當前文件中:
:r !command # 如 :r !ls
使用以下命令查看 vim
打開終端
在vim中打開終端只需要輸入以下命令即可:
:term
它會創建一個新的內置終端,該終端也遵循vim相關操作。
若要退出終端,可輸入 <C-\><C-n>
可視模式
基本概述
可視模式相當於多選操作,類似於鼠標左鍵一直摁住選擇一塊區域。
- v:進入字符可視化模式,按v或者ESC鍵可退回到普通模式
- V:進入行可視化模式,按V或者ESC鍵可退回到普通模式
- ctrl + v : 進入塊可視化模式,按ctrl + v或者ESC鍵可退回到普通模式
在可視模式下,一些按鍵被賦予了特殊的意義:
- y:復制選擇區域
- d:刪除選擇區域
- p:粘貼選擇區域
- >:進行縮進
- <:進行反縮進
- vi":選擇"之中的內容,不包括""
- va":選擇"的內容,包括""
一個很常用的操作:
V移動n行選擇一片區域
:s/http/https/gi
# 將一片區域中的http替換成https
另一個操作:
V移動n行選擇一片區域
:normal A 123
# 在所有選擇行的最后面添加123
換句話說,可視模式搭配其他 2 種模式可以做出很多高效操作。
高級操作
分屏
我們可以在打開文件的時候進行分屏瀏覽:
$ 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 clipboard=unnamed
" 顯示行號
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 hlsearch
" 邊搜索邊高亮
set incsearch
" 開啟類型檢查
" set spell spelllang=en_us
" 開啟命令補全
set wildmenu
" 不創建備份文件
set nobackup
" 不創建交換文件
set noswapfile
" 多窗口下光標移動到其他窗口時自動切換工作目錄
set autochdir
" 忽略大小寫
set ignorecase
" 智能大小寫
set smartcase
更多的情況下我們會替換掉一些默認普通模式下的vim快捷鍵,在配置前我們需要了解一些概念:
- leader:前導鍵,類似於Thinkpad的小紅點,它是vim的一個功能鍵
- map:會遞歸的映射方式、a映射b、c映射a、那么按c其實就等於按了b
- noremap:不會遞歸的映射方式
- nnoremap:只會在普通模式下生效的映射方式
- inoremap:只會在插入模式下生效的映射方式
- vnoremap:只會在可視模式下生效的映射方式
- cnoremap:只會在命令模式下生效的映射方式
配置文件如下,其中<cr>代表回車鍵:
" 配置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
" 修改回到普通模式的按鍵
inoremap jj <Esc>
" 修改^以及$的映射方式
nnoremap H ^
nnoremap L $
插件安裝
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
# 國內可訪問
$ curl -fLo ~/.local/share/nvim/site/autoload/plug.vim --create-dirs \
https://gitee.com/c4pr1c3/vim-plug/raw/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在命令模式下輸入以下命令即可完成以添加的插件安裝,按q退出即可:
:PlugInstall
如果想更新以安裝的插件,可以在vim命令模式下輸入以下命令:
:PlugUpdate
查看已安裝的所有插件狀態,按q退出:
:PlugStatus
當需要卸載插件時,你只需要在init.vim文件中將加載的插件行進行刪除或注釋即可,這樣vim下次啟動時就不會加載該插件了:
" 注釋該插件
" Plug 'vim-plug'
# Ps:若想刪除該插件則可使用:PlugClean即可
vim也提供了懶加載機制,只有在特定條件下該插件才會被加載,如下所示:
" 只有在打開php、html、javascript類型文件時才加載該插件
Plug 'vim-plug', { 'for': ['php', 'html', 'javascript'] }
有些vim插件可能在安裝后需要做一些額外的操作,你可以在這些插件的自述文檔中找到這些說明,比如在安裝完成后執行一段腳本:
Plug 'vim-plug', { '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文件,並將內容粘貼進去得到了解決。