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