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


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 向后移動一個單詞,光標位於單詞首部
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文件,並將內容粘貼進去得到了解決。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM