vim-learning
VIM 笔记
TODO
- 整理笔记结构
- 补充笔记内容
- 重构图片目录
VIM 基础操作
VIM 模式
Normal Mode
VIM 打开后默认的模式,用于光标的移动和文本的操作。
Normal Mode 下的光标行内快速移动
- w / W
word / WORD(以空格为分割符)
移动至下一个单词开头 - e / E
end of word / 以空格为分隔符
移动至下一个单词尾部 - b / B
backword / 以空格为分隔符
移动至上一个单词开头 - t / T
till / 向前搜索
光标后移直到找到指定的字母 - f / F
find / 向前搜索
查找指定的字母并将光标移至其上
Insert Mode
VIM 中写入文本的模式。
从 Normal Mode 进入 Insert Mode
- a
append
在光标后进入 Insert Mode - i
insert
在光标前进入 Insert Mode - o
open a line below
在光标下新增一行并进入插入模式 - A
append after line
在行末进入 Insert Mode - I
insert before line
在行首进入 Insert Mode - O
append a line above
在光标上新增一行并进入插入模式
Command Mode
末行模式
sp、vs
分屏编辑% s/str1/str2/[g]
文本[全局]替换;
visual Mode
Normal Mode 下v / V / ^v 进行可视化 (光标/整行选中/块)操作
Replace Mode
R 进入替换模式
VIM 使用技巧
VIM 快捷键 (Insert Mode)
1 | ctrl + j # 换行 |
- shell shortcut:
1 | ctrl+a ahead of command line |
行间搜索
1 | f find # 移动到字符上 ;/, 搜索下一个/上一个 |
快速增删改查(normal mode)
删除
1 | x # 快速删除一个字符 |
修改
1 | r # replace 替换一个字符 |
搜索
1 | / # 向前(front)搜索 |
vim搜索替换
substitude 命令允许我们查找并且替换掉文本,并且支持正则表达式
:[range]s[ubstitude]/{pattern}/{string}/{flag}
- range 表示范围 比如 :10,20 表示 10-20 行,% 表示全部文本
- pattern 是要替换的模式,string 是替换后的文本
- flag 替换标志位
- g(global) 全局范围内执行
- c(confirm) 替换前确认
- n(number) 仅报告匹配到的次数而不替换,可以用来查询匹配的次数
vim多文件操作
- buffer 是指打开的一个文件的内存缓冲区
- window 是 buffer 可视化的分割区域
- tab 可以组织 window 为一个工作区

Buffer
- VIM 打开一个文件后会加载文件内容到缓冲区
- 之后的修改都是针对内存中的缓冲群,并不会直接保存到文件
- 直到我们执行
:w的时候才会把修改内容写入到文件里 - buffer 切换
- 使用
:ls会列举当前缓冲区,使用:b n跳转到第 n 个缓冲区 :bpre:bnext:bfirst:blast:b buffer_name加上 tab 补全来跳转
- 使用
Window
窗口是可视化的分割区域
- 一个缓冲区可以分割为多个窗口,每个窗口也可以打开不同的缓冲区
<C-w> + s水平分割,<C-w> + v垂直分割。或者:sp和:vs- 每个窗口可以继续无限分割
<C-w> + p跳转到上一个窗口


Tab
Tab 是可以容纳一系列窗口的容器(:h tabpage)


vim的Text Object
1 | [number]<command>[text object] |
- number 表示次数,command 是命令,d(delete),c(change),y(yank)
- text object 是要操作的文本对象,比如单词 w,句子 s,段落 p
1 | iw # inner word |
vim下的复制粘贴和寄存器
normal mode:
1 | y # yank |
register:
VIM 不使用单一剪贴板进行剪贴、复制与粘贴,而是多组寄存器
- 通过
"{register}前缀可以指定寄存器,不指定则默认使用无名寄存器 "ayiw复制一个单词到寄存器 a 中,"bdd剪贴当前行到寄存器 b 中- VIM 中
""表示无名寄存器,缺省使用。""p<==>p
除了有名寄存器 a-z,VIM 中还有一些常见寄存器
- 复制专用寄存器
"0使用 y 复制文本同时会被拷贝到复制寄存器0中 - 系统剪贴板
"+ "%当前文件名,".上次插入的文本
1 | :e! 重新加载文件 ,且不保存 |
宏的录制和使用
Vim使用q键来录制,q键结束录制
使用 q{register} 选择要保存的寄存器,把录制的命令保存其中
使用 @{register} 回放寄存器中的保存的所有命令
代码补全

修改vim配色

vim常用命令
1 | :h option-list 命令查询 |
vim映射
vim映射就是把 一个操作 映射到 另一个操作
基本映射
所有模式下都生效
1 | map key default_key # 在所有模式下生效 |
非递归映射
映射不会递归解释映射的按键
1 | let mapleader = "," # set Leader Key |
Plugins
NERDtree
install vim plug and add this in ~/.vimrc
1 | Plug 'scrooloose/nerdtree' |
NERDtree基本操作
1 | ?: 快速帮助文档 |
ctrlp
模糊搜索当前目录下的文件
vim-easymotion
vim-easymotion
快速移动光标位置
~/.vimrc中加入如下递归映射
1 | nmap <Leader>s <Plug>(easymotion-s2) |
<Leader>s 后,输入要查找的两个字符,然后选择文本中出现的高亮字符来跳转到相应的位置
vim-surround
normal mode 下的增加、删除、修改成对的内容ds delete a surroundingcs change a surroundingys you add a surrounding
usage:ds"ds(cs"(cs[( change surrounding ‘[‘ to ‘(‘ysiw"ystg] you add a surrounding to ‘char’ ‘]’
also can use in vscode
commentary.vim
install:
Plug ‘tpope/vim-commentary’
usage:gcc comment/uncomment
vim-gitgutter
Plug ‘airblade/vim-gitgutter’
add set updatetime=100 in ~/.vimrc
Tumx
install Tmux:
1 | sudo apt-get install tmux |
uppercase or lowercase
1 | gu{motion} lowercase |
vim 的配置
多会话撤销历史
1 | 启用 undofile,开启撤销文件 |
当 undodir 不存在时,创建该目录。
1 | if !isdirectory(&undodir) |
鼠标的支持
1 | if has('mouse') |
- 当 VIM 以图形界面运行或终端兼容 xterm 且不是 Mac 时,启用完全的鼠标支持。鼠标在 VIM 中拖拽时,VIM 将使用可视模式选中对应的内容。当按下 Shift 键时,操作系统或终端接管鼠标事件,用户可以使用鼠标复制 VIM 窗口里的内容供其他应用程序使用。
- 否则(非图形界面的的终端,且终端类型不是 xterm),就只在正常模式(n)、可视模式(v)、插入模式(i)中使用鼠标。这意味着,当用户按下
:键进入命令行模式时,VIM 将不对鼠标进行响应,这时,用户就可以使用鼠标复制 VIM 窗口里的内容到其他应用程序里去了。
中文支持
1 | set fileencodings=ucs-bom,utf-8,gb18030,latin1 |
- 首先,检查文件是不是有 Unicode 的 BOM(字节顺序标记)字符,有的话按照 BOM 字符来转换文件内容。
- 其次,检查文件能不能当作 UTF-8 来解码;如果可以,就当作 UTF-8 来解释。
- 否则,尝试用 GB18030 来解码;如果能成功,就当作 GB18030 来转换文件内容。
- 最后,如果上面的解码都不成功,就按 Latin1 字符集来解码;由于这是单字节的编码,转换必定成功。
vim command
set
- set ft?
查询当前文件类型