Vim

 ·  ☕ 12  · 👀...

介绍

技术 特性 适用场景 说明
Vim - 官网
- VimAwesome
- vimcolors
- VimGolf
- https://github.com/kaochenlong/cch

安装

1
> brew install vim
1
> yum -y install vim
1
> apt-get install vim

图文教程

vi-vim-tutorial-1.gi
vi-vim-tutorial-2.gif
vi-vim-tutorial-3.gif
vi-vim-tutorial-4.gif
vi-vim-tutorial-5.gif
vi-vim-tutorial-6.gif
vi-vim-tutorial-7.gif
vim_cheat_sheet_for_programmers_bnw.png
vim_cheat_sheet_for_programmers_colorblind.png
vim_cheat_sheet_for_programmers_print.png
vim_cheat_sheet_for_programmers_screen.png

基础使用

在Vim里移动游标

说明
Ctrl+z 把Vim放到背景
fg 把背景的工作捡回来
h
j
k
l

visual模式

  • v 字符选择
  • V 行选
  • Ctrl+v 块选
  • viw 选择单词
  • vi” 选择双引号之间的内容
  • ctra+a 数字递增,可以在块选一列以后,对数组进行递增赋值
  • Ctrl+x 数字递减

不借助插件注释多行

选择多行,I 给第一行加注释,Esc。

移动游标

说明
gg 移到整份文件的第一行
G 移到整份文件的最后一行
{ 移到上一个段落
} 移到下一个段落
0 移到行首
$ 移到行尾
gk 往上一行
gj 往下一行
b/B 往回退一个字(Word)
w/W 往前进一个字(Word)
e/E 移动到单词的尾部
Ctrl+u 向上滚动
Ctrl+d 向下滚动
Ctrl+b 上翻页
Ctrl+f 下翻页
b 让光标回退到单词开头的位置

行移动

:m+ 当前行往下移动一行
:m-2 当前行往上移动一行

缩进

NORMAL模式

     当前行增加缩进

« 当前行减少缩进
:m,n> 第m行到第n行向右缩进
:m,n< 第m行到第n行向左缩进

VISUAL模式

      向右缩进

6> 向右缩进6次

INSERT模式

CTRL+SHIFT+T 当前行增加缩进
CTRL+SHIFT+D 当前行减少缩进

在文件里搜寻文字

说明
/ 搜寻
:set hlsearch 设定搜寻 highlight 效果
n 搜寻下一个
N 搜寻上一个
搜寻(反向)
* 搜寻目前游标的这个字
# 搜寻目前游标的这个字(反向)
fx 往后搜寻同一行最近的 x
tx 往后搜寻统一行最近的 x前面
Fx 往前搜寻同一行最近的 x
zz 让某一行停在画面中间
zt 让某一行停在上方
zb 让某一行停在下方

选取、复制、粘贴

说明
3yy 复制游标所在的以下3行
y$ 复制游标处到行尾
yG 复制游标处到最后一行
p 在游标处粘贴文字,如果是复制一整行,则在下面粘贴一整行
P 在游标前粘贴文字,如果是复制一整行,则在下面粘贴一整行
u 回到上一步
Ctrl+r 重做(Redo)
“ay 把内容存到a暂存器
“by 把内容存到b暂存器
“ap 贴上 a 暂存器的内容
“bp 贴上 b 暂存器的内容
:reg 检视目前所有暂存器内容,Vim有48个暂存器
:set clipboard=unnamed 暂存器和剪贴板互通

编辑文字

说明
I 跳到首行并进入 insert 模式
A 跳到行尾并进入 insert 模式
O 在游标上方插入一行并进入 insert 模式
x 删除游标所在文字(会把删除的内容放到暂存器)
X 删除光标前的字符(会把删除的内容放到暂存器)
d 删除选取内容(会把删除的内容放到暂存器)
dw 删除到下一个单词开头
bdw 让光标回退到单词开头的位置,然后再删除这个单词
de 删除到本单词末尾
dE 删除到本单词末尾包括表单在内
db 删除到前一个单词
dB 删除到前一个单词包括标点在内
dd 删除游标所在的那一行(会把删除的内容放到暂存器)
d0 删除光标位置到本行开头
d$ 删除光标位置到本行结尾
dgg 删除游标以上所有内容(会把删除的内容放到暂存器)
dG 删除游标以下所有内容(会把删除的内容放到暂存器)
ggdG 删除全部内容
c 删除选取内容并进入 insert 模式(会把删除的内容放到暂存器)
C 删除游标后的内容并进入 insert 模式(会把删除的内容放到暂存器)
r 取代游标所在单个字符
cw newword 游标部分替换为newword
ce 改变一个单次直到一个单词的末尾
c$ 删除至行尾
» 增加缩排
« 减少缩排
= 对选取内容排版

