Tom Shine
26 min readMar 14, 2017

自己一直在用 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 为例:

  1. bundles.vim 文件:
  • call plug#begin('~/.vim/plugged') Plug 'majutsushi/tagbar' call plug#end()
  1. .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 listquificfix 类似,包含了位置信息。
调起这个 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

  1. 切换工作台和目录
  • ctrl + w + h : 光标 focus 左侧树形目录
  • ctrl + w + l : 光标 focus 右侧文件显示窗口
  • ctrl + w + w : 光标自动在左右侧窗口切换
  • ctrl + w + r : 移动当前窗口的布局位置
  1. 以下的大部分快捷键都需要将光标置于目录上:
  • 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 : 放大(最大化/最小化)目录窗口
  • ? : 切换快速帮助文档的显示隐藏
  1. 切换标签页
  • :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

官网图片

  1. It’s great for quick refactoring*

Vim command sequence: 2Gfpcname

  1. Add a cursor to each line of your visual selection
  2. Vim command sequence: 2Gvipi”“,vipJ$r]Idays = [
  3. Do it backwards too! This is not just a replay of the above gif :)
  4. Vim command sequence: 2Gdf[$r,0f,v…c
  5. 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-fctrl-b : forward 和 backward,搜索结果在不同搜索模式中切换
  • ctrl-jctrl-k : 在结果中切换
  • ctrl-nctrl-p : 在搜索历史中切换
  • ctrl-t : 在新 Tab 中打开选中的文件
  • ctrl-v : 在垂直分屏中打开选中的文件
  • ctrl-s : 在水平分屏中打开选中的文件
  • ctrl-y : 创建新的文件和目录
  • ctrl-z : 标记将要打开的文件
  • ctrl-o : 打开c-z标记的文件

CtrlSF

官方图片:

  1. Search and Explore
  2. 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 : 查找光标下的word
  • nmap <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

插件作用

很容易添加和修改配对符号, 处理成对包围的符号

基本操作

命令列表:

  1. 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
  1. Visual mode
  • s — in visual mode, add a surrounding
  • S — in visual mode, add a surrounding but place text on new line + indent it
  1. Insert mode
  • - in insert mode, add a surrounding
  • - in insert mode, add a new line + surrounding + indent
  • s — same as
  • S — same as

使用例子

  1. 删除包围符号的命令是 ds ,后面加的字符表示要删除的符号
  • "Hello *world!" ds" Hello world!
  1. 替换包围符号的命令是 cs ,命令后跟两个参数,分别是被替换的符号和需要使用的符号
  • "Hello *world!" cs"' 'Hello world!'
  1. 添加包围符号的命令是 ys (ys 可以记为 you surround),命令后同样跟两个参数,第一个是一个 vim 动作(motion)或者是一个文本对象
  • Hello w*orld! ysiw) Hello (world)!
  1. 另外:yss 命令可以用于整行操作,忽略中间的空格。 ySySS 还能让包围内容单独一行并且加上缩进
  • 添加包围符号还有个非常好用的方式:在可视模式 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-repeatvim-surround 一样,来自 tpope。 vim-repeat 做的事情很简单,重复一个插件操作,其中当然就支持 vim-surround 。这非常有用,比如给一个单词加了双引号,再按下.就可以也为另一个单词加上了。

  • vim-repeat 还支持: > speeddating.vim abolish.vim unimpaired.vim commentary.vim

语言相关的插件

Golang的插件Vim-Go

插件作用

  • Golang 语法高亮
  • 自动保存执行 gofmtgoimports, 可定制
  • 定义跳转
  • 集成 gocde 补全
  • 运行命令如:go rungo 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 打开所有折叠

我的的 dotfiles 文件

  1. MacOS

重要网站

  1. Vim 官网
  2. http://vimawesome.com/