Vim 學習筆記
1. 常用命令
1.1 編輯模式
1.1.1 進入編輯模式
i : 在當前光標下開始插入
a : 在當前光標后面一個位置插入
o : 在當前行下一行開頭(新開一行)插入
I : 在當前行開頭插入
A : 在當前行行尾插入
O : 在當前行的上一行(新開一行)開頭插入
1.1.2 刪除
ctrl + h : 刪除一個字符
ctrl + w : 刪除一個單詞
ctrl + u : 刪除當前行
1.2. 普通模式
1.2.1 linux快捷鍵
ctrl + a 移動光標到本行開頭
ctrl + b 向前移動一個位置
ctrl + f 向后移動一個位置
ctrl + e 移動光標到本行末尾
ctrl + u 刪除本行
ctrl + w 刪除一個單詞
ctrl + h 刪除一個字符
1.2.2 技巧
ctrl + [ 代替 esc 來退出編輯模式
gi 可快速進入上次編輯位置並且進入插入模式
1.2.3 移動
h 左移
j 下移
k 上移
l 右移
w/W 移動到下一個單詞的開頭
e/E 移動到下一個單詞的結尾
b/B 回到上一個單詞的開頭 // 其中w/e/b的都是代表以非空白符分割的單詞,W/E/B 是以空白分割的單詞
f + char 可快速跳轉到第一要查找的字符位置,使用;來找下一個符合的位置,使用,來找前一個符合的位置
F + char 功能和 f + char 一樣,只不過是順序反過來搜索
t + char 可快速跳轉到需要查找的字符前一個位置,也可以使用;和,
0 數字0 可快速移動光標到行首
$ 移動到行尾
gg 移動到文件的開頭
G 移動到文件的結尾
ctrl + o 返回上一個位置
H 快速移動到當前屏幕的開頭
M 快速移動到當前屏幕的中間
L 快速移動到當前屏幕的結尾
ctrl + u 上翻頁
ctrl + f 下翻頁
zz 把當前行置於屏幕中間
1.2.4 刪除
x 刪除一個字符, 可一次刪除多個字符 如: 4x 刪除4個
dw/daw 刪除一個單詞包括單詞后面的多個
diw 刪除一個單詞但是不刪除單詞后面的多個空格
dd 刪除整行 可刪除多行 如: 3dd
dt + 操作符(比如",),...任意字符) 刪除本行內所有字符直到到達第一個指定字符
d + 0(數字0) 從當前位置刪除到行頭
d + $ 從當前位置刪除到行尾
v 使用v進入單字符選擇模式,然后使用左右移動來選擇多個字符,然后使用x來刪除多個字符
V 使用V進入多行選擇模式,使用d來刪除多行
u 回退上一步
1.2.5 修改
r + char 替換字符(單次)
R + cahr 從當前位置輸入每一個字符將被輸入的字符替換
s 刪除當前字符,並進入插入模式
S 刪除整行並進入插入模式
c + 表達式 執行表達式並進行插入(caw=daw + 插入,ct= dt+ 插入...)
C 刪除當前行光標后的所有字符
1.2.6 查詢
使用/或者?進行前向或者反向搜索
使用n/N跳轉到下一個或者上一個匹配
使用*或者#進行當前單詞的前向和后向的匹配
1.3 命令模式(😃
1.3.1 常用命令
:set nu // 設置行號
:set autoindent // 開啟自動縮進
:q 退出
:w 保存
:q! 強制退出
:wq 保存退出
:ctrl + p 可查看執行的上一條命令
:r! echo % 當前位置插入本文件文件名
:r! echo %:p 當前位置插入文件全路勁
1.3.2 搜索替換
表達式: 行范圍 s/srcStr/totalStr/tag 如: 1,6 s/print/fmt/g
: 行范圍如果是% 則表示是全文替換 tag: g表示全局范圍,c表示確認,可以確認或者拒絕修改,n報告匹配次數但是不會進行替換
也可以用正則表達式進行替換
/Str 搜索結果但是不執行任何操作
1.4 可視模式
1. 在普通模式下按v即可進入可視模式
2. 可視模式下可以進行多選行和多選字符操作
3. 可視模式下可以使用gg和G 等命令
4. 在可視模式下多選后可進入命令模式執行普通模式下的命令如:'<,'> normal I"
1.5 多文件操作
1.5.1 buffer 緩沖區
1. 一個文件對應一個緩沖區
2. 命令模式下打開一個新的緩沖區 e + 文件名
3. ls : 列出當前所有緩沖區
4. 緩沖區切換:
b + n(數字) 跳轉到第幾個緩沖區
bprevious 前一個緩沖區
bnext 后一個緩沖區
bfirst 第一個緩沖區
blast 最后一個緩沖區
b buffer_name 切換到指定緩沖區(可tab補全)
1.5.2 window 窗口
一個緩沖區可以分割成多個窗口,每個窗口可以打開不同的緩沖區,每個窗口可以被無線分割
窗口分割
ctrl + w + s 水平分割
ctrl + w + v 垂直分割
或者命令模式下
:sp 水平分割 // sp a.py 打開a.py 並 水平分割
: vs 垂直分割 // vs b.py 打開b.py 並垂直分割
窗口切換
ctrl + w + w 窗口到下一個窗口
ctrl + w + h 切換到左窗口
ctrl + w + j 切換到垂直下窗口
ctrl + w + k 切換到垂直上窗口
ctrl + w + l 切換到右窗口
不同窗口不同buffer
切換到指定窗口使用e + buffer 即可
窗口移動
ctrl + w + H 移動到左邊
ctrl + w + J 移動到下面
ctrl + w + K 移動到上面
ctrl + w + L 移動到右邊
1.6 Vim常用技巧
1. vim a.py b.py -o // 同時打開兩個窗口打開兩個文件(橫向) -O (縱向)
2. ZZ // 普通模式下的保存退出,相當於命令模式下的:wq
3. :source ~/.vimrc // 不退出的情況下修改vimrc使之生效
4. 在可視化模式中選中字符或者單詞等后可以使用 U來把選中的字符改成大寫,u改成小寫
5. :qa 可退出所有窗口
2. vim 的 Text Object
2.1 文本對象操作方式
[number] <commond> [text object]
number 代表此命令操作次數 commond 是命令 d(delete), c(change), y(yank)
text object 文本對象 單詞w, 句子s, 段落p
c + i + 標識符 可以快速刪除以標識符開始以對應標識符結束的內容,並進行插入操作
v + aw 可視化選擇單詞 包括空格
v + iw 不包括單詞
3. 復制和粘貼
3.1 普通模式下的復制和粘貼
1. y(yank)復制,p(put)粘貼,d和p則實現了剪切復制
2. 也可以在可視模式下選擇多個自己想要的字符,按y復制,然后按p粘貼
3. 配合文本對象 使用yiw復制一個單詞,使用yy復制一行
3.2 插入模式下的復制和粘貼
1. 當vim 設置成autoindent 時,如果在別處復制的代碼粘貼到vim會造成代碼縮進錯誤這是需要設置set paste
2. 當繼續編輯時則需要再設置為set nopaste 這樣autoindent就會重新起作用
3.3 寄存器
當使用vim進行d,刪除或者y復制時,默認把這些數據保存到來無名寄存器中
使用自定義寄存器:
1. "" + 寄存器名字 + d/y 把數據復制到寄存器 // eg: "" + a + yy
2. 查看寄存器 reg a
3. 使用寄存器 "" + a + p
其他寄存器:
1. 復制專用寄存器"0
4. 宏
4.1 宏的使用
1. Vim 使用q 來錄制,同時使用q來結束錄制 // 錄制時需要跟上寄存器名稱 如: qa
2. 使用q{register}選擇要保存的寄存器 // qa
3. 使用@{register}回放寄存器中保存的命令 // @a
在復雜的操作中使用宏可以大大縮減工作量
5. Vim 補全
1. 使用ctrl + n 和 ctrl + p補全單詞 // 如果提示單詞多的話再次使用ctrl + n 或者 ctrl +p 選擇上一個或者下一個結果
2. 使用ctrl + x ctrl + f補全文件名 // 也可以使用ctrl + n 和 ctrl +p 來進行上下選擇
3. 使用ctrl + x ctrl + o補全代碼,需要插件
6. Vim 更換配色
:colorscheme 顯示當前配色方案
:colorscheme ctrl + d 來顯示所有可用配色方案
:colorscheme + 方案名 來使用配色方案
可以下載網上配色方案如:https://github.com/flazz/vim-colorschemes/tree/master/colors 到
.vim/colors 下這樣Vim 就可以識別到該配色方案
7. 使用.vimrc 配置文件
1. vim ~/.vimrc // 編輯或者創建配置文件,所有持久的配置選項都放在這里
2. 常用配置:
備注: " 常用設置
set number: 設置行號
set hlsearch: 高亮搜索
set foldmethod=indent : 設置折疊方式
let mapleader=',' : 設置"," 為leader
inoremap <leader>w <Esc>:w<cr> : 設置按鍵映射
8. 使用映射
8.1 可遞歸映射
基本模式映射(也是默認的模式 normal 下的映射)
:map - x : 以-代替x來進行刪除字符操作 // 注意這里是在普通模式下修改的映射 非持久化
如果想持久話映射那么:
map - x // 在.vimrc文件中
使用其他模式下的映射
:vmap / U // 用/ 代替U 轉換大寫 同樣如果需要持久化需要把命令寫入.vimrc
:imap <c-d> <Esc>ddi //插入模式下的映射,這條命令代表ctrl + d 刪除一行並進入插入模式
:nmap 相當於map(vim 默認為normal模式)
8.2 非遞歸映射
任何時候都應該使用非遞歸映射
定義:
nnoremap/vnoremap/inoremap :定義非遞歸映射
inoremap jj <Esc>`^ // 定義非遞歸映射jj 代替esc ,同時回到編輯位置
9. Vim 插件
常見的插件管理器有: vim-plug, Vundle, Pathogen, Dein.Vim, volt
9.1 使用vim-plug 管理插件
1. vimrc 中添加以下腳手架代碼
call plug#begin('~/.vim/plugged')
需要安裝的插件// 示例: Plug 'mhinz/vim-startify'
call plug#end()
2. 安裝
命令模式下: PlugInstall vim-startify
9.2 目錄管理插件nerdtree
git地址: https://github.com/scrooloose/nerdtree
設置快捷鍵映射:
nnoremap <leader>v : NERDTreeFind<cr> 定位文件位置並切換到目錄樹中所在位置 如:,v
nnoremap <leader>g : NERDTreeFind<cr> 打開目錄樹 如:,g
ctrl + w + p 快速切換上一個window
注:所有對window的操作,這個同樣適用
9.3 文件模糊搜索工具ctrlp
git 地址: https://github.com/ctrlpvim/ctrlp.vim
快捷鍵映射:
let g:ctrlp_map = '<c-p>'// 進入vim 直接ctrl + p 就可以搜索文件
配合nerdtree 工具可以實現工作目錄快速定位 //,v
使用: ctrl + j 向下移動
使用: ctrl + k 向上移動
9.4 使用easymotion 快速定位字符位置
git 地址: https://github.com/easymotion/vim-easymotion
配置: nmap ss <Plug>(easymotion-s2)
使用:
1. 在normal 模式下 使用綁定的ss 快捷鍵激活插件
2. 然后搜索至多兩個字符 這時會出現高亮提示
3. 選擇字母提示的高亮位置輸入該字母
9.5 使用vim-surround 來改變成對出現的字符
git 地址: https://github.com/tpope/vim-surround
ds (iw) + keyword // 刪除字符 比如: 刪除字符雙引號 ds + iw + "
cs (iw) + keyword // 改變字符 比如 改變()為[] cs + iw + ] 之所以用]不用[ 避免出現空格
ys (iw) + keyword // 增加字符 比如: 增加雙引號 ys + iw + "
9.6 使用fzf.vim 來進行模糊查找
git 地址: https://github.com/junegunn/fzf.vim
Ag[pattern] : 模糊搜索字符串
Files[PATh] : 模糊搜索目錄
示例:
搜索文件: :Files . // 列出當前目錄所有文件
:Files ./test.py 直接定位到文件 按Esc退出命令模式
搜索字符串: :Ag char
移動: 使用ctrl + j 和 ctrl + k
9.7 使用far.vim 快速搜索替換字符串
git 地址: https://github.com/brooth/far.vim
使用方法:
:Far char1 char2 **/*.py // char1 是要被替換的字符串,char2 替換的字符串 **代表上層目錄,*.py 該目錄下所有的py文件,也可以指定具體的文件名如: cut.py,或者使用*表示所有的文件
:Fardo 如果檢車沒有問題直接Fardo 執行命令就替換完成
9.8 使用 go-vim插件
git 地址: https://github.com/fatih/vim-go
1. ctrl + x + o // 全能補全
2. ctrl + n / p //選擇下一個或者上一個
3. ctrl + ] // 跳轉到引用函數/方法/結構體..定義
4. ctrl + o // 跳轉回來
5. ctrl + i // 向前跳
6. :GoFmt // 格式化代碼
7. :ReName // 代碼重構,Enter后光標指向的單詞即可重命名
8. :GoImports // 自動導包
9. :w //保存后代碼自動格式化
10.:GoRun // 運行代碼
9.9 使用python-mode
git 地址: https://github.com/python-mode/python-mode
9.10 使用tarbar 快速查看代碼大綱
git 地址: https://github.com/majutsushi/tagbar
使用:
TagbarToggle // 調出代碼大綱,再次操作則關閉 定義快捷鍵<leader>t來代替TagbarToggle
9.11 vim-commentary 快速注釋
git 地址: https://github.com/tpope/vim-commentary
命令:
普通模式:
gcc : 注釋
gcgc: 取消注釋
可視模式:
gc: 注釋和取消
10. tmux 使用
10.1 基本開啟退出命令
1. 開啟會話: tmux new -s test
2. 結束所有會話: tmux kill-server
3. 關閉指定會話: tmux kill-session -t test
4. 重新恢復會話(掛起狀態): tmux attach
10.2 常用命令
系統操作:
d | 脫離當前會話;這樣可以暫時返回Shell界面,輸入tmux attach能夠重新進入之前的會話 |
---|---|
D | 選擇要脫離的會話;在同時開啟了多個會話時使用 |
? | 列出所有快捷鍵, 按q退出 |
ctrl + z | 掛起當前會話 |
r | 強制重繪未脫離的會話(reload) |
s | 選擇並切換會話在多會話時使用 |
: | 進入命令模式 |
[ | 進入復制模式 |
] | 粘貼 |
~ | 列出提示信息緩存;其中包含了之前tmux返回的各種提示信息 |
窗口操作:
c | 創建新的窗口 |
---|---|
p | 切換到上一窗口 |
n | 切換到下一窗口 |
l | 在前后兩個窗口切換 |
w | 通過窗口列表切換 |
, | 重命名窗口 |
. | 修改當前窗口編號,相當於對窗口排序 |
f | 在窗口中查找指定文本,匹配的窗口將會出現在列表中,便於窗口切換 |
& | 關閉當前窗口 |
數字鍵 | 切換到指定窗口 |
面板操作:
" | 上下分屏 |
---|---|
% | 左右分屏 |
x | 關閉當前面板 |
! | 將當前面板置於新窗口;即新建一個窗口,其中僅包含當前面板 |
Ctrl+方向鍵 | 以1個單元格為單位移動邊緣以調整當前面板大小 |
Alt+方向鍵 | 以5個單元格為單位移動邊緣以調整當前面板大小 |
Space | 在預置的面板布局中循環切換;依次包括even-horizontal、even-vertical、main-horizontal、main-vertical、tiled |
q | 顯示面板編號 |
O | 在當前窗口中選擇下一面板 |
方向鍵 | 移動光標以選擇面板 |
{ | 向前置換當前面板 |
} | 向后置換當前面板 |
Alt+o | 逆時針旋轉當前窗口的面板 |
Ctrl+o | 順時針旋轉當前窗口的面板 |
10.3 復制模式常用命令:
vi emacs 功能
^ M-m 反縮進
Escape C-g 清除選定內容
Enter M-w 復制選定內容
j Down 光標下移
h Left 光標左移
l Right 光標右移
L 光標移到尾行
M M-r 光標移到中間行
H M-R 光標移到首行
k Up 光標上移
d C-u 刪除整行
D C-k 刪除到行末
$ C-e 移到行尾
: g 前往指定行
C-d M-Down 向下滾動半屏
C-u M-Up 向上滾動半屏
C-f Page down 下一頁
w M-f 下一個詞
p C-y 粘貼
C-b Page up 上一頁
b M-b 上一個詞
q Escape 退出
C-Down or J C-Down 向下翻
C-Up or K C-Up 向下翻
n n 繼續搜索
? C-r 向前搜索
/ C-s 向后搜索
0 C-a 移到行首
Space C-Space 開始選中
C-t 字符調序
10.4 常用配置:
# 設置ctrl + x 為命令前綴
2 set -g prefix C-x
3 set -g default-terminal "screen-256color"
4 set -g display-time 3000
5 set -g history-limit 65535
6 # 取消 ctrl + c 命令前綴
7 unbind C-b
8 # 增加r 為重加載按鍵
9 bind r source-file ~/.tmux.conf \; display "Reloaded!"
10 # 結束當前會話z相當於 kill session
11 bind-key z kill-session
12 # 按鍵映射
13 #up
14 bind-key k select-pane -U
15 #down
16 bind-key j select-pane -D
17 #left
18 bind-key h select-pane -L
19 #right
20 bind-key l select-pane -R
21 # 分割窗口快捷鍵
22 unbind '"'
23 bind - splitw -v #分割成上下兩個窗口
24 unbind %
25 bind | splitw -h #分割成左右兩個窗口
26 set-window-option -g mode-keys vi