Vim 编辑多个档案

说明
:e FILENAME 开启档案
:tabe 开新分页
gt 跳到下一个分页
gT 跳到前一个分页
:new 新增水平分割视窗
:vnew 新增垂直分割视窗
Ctrl + w + hjkl 移动游标到指定视窗
Ctrl + w 循环移动游标到指定视窗
vim -o 用水平分割视窗开启档案
vim -O 用垂直分割视窗开启档案
vim -p 用分页视窗开启档案
:ls 列出所有Buffer
:b3 切换到第三个Buffer
:b FILENAME 切换到符合档名的Buffer
Ctrl+^ 切换到前一个Buffer
:bn 切换到下一个Buffer
:bp 切换到上一个Buffer
:bd 关闭Buffer
:tab ba 把全部的Buffer展开成Tab

Vim 更多选取方式

说明
v 切换到 Vislal Line 模式
Ctrl+v 切换到 Visual Block 模式
viw 选取一个 Word(i=inner,w=Word)
vi” 选取双引号里的内容
va” 选取双引号以及里面的内容(a=around)
vit 选取 tag 里的内容(i=inner,t=tag)
vat 选取 tag 以及里的内容(a=around,t=tag)
v{ 选取上一段
v} 选取下一段
v换成d或c d=delete,c=change

给多行文本加注释

v 进入Visual模式
选中要加注释的行
I 进入插入模式
输入 //
Esc 退出visual模式

Vim Text Object

名词

w=word, //单词
s=sentence, //句子
p=paragraph, //段落
t=tag, 单引号、双引号、小括号、中括号、大括号

动词

y=yank, // 复制
p=paste, // 粘贴
d=delete, // 删除
c=change, // 修改

范围

i=inner,
a=a or around,

量词

就是数字

组合演示

说明
viw 选取一个 word
d3w 删除3个 words
3yy 复制3行
5p 粘贴5次

其它实用的小技巧

说明
^ 移动到行首,不包括缩进部分。0也可以移动到行首,但是包含缩进。
13G 直接跳到第13行
:set number 设定行号
:set nonumber 取消设定行号
Ctrl+f 下翻一页
Ctrl+b 上翻一页
zf 把选取的内容折叠起来
zd 把折叠的内容解开
zfip 把整个段落折叠起来
~ 大小写互换
. 重做最后做的动作
J 把多行拼成一行
Ctrl + w 删除一个word,只能在insert模式下用
Ctrl + u 删除游标前面的内容,在终端机也适用
:! 指令名称 执行外部程序,执行完成以后再回到vim
:! 指令名称 执行外部程序,并粘贴程序执行结果
vimtutor 30分钟的vim教学,含各种语言版
:h 或: help 查看使用手册

查找

\c    大小写不敏感查找
\C    大小写敏感查找

替换

:{作用范围}s/{目标}/{替换}/{替换标志}
##### 当前行
:s/foo/bar/g
##### 全文
:%s/foo/bar/g
##### 选区
:'<,'>s/foo/bar/g
##### 当前行.与接下来两行+2
:.,+2s/foo/bar/g

Vim 设定档

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
" 注释 

" 显示
"设定行号           
set number              
"设定剪切板共享
set clipboard=unnamed   
"设定游标所在处有底线效果
set cursorline         
" 显示游标的行号、列号
set ruler 
" 在比较适当的地方换行
set linebreak
" 设定当有3行的时候就开始滚动
set scrollof=3
" 显示平时看不到的空格、换行、tab等等(不推荐)
set list
" 设定如果文字太多的话自动折行
set wrap
"禁用swap档
set noswapfile      
" 设定在左下角显示现在模式
set showmode


" 搜索
" 搜索高亮
set hlsearch            
" 忽略大小写         
set ignorecase   
" 只要部分关键字就有搜寻效果 
set incasearch    
" 比较聪明的搜寻(如果要搜索的关键词包含大写字母,它会无视忽略大小写的规定)
set smartcase

" 缩排
" 使用2个space取代tab
set softtabstop=2
" 在 > 的时候用2个空格为缩排
set shiftwidth=2
" 使用 space 取代 tab
set expandtab

" 页签
"永远显示页签
set showtabline=2
"新页签在下面显示       
set splitbelow    
"新页签在右面显示      
set splitright 
  
