自己一直在用 vim,很早之前想把自己的 vim 相关的东西整理下,由于最近也在使用 neovim,因此也会说说它。
安装 Vim
- 安装 Homebrew
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
- 安装 Vim
brew install vim
常用插件
Vim-Plug
之前一直在使用 Vundle 作为 Vim 插件 管理器。最近开看别人 blog 说是 vim-plug 比 vundle 更快,因此就试用了一下发现真的不错。 vim-plug 与 neovim 配合的更好,并且,最重要的是,vim-plug 安装插件是并行的。同时,有报道说,vundle 的创始人,主要开发者已经放弃了该项目。
官方图片:
安装
对于 传统 vim 用户:
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
对于 Neovim 用户:
curl -fLo ~/.config/nvim/autoload/plug.vim --create-dirs \
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
使用
我们以安装 tagbar 插件为例子,说明一下 vim-plug 的使用方法:
在 .vimrc 中最开始的地方添加如下的内容:
call plug#begin('~/.vim/plugged')
Plug 'majutsushi/tagbar'
call plug#end()
在 .config.nvim/init.vim 中最开始的地方添加如下的内容:
call plug#begin('~/.config/nvim/plugged')
Plug 'majutsushi/tagbar'
call plug#end()
不过我自己的做法时,把所有的插件放到一个文件里面,比如过 bundles.vim, 然后在 .vimrc 或者 .confg/nvim/init.vim 中加载, 下面以 vim 为例:
- bundles.vim 文件:
call plug#begin('~/.vim/plugged') Plug 'majutsushi/tagbar' call plug#end()
- .vimrc 文件:
" 加载要装的插件 source $HOME/.vim/bundles.vim # 以下是插件的配置....
打开你的 vim 或者 nvim,执行如下命令:
:PlugInstall
等待安装完成,重启 vim 或 neovim 即可
Tagbar
官方的图片:
插件作用
显示函数列表, 变量等
基本操作
按键 作用 tb 打开 tagbar
显示的含义:
- 显示标签类型。名字空间、类、函数等等;
- 显示完整函数原型;
- 图形化显示共有成员(+)、私有成员(-)、保护成员(#)
YoucCompleteMe
官方图片:
我认为最 NB 的补全插件,没有之一
插件作用
补全, 各种不全
基本操作
上下左右键的行为 会显示其他信息:
YCM
快捷键:
按键 作用 yfcd force recomile with syntastic lo open locationlist lc close locationlist jd 跳转到定义处 je 只能是#include 或已打开的文件 jr YcmDiag jh YcmCompleter GoToInclude jd YcmCompleter GoTo jl YcmCompleter GoToDeclaration jf YcmCompleter GoToDefinition “只能是#include 或已打开的文件 jx YcmCompleter FixIt jp YcmCompleter GetParent jt YcmCompleter GetType jo YcmCompleter GetDoc
Syntastic
官方图片:
图片很清楚的介绍了插件功能:
- 用 location list 列出所有错误。
- 命令行窗口显示当前错误
- 错误标记,有警告和错误
- 鼠标悬停可以出现错误提示框
- 状态栏标记
配置
当然也可以做一些简单的配置,比如设置为每次打开 buffer 就执行语法检查,而不只是在保存时:
let g:syntastic_check_on_open = 1
如果想使用多个检查器,可以这样写:
let g:syntastic_php_checkers = [‘php’, ‘phpcs’, ‘phpmd’]
错误跳转
syntastic
使用 location list
来显示所有的错误,location list
和 quificfix
类似,包含了位置信息。
调起这个 location list
:Errors
或者 :lopen
使用:lne[xt]和:lp[revious]就可以在错误间跳转。当然,如果用的多,可以做个mapping,更多内容可以参考帮助文档:help syntastic.
目录树 NerdTree 相关
vim-nerdtree-tabs
插件作用
NERDTree and tabs together in Vim, painlessly
基本操作
按键 作用 n2t 打开 NerdTreeTabs
nerdtree
插件作用
显示文件列表
基本操作
按键 作用 nt 打开 NerdTree
- 切换工作台和目录
- ctrl + w + h : 光标 focus 左侧树形目录
- ctrl + w + l : 光标 focus 右侧文件显示窗口
- ctrl + w + w : 光标自动在左右侧窗口切换
- ctrl + w + r : 移动当前窗口的布局位置
- 以下的大部分快捷键都需要将光标置于目录上:
- o: 在已有窗口中打开文件、目录或书签,并跳到该窗口
- go : 打开选择的文件,但光标停留在目录上
- t : 在新的 tab 栏打开选中的节点或者书签
- T : 和 t 一样,但把光标置留在当前 tab 页
- i : 打开选中的文件在一个分割窗口,类似于用:sp 命令
- s : 打开选中的文件在一个垂直分割窗口,类似于使用:vs 命令
- gs : 和 s 一样,但把光标停留在目录上
- O : 遍历打开当前选中目录下的所有目录
- x : 关闭当前节点的父亲节点
- X : 循环关闭当前节点下所有的节点
- e : 编辑当前目录 (不常用)
- : 和 o 一样
- D : 删除当前书签
- P : 跳到根节点
- K : 跳到当前节点的最上方兄弟节点
- J : 跳到当前节点的最下方兄弟节点
- C : 改变树的根为当前选中目录
- u : 移动目录根节点到该目录下
- U : 和 u 一样
- r : 遍历刷新当前目录下的所有文件
- R : 遍历刷新当前根下的文件
- m : 显示目录菜单
- cd : 改变 CWD 为当前选中的目录
- CD : 改变根目录为 CWD
- f : 切换文件过滤是否使用
- F : 切换文件是否显示
- B : 切换书签表格是否显示
- q : 关闭目录窗口
- A : 放大(最大化/最小化)目录窗口
- ? : 切换快速帮助文档的显示隐藏
- 切换标签页
- :tabnew [++opt选项] [+cmd] 文件: 建立对指定文件新的tab
- :tabc: 关闭当前的 tab
- :tabo: 关闭所有其他的 tab
- :tabs: 查看所有打开的 tab
- :tabp: 前一个 tab
- :tabn: 后一个 tab
- 标准模式下:
- gT: 前一个 tab
- gt: 后一个 tab
- MacVim 还可以借助快捷键来完成 tab 的关闭、切换:
- cmd+w: 关闭当前的 tab
- cmd+{: 前一个 tab
- cmd+}: 后一个 tab
nerdcommenter
插件作用
Comment functions so powerful — no comment necessary.
基本操作
按键 作用 ca 切换注释方式,比如 C/C++ 的块注释* *和行注释// cc 注释当前行 cA 在当前行尾添加注释符,并进入 Insert 模式 cu 取消注释 cs 以”性感”的方式注释
nerdtree-git-plugin
插件作用
对 NERD Tree 的增强修改,增加了文件的 git 状态显示):
基本操作
- ✭ / * Untracked
- ✹ / ~ Modified in the working tree
- ✚ / + Staged in the index (Exclude Renamed status)
- ➜ / » Renamed
- ═ / = Unmerged
- ✖ / — Deleted (This indicator can’t be shown, as NERDTree doesn’t display deleted files. I have no prefect idea to solve this problem currently.)
- ✗ / × Dirty (Only for directory)
- ✔ / ø Clean (Only for directory)
As the same as GitGutter plugin default:
- ]c : Jump to next indicator
- [c : Jump to prev indicator
nerdtree-execute
插件作用
Plugin for NERDTree that provides an execute menu item, that executes system default application for file or directory
IndentGuides
看一下官方给的图片:
插件作用
显示对齐线
基本操作
按键 作用 i 开/关缩进可视化
ListToggle
插件作用
快速显示和关闭 Vim 的 locationlist 和 quickfix 窗口的插件
基本操作
按键 作用 lq locaiton list togglemap oq quickfix list togglemap
A.vim
插件作用
头文件和源文件切换
基本操作
按键 作用 ch sch 子窗口中显示 .cpp 或 .h
MultipleCursors
官网图片
- It’s great for quick refactoring*
Vim command sequence: 2Gfpcname
- Add a cursor to each line of your visual selection
- Vim command sequence: 2Gvipi”“,vipJ$r]Idays = [
- Do it backwards too! This is not just a replay of the above gif :)
- Vim command sequence: 2Gdf[$r,0f,v…c
- Add multiple cursors using regexes
To see what keystrokes are used for the above examples, see the wiki page.
插件作用
多光标
基本操作
” Default mapping
- let g:multi_cursor_next_key=‘’
- let g:multi_cursor_prev_key=‘’
- let g:multi_cursor_skip_key=‘’
- let g:multi_cursor_quit_key=‘’
GitGutter
**官方给的图片 **
插件作用
git diff
基本操作
按键 作用 ]c 下一个修改 [c 上一个修改 hp 显示 diff 差异
Gundo
**官方给的图片: **
插件作用
vim 撤销树
基本操作
- 当前位置以@标注,其他历史以 o 标注。
- 按 jk 上下移动,就可以在下面的窗口看到对应修改之前的改动。这个就是普通的 vim 窗口,所有的移动操作都是支持的,比如 G 到底部,C-U 上翻页等。
- 按 p 可以查看选中状态和当前状态的差异,按回车就会回到选中状态,按 P 更是可以一步步播放到选中状态
Signature
插件作用
书签
基本操作
书签设定
按键 作用 mx 设定/取消当前行名为 x 的标签; m, 自动设定下一个可用书签名,前面提说,独立书签名是不能重复的,在你已经有了多个独立书签,当想再设置书签时,需要记住已经设定的所有书签名,否则很可能会将已有的书签冲掉,这可不好,所以,vim-signature 为你提供了 m, 快捷键,自动帮你选定下一个可用独立书签名; mda 删除当前文件中所有独立书签。
书签罗列
按键 作用 ms 罗列出当前文件中所有书签,选中后回车可直接跳转
书签跳转
按键 作用 mn 按行号前后顺序,跳转至下个独立书签; mp 按行号前后顺序,跳转至前个独立书签。书签跳转方式很多,除了这里说的行号前后顺序,还可以基于书签名字母顺序跳转、分类书签同类跳转、分类书签不同类间跳转等等。
快捷键集合
按键 作用 mx Toggle mark ‘x’ and display it in the leftmost column dmx Remove mark ‘x’ where x is a-zA-Z m, Place the next available mark m. no mark on line, place the next available mark. Otherwise, remove (first) existing mark. m- Delete all marks from the current line m< Space > Delete all marks from the current buffer ]` Jump to next mark [` Jump to prev mark ]‘ Jump to start of next line containing a mark [’ Jump to start of prev line containing a mark `] Jump by alphabetical order to next mark `[ Jump by alphabetical order to prev mark ‘] Jump by alphabetical order to start of next line having a mark ’[ Jump by alphabetical order to start of prev line having a mark m/ Open location list and display marks from current buffer m[0–9] Toggle the corresponding marker !@#$%^&*() m Remove all markers of the same type ]- Jump to next line having a marker of the same type [- Jump to prev line having a marker of the same type ]= Jump to next line having a marker of any type [= Jump to prev line having a marker of any type m? Open location list and display markers from current buffer m< BS > Remove all markers
MRU
插件作用
显示最近打开文件
基本操作
按键 作用 fr 打开
CtrlP
官方图片:
插件作用
模糊查找: 快速查找文件、缓冲区、tag 的 Vim 插件,可以同时打开多个文件,创建文件和目录
基本操作
按键 作用 ff 打开模糊查找 fb 打开CtrlPBuffer fm 打开CtrlPMixed fr 打开CtrlPMixed
在 Vim 中按下
<leader>ff
打开 CtrlP 插件
ctrl-d
: 在路径搜索和文件名搜索之间切换ctrl-r
: 在字符串搜索和正则表达式搜索中切换ctrl-f
和ctrl-b
: forward 和 backward,搜索结果在不同搜索模式中切换ctrl-j
和ctrl-k
: 在结果中切换ctrl-n
和ctrl-p
: 在搜索历史中切换ctrl-t
: 在新 Tab 中打开选中的文件ctrl-v
: 在垂直分屏中打开选中的文件ctrl-s
: 在水平分屏中打开选中的文件ctrl-y
: 创建新的文件和目录ctrl-z
: 标记将要打开的文件ctrl-o
: 打开c-z
标记的文件
CtrlSF
官方图片:
- Search and Explore
- Edit Mode (with vim-multiple-cursors)
插件作用
An ack/ag/pt powered code search and view tool, like ack.vim or :vimgrep but together with more context, and let you edit in-place with powerful edit mode.
基本操作
快捷键:
nmap <C-F>f <Plug>CtrlSFPrompt
: 打开CtrlSF
的方便快捷方式vmap <C-F>f <Plug>CtrlSFVwordPath
: 打开选择的单词,等待其他的输入vmap <C-F>F <Plug>CtrlSFVwordExec
: 类似CtrlSFVwordPath
,只是直接执行nmap <C-F>n <Plug>CtrlSFCwordPath
: 查找光标下的wordnmap <C-F>p <Plug>CtrlSFPwordPath
: 类似于CtrlSFCwordPath
, 只是在要查询的word,添加word分界nnoremap <C-F>o :CtrlSFOpen<CR>
: 打开上次关闭的CtrlSF
窗口nnoremap <C-F>t :CtrlSFToggle<CR>
:CtrlSFOpen
的重量级,不使用同样的窗口,在新的搜索inoremap <C-F>t <Esc>:CtrlSFToggle<CR>
:nmap <C-F>l <Plug>CtrlSFQuickfixPrompt
: 类似CtrlSFPrompt
,只是打开QuickFix
vmap <C-F>l <Plug>CtrlSFQuickfixVwordPath
: 类似CtrlSFPrompt
,只是打开QuickFix
vmap <C-F>L <Plug>CtrlSFQuickfixVwordExec
: 类似CtrlSFPrompt
,只是打开QuickFix
在CtrlSF
窗口:
按键 作用 sf 打开 ctrlsf h j k l 浏览窗口,通过或者, 定位搜索的单词 k 打开文件 p 预览更多信息 q 退出 :CtrlSFOpen 意外关闭了窗口,重新打开
参数
CtrlSF
可以在搜索中使用参数,大部分参数和Ack/Ag
类似,但是不完全一样。下面是一些常用的参数:
-R
: 使用正则表达式-I
: 区分大小写-S
: 不区分大小写C
和-A
和-B
: 规定的上下文会被打印
UltiSnips
官方图片:
插件作用
模板补全
配置如下
"UltiSnips 的 tab 键与 YCM 冲突,重新设定 {
let g:UltiSnipsExpandTrigger="<leader><tab>"
let g:UltiSnipsJumpForwardTrigger="<leader><tab>"
let g:UltiSnipsJumpBackwardTrigger="<leader><s-tab>"
" If you want :UltiSnipsEdit to split your window.
let g:UltiSnipsEditSplit="vertical"
"}
基本操作
按键 作用 tab 触发补全, 正向遍历 s-tab 反向遍历
EasyMotion
官方图片:
插件作用
Vim motions on speed! http://www.vim.org/scripts/script.php?script_id=3526
基本操作
按键 作用 space+w 调用 easymotion
Surround
插件作用
很容易添加和修改配对符号, 处理成对包围的符号
基本操作
命令列表:
- Normal mode
- ds — delete a surrounding
- cs — change a surrounding
- ys — add a surrounding
- yS — add a surrounding and place the surrounded text on a new line + indent it
- yss — add a surrounding to the whole line
- ySs — add a surrounding to the whole line, place it on a new line + indent it
- ySS — same as ySs
- Visual mode
- s — in visual mode, add a surrounding
- S — in visual mode, add a surrounding but place text on new line + indent it
- Insert mode
- - in insert mode, add a surrounding
- - in insert mode, add a new line + surrounding + indent
- s — same as
- S — same as
使用例子
- 删除包围符号的命令是 ds ,后面加的字符表示要删除的符号
"Hello *world!" ds" Hello world!
- 替换包围符号的命令是 cs ,命令后跟两个参数,分别是被替换的符号和需要使用的符号
"Hello *world!" cs"' 'Hello world!'
- 添加包围符号的命令是 ys (ys 可以记为 you surround),命令后同样跟两个参数,第一个是一个 vim 动作(motion)或者是一个文本对象
Hello w*orld! ysiw) Hello (world)!
- 另外:yss 命令可以用于整行操作,忽略中间的空格。 yS 和 ySS 还能让包围内容单独一行并且加上缩进
- 添加包围符号还有个非常好用的方式:在可视模式 v 下,按下 S 后即可添加想要添加的包围符号了。
- 在包围符号为括时,输入左括号(或者{,则会留一个空格, 而右括号则不留空格
Hello w*orld! ysiw( Hello ( world )!
Fugitive
插件作用
vim-fugitive.vim 插件是由 Tim Pope 创建的 VIM 插件。该插件与命令行 git 工具相辅相成,可以无缝的插入到工作流程中。 在 VIM 的命令行中,%符号具有特殊的含义:他将扩展为当前文件的全路径。可以使用该命令来运行使用文件名作为参数的任意 git 命令,从而使得命令作用于当前的文件。但是 fugitive 也提供了一些便利的方法,其中的一些总结如下:
git fugitive action :Git add % :Gwrite Stage the current file to the index :Git checkout % :Gread Revert current file to last checked in version :Git rm % :Gremove Delete the current file and the corresponding Vim buffer :Git mv % :Gmove Rename the current file and the corresponding Vim buffer
基本使用
| git | fugitive| action
| — — — — — –| — — — -| — — — — — — — — — — — — — — — — — — — |
| :Git add % | :Gwrite | 对当前文件执行 git add 命令 |
| :Git checkout % | :Gread | 将当前文件反转至上次的 checkout 状态|
| :Git rm % | :Gremove| 从 Git 中删除该文件,并且 vim 中也删除该文件的 buffer|
| :Git mv % | :Gmove | 重命名当前的文件名以及对应的 buffer 名|
| :Git commit | :Gcommit| 提交,可以使用 ctrl+n 来补全|
| :Git blame | :Gblame | 查看当前文件每一行的最后一次修改都是谁完成的|
与索引有关的操作
:Gstatus
打开一个 git status 命令的窗口,在这个窗口中你可以使用如下的快捷键。Ctrl+n 和 Ctrl+p 可以在改变的文件中跳转
- add / reset file 支持使用 visual 模式多选。 **Enter> 在窗口中打开该文件 p 对当前文件运行 git add -patch 命令。C 执行 Gcommit 命令进行提交。
:Gdiff
比较两个文件的不同,两个文件分别显示在 vim 的两个 window 中。
这里需要注意的是,Gdiff 打开的两个窗口,左边的永远是缓冲区里的内容,右边的永远是当前正在编辑文件的内容。
:diffget 从另一个 diff 窗口中拉取当前光标所在的内容。
:diffput 将当前光标所在的修改过的内容 put 到另一个窗口中。
可以使用 visual 模式修改仅仅选择的几行内容。
使用 diff 解决冲突
打开冲突文件后使用 Gdiff 命令,可以看到三个窗口,其中中间的窗口是带冲突标记的文件,左边的是被并入的分支,也就是 target 分支,右边的是将要并入 target 的分支,即 merge 分支。
为了区别三个 buffer,fugitive 用//2 标记最左边的 buffer,用//3 标记最右边的窗口,而中间的窗口用其文件名标记。
之后如果我们要接受左边 buffer 的更改,只需要执行:diffget //2 就可以了。
如果要从左边提交到中间窗口则需要运行:diffput 文件名。
更改完成后,我们需要更新 buffer,可以使用:diffupdate。
关闭 target 和 merge 的 buffer 只需要运行:only 就可以了。
为了更加方便的使用:diffget 和:diffput,do 和 dp 作为 get 和 put 的缩写。
浏览 Git 的对象数据库
允许你浏览其他分支文件的当前状态。
加入我要浏览 feature 分支下的 config.json 文件的当前状态,可以执行如下:
:Gedit feature:config.json
之后可以继续执行:Gdiff 来看看修改在哪里。
Gedit 命令允许你查看任何 git 对象下的任何文件,对于 Git 来说有 4 中对象:
blobs - correspond to the content of a file
trees - correspond to a directory on the filesystem, representing a list of blobs and trees
commits - can reference a tree and one or more parent commits
tags - refer to a particular commit by name
Dash
插件作用
在 vim 中使用 Dash, 这个工具只有 mac 版本, Linux 和 Windows 用户可以使用这个开源版本 Zeal
基本操作
在命令行模式使用 :Dash 要查询的东西 就是打开 Dash 进行查询
vim-easy-align
插件作用
A simple, easy-to-use Vim alignment plugin
基本操作
按键 作用 ea EasyAlign
点(.)命令
这个命令就用来重复上一次的操作。比如:dw,再按.就会再删除一个单词。他可以重复的命令非常多,比如插入操作 a,i,比如替换删除操作 c,s, r 还有 J,~等常用的操作。 来看看使用场景吧。我说说我一般的用法:
按键 作用 ciw 替换文本,然后在另一个也需要替换相同文本的单词处按下.,就可以执行相同的替换操作。 dd, dw 然后按下.就会再次删除一句或一个单词。我觉得连续输入.比数几秒有几个或几行比打 3dw/3dd 要更自然和更快,当然你觉得 3dw 更快也很正常.
这两个是我用的最多的,每天必用。大家有其他好用的欢迎补充。
vim-repeat 和 vim-surround 一样,来自 tpope。 vim-repeat 做的事情很简单,重复一个插件操作,其中当然就支持 vim-surround 。这非常有用,比如给一个单词加了双引号,再按下.就可以也为另一个单词加上了。
- vim-repeat 还支持: > speeddating.vim abolish.vim unimpaired.vim commentary.vim
语言相关的插件
Golang的插件Vim-Go
插件作用
- Golang 语法高亮
- 自动保存执行
gofmt
或goimports
, 可定制 - 定义跳转
- 集成
gocde
补全 - 运行命令如:
go run
、go build
等等 - …
安装
vim-plug
:Plug 'fatih/vim-go'
Vundle
:Plugin 'fatih/vim-go'
基本操作
- 文本区域操作:
af
: “a function”, select contents from a function definition to the closing bracket.if
: “inside a function”, select contents of a function, excluding the function definition and the closing bracket.]]
: [count] forward to next function declaration. if your on a comment, it skips the function which the comment belongs and forwards to the next function declaration.[[
: [count] backward to previous function declaration.- 快捷键盘:
按键 作用 grun go-run gbuild go-build gtest go-test gocov go-coverage gds go-def-split gdv go-def-vertical gdt go-def-tab grename go-rename gim go-implements ginfo go-info gdoc go-doc gdocv go-doc-vertical
C/C++
ClangFormat
插件作用
使用 clang-format 格式化
C, C++, Obj-C, Java, JavaScript and TypeScrip
.
基本操作
按键 作用 cf 格式化 C 开启自动格式
Python
TODO…
HTML/CSS/JS
TODO…
自己定义的一些快捷键
加载 .vimrc
文件
按键 作用 ;rc
快速加载 .vimrc/init.vim
;ec
快速编辑 .vimrc/init.vim
环境恢复
按键 作用 ;ss
mksession! my.vim
;rs
source my.vim
其他
按键 作用 ;gc
复制至公共剪贴板 ;gp
从公共剪贴板粘贴 ;16
十六进制格式查看 ;r16
返回普通格式 ;rm
一键去除字符[全模式可用] ;rt
一键替换全部 Tab 为空格[全模式可用] ;th
一键生成与当前编辑文件同名的 HTML 文件 [不输出行号] ;C-l
清除并重绘屏幕 ;cS
常规模式下输入 cS 清除行空格 ;cM
常规模式下输入 cM 清除行M^ 符号
Vim 技巧
字符相关
按键 作用 guu 把一行的文字变成小写 gUU 把一行的文字变成大写
按 v 键进入选择模式,然后移动光标选择你要的文本,按 u 转小写,按 U 转大写
按键 作用 ga 查看光标处字符的 ascii 码 g8 查看光标处字符的 utf-8 编码 gf 打开光标处所指的文件 (这个命令在打到#include 头文件时挺好用的,当然,仅限于有路径的) 或者[#] 在当前文件中搜索当前光标的单词
缩进相关
按键 作用 >> 向右给它进当前行 = 缩进当前行 (和上面不一样的是,它会对齐缩进) = 把光标位置移到语句块的括号上,然后按=%,缩进整个语句块(%是括号匹配) G=gg 把光标位置移到语句块的括号上,然后按=%,缩进整个语句块(%是括号匹配)
复制和粘贴相关
按 v 键进入选择模式,然后按 h,j,k,l 移动光标,选择文本,然后按 y 进行复制,按 p 进行粘贴
按键 作用 dd 剪切一行(前面加个数字可以剪切 n 行),p粘贴 yy 复制一行(前面加个数字可以复制 n 行),p粘贴查看光标处字符的 utf-8 编码
光标移动相关
按键 作用 ctrl+o 向后回退你的光标移动 ctrl+i 向前追赶你的光标移动
代码折叠
按键 作用 za 打开或关闭当前折叠 zM 关闭所有折叠 zR 打开所有折叠