" 语法高亮
syntax on
" 颜色主题
colorscheme darkblue

" filetype
filetype on
filetype indent on
filetype plugin on

指令:

1
2
3
4
5
" 载入当前设定档
:source %     

" 重新设定文件里的tab
:retab
1
2
# 查看vimfiles规划
$ :h vimfiles

Vim Key Map

命令 Normal Mode Visual Mode Insert Mode
map v v
nmap v
vmap v
imap v
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#### 语法
map 映射前的键 映射后的键
#### 示例
vmap <C-c> y 
nmap <C-v> p
nmap <Tab> >>
vmap <Tab> >>
vmap <S-Tab> <
imap jj <Esc>
nmap <Enter> o
#### 查询key设定
:map
#### 取消Ctrl+c的map 设定
##### unmap/nunmap/vunmap/iunmap
:vunmap <C-c> 
#### 清除所有的map设定
:mapclear
#### 屏蔽方向键
nmap <Up> <Nop>
nmap <Down> <Nop>
nmap <Left> <Nop>
nmap <Right> <Nop>
#### 查询键对应的编码
:h key-notation
notation	meaning		    equivalent	decimal value(s)	~
-----------------------------------------------------------------------
<Nul>		zero			CTRL-@	  0 (stored as 10) *<Nul>*
<BS>		backspace		CTRL-H	  8	*backspace*
<Tab>		tab			CTRL-I	  9	*tab* *Tab*
							*linefeed*
<NL>		linefeed		CTRL-J	 10 (used for <Nul>)
<FF>		formfeed		CTRL-L	 12	*formfeed*
<CR>		carriage return		CTRL-M	 13	*carriage-return*
<Return>	same as <CR>				*<Return>*
<Enter>		same as <CR>				*<Enter>*
<Esc>		escape			CTRL-[	 27	*escape* *<Esc>*
<Space>		space				 32	*space*
<lt>		less-than		<	 60	*<lt>*
<Bslash>	backslash		\	 92	*backslash* *<Bslash>*
<Bar>		vertical bar		|	124	*<Bar>*
<Del>		delete				127
<CSI>		command sequence intro  ALT-Esc 155	*<CSI>*
<xCSI>		CSI when typed in the GUI		*<xCSI>*

<EOL>		end-of-line (can be <CR>, <LF> or <CR><LF>,
		depends on system and 'fileformat')	*<EOL>*

<Up>		cursor-up			*cursor-up* *cursor_up*
<Down>		cursor-down			*cursor-down* *cursor_down*
<Left>		cursor-left			*cursor-left* *cursor_left*
<Right>		cursor-right			*cursor-right* *cursor_right*
<S-Up>		shift-cursor-up
<S-Down>	shift-cursor-down
<S-Left>	shift-cursor-left
<S-Right>	shift-cursor-right
<C-Left>	control-cursor-left
<C-Right>	control-cursor-right
<F1> - <F12>	function keys 1 to 12		*function_key* *function-key*
<S-F1> - <S-F12> shift-function keys 1 to 12	*<S-F1>*
<Help>		help key
<Undo>		undo key
<Insert>	insert key
<Home>		home				*home*
<End>		end				*end*
<PageUp>	page-up				*page_up* *page-up*
<PageDown>	page-down			*page_down* *page-down*
<kHome>		keypad home (upper left)	*keypad-home*
<kEnd>		keypad end (lower left)		*keypad-end*
<kPageUp>	keypad page-up (upper right)	*keypad-page-up*
<kPageDown>	keypad page-down (lower right)	*keypad-page-down*
<kPlus>		keypad +			*keypad-plus*
<kMinus>	keypad -			*keypad-minus*
<kMultiply>	keypad *			*keypad-multiply*
<kDivide>	keypad /			*keypad-divide*
<kEnter>	keypad Enter			*keypad-enter*
<kPoint>	keypad Decimal point		*keypad-point*
<k0> - <k9>	keypad 0 to 9			*keypad-0* *keypad-9*
<S-...>		shift-key			*shift* *<S-*
<C-...>		control-key			*control* *ctrl* *<C-*
<M-...>		alt-key or meta-key		*meta* *alt* *<M-*
<A-...>		same as <M-...>			*<A-*
<D-...>		command-key (Macintosh only)	*<D-*
<t_xx>		key with "xx" entry in termcap
-----------------------------------------------------------------------

指令

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
" 特殊键
:h key-notation
:help key-notation
:h autocmd-events
" Key Map设定档
:vunmap <C-c>
" 清除所有key map 设定档
:mapclear 
"unmap/nunmap/vunmap/iunmap
" 显示colorscheme 列表
:colorscheme Ctrl+d

Key Map设定档

1
2
" 把jj设定成Esc键(不推荐)
"imap jj <Esc>

编程

w                   移到下一个单词开头
b                   移到上一个单词结尾
0                   移到行头,带缩进
^                   移到行头,不包括缩进
$                   移到行尾
gg                  移动到首行
G                   移动到尾行
zz                  当前行居中
zt                  当前行顶头
zb                  当前行靠尾显示
ctrl+f              下翻页
ctrl+b              上翻页
vi{                 选中{}中的内容
%                   在括号之间进行跳转
*                   移动到下一个同样的单词
#                   移动到上一个同样的单词
f{                  移动到下一个{
[[/]]               移动到 class 
ctrl+]              转到定义
]m                  移动到下一个 method
[m                  移动到上一个 method
ctrl+o              跳回
ctrl+i              再继续跳回去,相当于ctrl+o的撤销
viw S"              快速给单词加双引号
ysiw"               快速给单词加双引号
ds"                 删掉两边的双引号
cs"'                将双引号改为单引号

基于easymotion
<leader><leader>w  高亮显示要跳转的关键词
ctrl+n / ctrl+p     自动补齐

书签

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
mm                          添加/删除书签(当前行)
mi                          添加/编辑/删除当前行注释书签
mn                          跳转到当前 buffer 的下一个书签
mp                          跳转到当前 buffer 的前一个书签              
ma                          在 quickfix 窗口中列出所有书签(toggle)
mc                          清除当前 buffer 内的所有书签
mx                          清除所有 buffer 内的书签
m{bookmark-name}            创建书签
`{bookmark-name}            移动到书签的确切位置
'{bookmark-name}            移动到书签行的开头
:marks                      列出所有书签
:delmarks {bookmark-name}   删除书签

注意:
{char}如果是小写,只在当前buffer中有效。
{char}如果是大写,则在所有buffer中都有效。

Markdown编辑

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
[[    "跳转上一个标题
]]    "跳转下一个标题
]h    "跳转到当前文本所属的header,默认是]c,因为跟vim-gitgutter冲突,所以所以修改
]u    "跳转到父标题
zr    "打开下一级折叠
zR    "打开所有折叠
zm    "折叠当前段落
zM    "折叠所有段落
:Toc  "显示目录
gx    "在浏览器中打开光标所在处的链接
ge    "在Vim 中打开光标下的链接指向的文件。主要用于打开使用相对位置标识的 markdown 文件

插件

美化

Plugin 说明
mhinz/vim-startify 修改启动界面
vim-colorschemes 自动管理主题
vim-airline 状态栏美化
Yggdroot/indentLine 增加代码缩进线条
itchyny/vim-cursorword 给当前光标下的单词增加下划线

vim增强

Plugin 说明
vim-plug vim 插件管理工具
smartim 智能切换输入法(Mac Only)
daipeihust/im-select 终端切换输入法
vim-xkbswitch inster模式自动切换输入法
project 提供组织项目文件的功能,扫描项目目录下的各个子目录和文件,并把这种结构以一种树状的形式展现,方便用户直接在项目中切换和打开不同的文件
nerdtree 出现左边的资源管理器视窗。
:NERDTreeToggle 显示/隐藏
m: 管理
I:显示/取消显示 隐藏文件及文件夹
u/..:往上一层
C: 进入文件夹
vim-devicons 资源管理器图标
nerdtree-git-plugin 和 NERDTree 搭配使用的显示 Git 状态的 Vim 插件 – nerdtree-git-plugin
MattesGroeger/vim-bookmarks 书签插件
ma:显示所有书签列表
ctrlp.vim 模糊搜索文件,但是不支持中文搜索
LeaderF 搜索插件。
junegunn/fzf.vim 搜索插件。
vim-clap 搜索插件
defx 文件管理器
vim-auto-save 自动保存
vim-markdown 其提供了针对Markdown的语法高亮,段落折叠,查看目录,段间跳转等功能
vim-table-mode markdown表格
vimium Chrome 浏览器插件
image.vim 图片预览
undotree 内容变更历史

开发

Plugin 说明
lfv89/vim-interestingwords 可以使用不同颜色同时高亮多个单词,浏览或者给别人讲解代码的时候比较有用,最多允许8个单词高亮
k:高亮单词
n/N:单词跳转
K:取消所有高亮
emmet-vim 能大幅度提高前端开发效率的一个工具
vim-surround 用于高效操作与括号、引号或html、xml标签相关的配对符号,例如:
S”/ysiw”:被选中内容加双引号
ds”:删掉两边的双引号
cs”':将双引号修改为单引号
tcomment_vim 这是一个快速注释的插件,有自动识别文件类型(甚至是嵌套的类型) 等的功能
按两次Ctrl+/进行注释
preservim/nerdcommenter 快速代码注释
快捷键:cc:注释
ci:取消注释
3ci:注释3行代码
tabular 手动代码对齐
vim-autoformat 自动格式化
google/yapf 对当前文件进行格式化
ale 异步静态代码检测,syntasic替代品
vim-repeat 按点号(.)支持重复上一个动作
vim-snipmate snippets管理
SirVer/ultisnips 代码段管理
coc-snippets snippets补全
tagbar 在vim界面一侧显示文件的标签的插件,类似于taglist,比如文件的类、结构体、函数、变量等。
ack.vim 项目代码搜索
rainbow 彩虹色的括号
vim-easy-align 对齐文本
ga=: 对齐块选文本
iamcco/markdown-preview.vim Markdown实时预览
coc.nvim 代码提示插件
YouCompleteMe 代码补全
easymotion/vim-easymotion 快速移动插件
快捷键:w/s/gE
tpope/vim-fugitive 在 vim 里使用 git 命令
airblade/vim-gitgutter vim 里显示文件变动
junegunn/gv.vim git commit 浏览器
命令 :GV
gitv git log 浏览
vim-choosewin 窗口选择,使用 - 触发
BufOnly.vim 关闭除了当前 buffer 之外的其他 buffer。
:BufOnly
vim-vsnip 在vim中集成vscode的snippets
convert-snippets UltiSnips ↔︎ VsCode (json) snippets converter
vim2vsc Converts Vim snippets to Visual Studio code snippets
when-changed 当文件发生变化时执行命令,不是插件。
godef 实现在代码中的跳转,从函数调用的地方,直接跳转到函数的定义。默认的命令是:gd
gocode 实现Golang的代码自动补全
jedi-vim Python语言自动补齐
vim-autopep8 Python代码自动格式化,在Vim命令行模式下执行 :Autopep8 命令便可使用vim-autopep8插件对当前Python文件中的代码进行基于PEP8规范的格式化操作。
vim-flake8 Python语法检测插件,Vim 普通模式下按 F7 便可以直接启动 flake8 对当前文件进行语法和格式检查。

插件使用

jedi-vim

默认设置下,插入模式下按 会触发jedi-vim的自动补齐,输入 . 时也会自动触发自动补齐提醒。

可以使用 let g:jedi#completions_command = “” 设置 (同时按下Ctrl和n键) 组合键用于触发jedi-vim的自动补齐功能。

除此之外,jedi-vim插件常用的功能还包括:

  • Goto assignments: g (typical goto function)
  • 跳转到定义: d
    -m 显示Python文档(Pydoc): K
  • 重命名:r
  • 展示某个变量的使用方法:n (shows all the usages of a name)
  • 打开某个模块::Pyimport os (打开 os 模块)

vim-flake8

如果不希望使用 F7 来启动 flake8 进行 Python 语法和格式检查,可以通过vim的按键映射功能设置为其他快键键。例如,如果希望使用 F3 来触发 flake8 检测,可以在 Vim 配置文件 ~/.vimrc 中增加以下配置:
autocmd FileType python map :call flake8#Flake8()

vim-autopep8

autocmd FileType python noremap :call Autopep8()

Leaderf

在vim中默认是\键。

说明
f 模糊查找快捷键,并执行该快捷键
f e 模糊搜索寄存器
f h 模糊搜索 history/yank
f j 模糊搜索 jump, change
f l 模糊搜索 location list
f m 模糊搜索 output messages
f o 模糊搜索函数列表
f q 模糊搜索 quickfix list
f r 重置上次搜索窗口

coc.vim

安装
1
2
3
4
5
6
7
8
" Use release branch (Recommend)
Plug 'neoclide/coc.nvim', {'branch': 'release'}

" Or latest tag
Plug 'neoclide/coc.nvim', {'tag': '*', 'branch': 'release'}

" Or build from source code by use yarn: https://yarnpkg.com
Plug 'neoclide/coc.nvim', {'do': 'yarn install --frozen-lockfile'}
安装扩展
1
:CocInstall coc-snippets

参考


Wanglibing
Wanglibing
Engineer,Lifelong learner