1129-玩转Vim 从放弃到爱不释手
- 第1章 玩转vim 从放弃到爱不释手
- 第2章 初识 Vim,想说爱你不容易
- 2-1 初识 Vim,想说爱你不容易 (11:50)
- 2-2 Vim,为什么你有这么多模式 (09:15)
- 2-3 Vim 插入模式小技巧 (08:08)
- 2-4 Vim 快速移动大法 (15:11)
- 2-5 Vim快速增删改查 (13:29)
- 2-6 Vim 如何搜索替换 (07:15)
- 2-7 Vim 多文件操作 (15:01)
- 2-8 什么是 Vim 的 text object (06:49)
- 2-9 Vim复制粘贴与寄存器的使用 (16:51)
- 2-10 Vim 如何用宏完成强大的批量操作 (10:23)
- 2-11 Vim 补全大法 (07:33)
- 2-12 给 Vim 换个配色 (06:32)
- 2-13 本章小结:裸 Vim 也很强 (02:37)
- 第3章 编写 Vim 配置,我的 Vim 我做主
- 第4章 Vim 安装和使用插件
- 4-1 Vim 安装插件,竟如此简单 (08:40)
- 4-2 如何寻找自己需要的插件 (06:42)
- 4-3 vim美化插件,让你的 vim 与众不同 (09:57)
- 4-4 Vim文件目录和搜索插件,跳转文件so easy (12:20)
- 4-5 Vim快速定位插件,文件位置任我行 (05:58)
- 4-6 Vim-surround,编辑也要成双成对 (05:27)
- 4-7 强大的Vim模糊搜索与替换插件 (08:26)
- 4-8 愉快写 golang 之vim-go插件 (10:19)
- 4-9 python-mode把 vim 打造成轻量 Python IDE (07:11)
- 4-10 Vim tagbar,更愉快地浏览代码 (11:14)
- 4-11 强大的 vim 代码补全插件 (07:16)
- 4-12 Vim代码格式化与静态检查 (09:43)
- 4-13 Vim快速注释代码 (03:06)
- 4-14 vim和git,强强联手 (07:11)
- 4-15 本章小结:授人以渔,寻找自己需要的插件 (02:29)
- 第5章 与时俱进的 Vim
- 第6章 Vim虐我千百遍,我待Vim如初恋~
- vim配置
https://www.imooc.com/learn/1129
简介:Vim作为一个强大的编辑器,是很多巨佬的不二之选,但因为其较高的入门学习门槛劝退了很多人。中文的系统教程少之又少,讲vim插件使用的更是屈指可数,本课程从vim最基础的操作和概念开始讲起,带领大家学会使用和配置 vim,安装强大的 vim 插件,真正掌握编辑器之神 vim 的使用。
目录
- 第1章 玩转vim 从放弃到爱不释手
- 第2章 初识 Vim,想说爱你不容易
- 2-1 初识 Vim,想说爱你不容易 (11:50)
- 2-2 Vim,为什么你有这么多模式 (09:15)
- 2-3 Vim 插入模式小技巧 (08:08)
- 2-4 Vim 快速移动大法 (15:11)
- 2-5 Vim快速增删改查 (13:29)
- 2-6 Vim 如何搜索替换 (07:15)
- 2-7 Vim 多文件操作 (15:01)
- 2-8 什么是 Vim 的 text object (06:49)
- 2-9 Vim复制粘贴与寄存器的使用 (16:51)
- 2-10 Vim 如何用宏完成强大的批量操作 (10:23)
- 2-11 Vim 补全大法 (07:33)
- 2-12 给 Vim 换个配色 (06:32)
- 2-13 本章小结:裸 Vim 也很强 (02:37)
- 第3章 编写 Vim 配置,我的 Vim 我做主
- 第4章 Vim 安装和使用插件
- 4-1 Vim 安装插件,竟如此简单 (08:40)
- 4-2 如何寻找自己需要的插件 (06:42)
- 4-3 vim美化插件,让你的 vim 与众不同 (09:57)
- 4-4 Vim文件目录和搜索插件,跳转文件so easy (12:20)
- 4-5 Vim快速定位插件,文件位置任我行 (05:58)
- 4-6 Vim-surround,编辑也要成双成对 (05:27)
- 4-7 强大的Vim模糊搜索与替换插件 (08:26)
- 4-8 愉快写 golang 之vim-go插件 (10:19)
- 4-9 python-mode把 vim 打造成轻量 Python IDE (07:11)
- 4-10 Vim tagbar,更愉快地浏览代码 (11:14)
- 4-11 强大的 vim 代码补全插件 (07:16)
- 4-12 Vim代码格式化与静态检查 (09:43)
- 4-13 Vim快速注释代码 (03:06)
- 4-14 vim和git,强强联手 (07:11)
- 4-15 本章小结:授人以渔,寻找自己需要的插件 (02:29)
- 第5章 与时俱进的 Vim
- 第6章 Vim虐我千百遍,我待Vim如初恋~
- vim配置
第1章 玩转vim 从放弃到爱不释手
课程导学
1-1 玩转vim 从放弃到爱不释手-课程导学 (09:43)
什么是Vim?
Linux下两大编辑神器之一:Vim
- Linux/Unix下使用最多的编辑器
- Vi的改进版
- 可能是最难上手的编辑器之一
为什么要学习Vim?
都21世纪了,为什么还要学习Vim?
- 只要你用服务器,Vim就是一个必备技能
- 后端和运维工程师必须掌握的编辑器,不然服务器上操作很尴尬
- 可以纯键盘⌨️编辑,提升编辑效率
痛点
Vim难上手,学习曲线陡
- Vim视频学习资料很少,网上很多博客讲解零散、不够直观
- 缺少系统的教程。Vim命令众多,难以学习和记忆
- Vim学习曲线比较陡,需要较长时间才能上手,劝退很多初学者
课程目的
帮你驯服Vim
- 了解和掌握Vim中的基本概念
- 熟悉Vim基本使用方法,能够做到日常编辑(纯键盘编辑)
- 知道如何自定义Vim,安装插件无限扩充Vim的功能
课程内容
如何学习Vim?Vim经常被诟病难易上手和使用
- Vim的概念和基本操作,比如移动和增删改查
- 如何配置Vim,编写自己的vimrc文件
- 如何安装和使用插件,无限扩充Vim的功能
受众
哪些人可以从本门课程受益呢?
- 运维工程师、后端工程师等
- Linux用户
- 对Vim感兴趣,想要提升开发效率的开发者,甚至普通用户
预备知识
不要求掌握Vim的基础知识,但最好使用Linux/Unix系统
- 熟悉基本的命令行操作(一般Vim多在Linux服务器上使用)
- 知道如何安装Vim
- 有其他编辑器使用经验。几乎所有流行IDE和编辑器都有Vim扩展
课程特色
学习Vim非一日之功,得靠肌肉记忆
- 由浅入深,循序渐进。从基本的概念和操作讲起
- 授人以🐟,同时授人以渔。学会了插件自己扩充Vim功能
- 大量实践技巧(所有演示均使用按键回显工具,让你看得更明白)
第2章 初识 Vim,想说爱你不容易
从基础的 Vim 操作讲起,学习 Vim 操作和涉及到的 Vim 概念。
2-1 初识 Vim,想说爱你不容易 (11:50)
下载与安装
作为开发者的你,安装Vim应该很简单
- Linux/Unix(Mac)自带Vim,直接终端里输入
vim
即可进入 - Windows用户可以下载安装Gvim等体验
- 建议Windows用户可以尝试使用虚拟机来体验Linux下的Vim
初识Vim
据说StackOverflow帮助过上百万开发者退出过Vim!
输入
vim
命令进入Vim~ VIM - Vi IMproved ~ ~ version 8.0.1283 ~ by Bram Moolenaar et al. ~ Vim is open source and freely distributable ~ ~ Become a registered Vim user! ~ type :help register<Enter> for information ~ ~ type :q<Enter> to exit ~ type :help<Enter> or <F1> for on-line help ~ type :help version8<Enter> for version info
进去之后似乎没法输入东西,起始默认进去是普通(normal)模式
使用
:q
可以退出Vim
开始编辑
进入编辑模式就可以像其他编辑器一样编辑了
使用
i
进入编辑模式,开始输入文字操作 说明 i
insert before character a
append after character o
open a line below I
insert before line A
append after line O
open a line above 使用
Esc
又可以回到普通(normal)模式。使用:wq
保存退出insert -> normal:
Esc
课后练习
用Vim靠的是肌肉记忆,赶紧自己操作练习一下吧
- 通过搜索引擎学习如何安装,并在你的操作系统中安装好Vim
- 进入Vim,使用
i
/a
/o
进入编辑(insert)模式输入文本 - 退回到默认的普通(normal)模式,保存并退出Vim
2-2 Vim,为什么你有这么多模式 (09:15)
“怪异的Vim模式”
Vim和其他很多编辑器的区别在于多种模式
进入Vim默认是普通(normal)模式?为什么不是编辑模式呢?
答:在日常开发中更多的是浏览代码,而不是编辑代码
使用
i
(insert)/a
(append)等进入编辑模式还有
:cmd
命令模式和v
(visual)可视化模式
- 为什么进入Vim不能插入—普通(Normal)模式
奇怪的是,为什么Vim进入之后不能像其他编辑器一样直接插入?
- 进入Vim默认是普通(normal)模式。使用
Esc
从插入模式回到普通模式 - 普通模式下可以进行各种命令操作和移动
- 大部分情况下,你是在浏览而不是编辑。所以Vim默认是普通(normal)模式
- 插入(Insert)模式
插入模式下Vim可以直接编辑,和其他编辑器一样
- 使用
i
(insert)/a
(append)/o
(open a line below)进入插入模式 - 使用
Esc
退出插入模式到普通(normal)模式 - 你来试试
I
/A
/O
如何进入插入模式的?
- 命令(Command)模式
普通(Normal)模式下输入
:
之后执行命令,比如保存退出:wq
,一气呵成
- 顾名思义,执行Vim命令。比如保存
:w
、退出:q
- 比如分屏:
:vs
(vertical split)、:sp
(split) - 比如使用
:% s/java/python/g
全局替换,将java
替换为python
- 可视化(Visual)模式
可视化(Visual)模式一般用来块状选择文本
- 普通模式下,使用
v
进入字符选择 - 使用
V
选择行 - 使用
Ctrl+v
进入方块♦️选择
课后练习
理解和使用Vim常用的4种模式
- 找一个文件编辑,在插入模式和普通模式之间切换
- 使用命令模式替换单词
- 尝试使用可视化(Visual)模式,想想它的使用场景是?
2-3 Vim 插入模式小技巧 (08:08)
如何快速纠错?
代码就像人生,总是经常出错,需要我们快速修正
进入Vim之后,首先使用
i
/a
/o
进入插入模式尝试抛弃退格键,使用
Ctrl
快捷键来完成编辑删除工作操作 说明 Ctrl+h
删除上一个字符 Ctrl+w
删除上一个单词 Ctrl+u
删除当前行 以上几个快捷键可以用在很多地方,比如终端
操作 说明 Ctrl+a
快速移动到开头 Ctrl+e
快速移动到结尾 Ctrl+b
前移动 Ctrl+f
后移动
快速切换普通(Normal)模式和编辑(Insert)模式
很多键盘的键位设置,
Esc
按起来不方便,不方便切换到普通模式
- 使用
Ctrl+c
代替Esc
(但是可能会中断某些插件)、Ctrl+[
gi
快速跳转到最后一次编辑的地方,并进入插入模式- 在配置章节,我们会讲解如何映射方便的快捷键来代替
Esc
让键盘适应工具
键盘的选择会影响你的编辑速度
- 选择
Esc
和Ctrl
比较容易触碰到的键盘 - 使用Vim,你可以使用HHKB或者Poker2这种迷你键盘
- 使用软件修改键位,比如
CapsLock
改成频繁使用到的Ctrl
码农神器之HHKB—专为Linux下Vim/Emacs设计
发烧之选—Poker2
2-4 Vim 快速移动大法 (15:11)
众所周知,vim normal模式使用了反人类的hjkl来移动
- 编辑器作者在编写vim的时候,键盘还没流行上下左右按键
- 左(
h
),下(j
),上(k
),右(l
)。移动也不会让手指脱离主键盘区 - 逼着自己使用hjkl一段时间之后,便会体会到它非常有效率
在单词之间「飞舞」
在单词之间移动是我们浏览操作中最常使用的命令
w
/W
移动到下一个word/WORD开头。e
/E
移动到下一个word/WORD结尾b
/B
回到上一个word/WORD开头,可以理解为backword- word指的是以非空白符分割的单词,WORD指的是以空白符分割的单词
synyax on
:打开高亮显示
行间搜索移动
同一行快速移动的方式其实是:搜索一个字符并且移动到该字符
- 使用
f{char}
可以移动到char字符上,t{char}
移动到char的前一个字符 - 如果第一次没搜到,可以用分号
;
/逗号,
继续搜索该行的下一个/上一个 - 大写的
F
表示反过来搜索前面的字符
如何快速移动到一行的行首或者行尾呢?
0
移动到行首第一个字符,^
移动到行首第一个非空白字符$
移动到行尾,_g
移动到行尾非空白字符- 记住常用的
0
和$
就可以满足日常需求了。
Vim垂直移动
在句子(sentence)和段落(paragraph)间移动。(不常用)
- 使用小括号
()
在句子间移动,可以使用:help (
来查看帮助文档 - 使用大括号
{}
在段落间移动 - 插件章节会讲到如何使用easy-motion插件移动,这些命令就都不用记忆了
Vim页面移动
gg
/G
移动到文件开头和结尾,可以使用ctrl+o
快速返回H
/M
/L
跳转到屏幕的开头(Head)、中间(Middle)、结尾(Lower)ctrl+u
、ctrl+f
上下翻页(upward/forward)。zz
把光标当前行置为屏幕中间
2-5 Vim快速增删改查 (13:29)
Vim增加字符
- 进入插入模式编辑文本
a
/i
/o
、A
/I
/O
Vim快速删除
- Vim在normal模式下使用
x
快速删除一个字符 - 使用
d
(delete)配合文本对象快速删除一个单词daw
(d around word) d
和x
都可以搭配数字来执行多次
Vim快速修改
r{char}
(replace)、c
(change)、s
(substitute)normal模式下使用
r{char}
可以替换一个字符char。s
替换并进入插入模式R
进入插入模式,将光标所在的字符直接替换为输入的字符。S
删除整行,进入插入模式使用
c
配合文本对象可以快速进行修改。例如:ciw
、caw
、ct"
C
删除整行,进入插入模式(不包含行首的非空白字符)
Vim查询
- 使用
/
或者?
进行前向或者反向搜索 - 使用
n
/N
跳转到下一个或者上一个匹配 - 使用
*
或者#
进行当前光标所在单词的前向或者后向匹配
2-6 Vim 如何搜索替换 (07:15)
Vim替换命令:
substitute命令允许查找并且替换文本,并且支持正则表达式
:[range] s[ubstitute]/{pattern}/{string}/[flags]
range
表示范围。 比如:10,20
表示10-20行,%
表示全部pattern
是要替换的模式,string
是替换后的文本,flags
是替换标志位
替换标志位
g
(flobal)表示全局范围内执行c
(confirm)表示确认,可以确认或者拒绝修改n
(number)报告匹配到的次数而不替换,可以用来查询匹配次数
例:
# 在全局范围内将self替换为this
:% s/self/this/g
# 在1-6行将self替换为this
:1,6 s/self/this/g
# 统计1-6行匹配到self的次数
:1,6 s/self//n
# 利用正则,将quack替换为jiao,而不替换do_quack
:% s/\<quack\>/jiao/g
u
:撤销操作
Ctrl+r
:反向撤销
课后练习:
- 如何批量替换多个文件中的匹配呢?
- 延伸:使用插件来批量搜索替换多个文件中的匹配
2-7 Vim 多文件操作 (15:01)
Buffer Window Tab:
Buffer是指打开的一个文件的内存缓冲区
Window是Buffer可视化的分割区域
Tab可以组织Window为一个工作区
Buffer(缓冲区)
- Vim打开一个文件后会加载文件内容到缓冲区
- 之后的修改都是针对内存中的缓冲区,并不会直接保存到文件
- 直到执行
:w
(write)的时候才会把修改的内容写入到文件里
Buffer切换
- 使用
:ls
会列举出当前缓冲区,然后使用:b n
跳转到第n个缓冲区 bpre
、bnext
、bfirst
、blast
:b buffer_name
、:b filename
,tab
会自动补全buffer_name
:e b.txt
:编辑(edit)b.txt
Window窗口:
- 一个缓冲区可以分割成多个窗口,每个窗口也可以打开不同的缓冲区
<Ctrl+w>s
水平分割,<Ctrl+w>v
垂直分割。或者:sp
、:vs
- 每个窗口可以继续被无限分割(屏幕是否足够大)
分割窗口示例:

如何切换窗口:
命令 | 用途 |
---|---|
<Ctrl+w>w |
在窗口间循环切换 |
<Ctrl+w>h |
切换到左边的窗口 |
<Ctrl+w>j |
切换到下边的窗口 |
<Ctrl+w>k |
切换到上边的窗口 |
<Ctrl+w>l |
切换到右边的窗口 |
<Ctrl+w>L
:将当前窗口移动到右边
<Ctrl+w>H
:将当前窗口移动到左边
如何重排窗口?
重排窗口可以改变窗口的大小
:h window-resize
查看文档
命令 | 用途 |
---|---|
<Ctrl+w>= |
使所有窗口等宽、等高 |
<Ctrl+w>_ |
最大化活动窗口的高度 |
`<Ctrl+w> | ` |
[n] <Ctrl+w>_ |
把活动窗口的高度设为[n]行 |
`[n] <Ctrl+w> | ` |
Tab(标签页)将窗口分组
Tab是可以容纳一系列窗口的容器
:h tabpage
- Vim的Tab和其他编辑器有所不同,可以将其想象为Linux的虚拟桌面
- 比如一个Tab全用来编辑Python文件,一个Tab全是HTML文件
- 相比窗口,Tab一般使用较少,Tab太多管理起来也比较麻烦
Tab操作
命令 | 用途 |
---|---|
:tabnew {filename} |
在新标签中打开{filename} |
:tabe[dit] {filename} |
在新标签中打开{filename} |
<Ctrl+w>T |
把当前窗口移动到一个新标签页 |
:tabc[lose] |
关闭当前标签页及其中的所有窗口 |
tabo[nly] |
只保留活动标签页,关闭其他所有标签页 |
Tab切换操作
Ex命令 | 普通模式命令 | 用途 |
---|---|---|
:tabn[ext] {N} |
{N} gt |
切换到标签为{N}的标签页 |
:tabn[ext] |
gt |
切换到下一个标签页 |
tabp[revious] |
gT |
切换到上一个标签页 |
:vs c.txt
:垂直分割打开c.txt
:tabnew duck.py
:在新的标签页打开duck.py
课后练习
- 尝试打开Vim一次操作多个文件
- 窗口分割可以非常方便的查看代码,比如查看整个调用链
- 延伸:插件篇会配合
ctrlp
插件和nerdtree
快速操作多个文件
2-8 什么是 Vim 的 text object (06:49)
Text Object(文本对象)
- Vim里文本也有对象的概念,比如一个单词、一段句子、一个段落
- 很多其他编辑器经常只能操作单个字符来修改文本,比较低效
- 通过操作文本对象来修改要比只操作单个字符高效
文本对象操作方式
之前已经使用过文本对象了,比如
dw
删除一个单词
[number] <command> [text object]
。次数+命令+文本对象number
表示次数,command
表示命令:d
(delete)、c
(chage)、y
(yank)text object
是要操作的文本对象,比如单词w
、句子s
、段落p
iw
:表示inner word。viw
命令首先v
进入选择模式,iw
将选中当前单词
aw
:表示around word。它不但会选中当前单词,还会包含单词之后的空格
ci"
:删除""
中的内容,并进入插入模式。另外还有()
、{}
、[]
等。
课后练习
摆脱低效的字符操作,使用文本对象提升效率
- 如何删除一个单词?
- 在Vim中尝试使用文本对象快速增、删、改一个单词
- 延伸:有些插件扩展了文本对象。比如
vim-go
可以使用f
表示一个函数
2-9 Vim复制粘贴与寄存器的使用 (16:51)
Normal模式复制粘贴
normal模式下复制粘贴分别使用
y
(yank)和p
(put),剪贴d
和p
可以使用
v
(visual)命令选中所要复制的地方,然后使用p
粘贴配合文本对象。比如使用
viw
复制一个单词,yy
复制一行Vim里的剪贴(cut)复制(copy)粘贴(paste)分别是delete/yank/put
Insert模式下的复制粘贴
- 和其他文本编辑器一样,使用
Ctrl+v
或者cmd+v
粘贴,但是粘贴代码有个坑 - 很多人在
.vimrc
中设置了autoindent
,粘贴Python代码缩进错乱 - 这个时候需要在粘贴前后使用
:set paste
和:set nopaste
解决、使用系统剪贴板寄存器:"
也可以解决
什么是Vim的寄存器?
- Vim里操作的是寄存器而不是系统剪贴板。
- 默认使用
d
删除或者y
复制的内容都放到了“无名寄存器” - 用
x
删除一个字符放到无名寄存器,然后p
粘贴,可以调换两字符
深入寄存器(register)
Vim不使用单一剪贴板进行剪贴、复制与粘贴,而是多组寄存器
- 通过
"{register}
前缀可以指定寄存器,不指定则默认使用无名寄存器 - 比如使用
"ayiw
复制一个单词到寄存器a
中,"bdd
删除当前行到寄存器b
中 - Vim中,
""
表示无名寄存器,缺省使用,""p
其实就等同于p
。"+
系统剪贴板。
:reg a
:查看寄存器a
其他常见寄存器
除了有名寄存器a-Z,Vim中还有一些其他常见寄存器
复制专用寄存器
"0
,使用y
复制文本同时会被拷贝到复制寄存器0
系统剪贴板
"+
,可以在复制前加上"+
复制到系统剪贴板。查看是否开启系统剪贴板:
:echo has('clipboard')
设置
:set clipboard=unnamed
其他寄存器,比如
"%
当前文件名,".
上次插入的文本
:e!
:舍弃当前修改并重新加载文本内容
课后练习
了解normal/insert模式复制粘贴的方法,常见寄存器的用法
- 找一段Python代码,尝试在Vim里粘贴进入
- 试试将Vim中的内容复制到系统粘贴板
- 尝试在服务器的Vim里粘贴系统剪贴板的内容
2-10 Vim 如何用宏完成强大的批量操作 (10:23)
从需求说起
从一个需求说起,给多行URL链接加上双引号
https://www.zhihu.com/question/54919485
https://www.zhihu.com/explore
https://www.zhihu.com/topic
https://www.zhihu.com/topic/19601308
https://www.zhihu.com/topic/19607351
https://www.zhihu.com/topic/19630716
https://www.zhihu.com/topic/19637932
https://www.zhihu.com/people/weikexin-67
https://www.zhihu.com/questton/267339149/answer/325252706
https://www.zhihu.com/question/267339149/answer/523371968
https://www.zhihu.com/people/zhang-jia-hao-15
https://www.zhihu.com/question/48510028
https://www.zhihu.com/question/267339149/answer/323414411
https://www.zhihu.com/people/ming-ming 0701
https://www.zhihu.com/question/267339149/answer/519709724
https://www.zhihu.com/question/answer/519709724
https://www.zhihu.com/question/22897152
https://www.zhihu.com/question/22130215
https://www.zhihu.com/question/19823813
什么是Vim宏(macro)
- 宏可以看成是一系列命令的集合
- 可以使用宏「录制」一系列操作,然后用于「回放」
- 宏可以非常方便地把一系列命令用在多行文本上
如何使用宏
宏的使用分为录制和回放,与拍电影类似。
- Vim使用
q
来录制,同时也是使用q
结束录制 - 使用
q{register}
选择要保存的寄存器,把录制的命令保存其中 - 使用
@{register}
回放寄存器中保存的一系列命令
使用宏解决提出的问题
先给一行加上双引号,然后再回放到其他所有行
先使用
q
开始录制,给一行加上双引号,之后使用q
退出在剩下所有行中回放录制的宏
录制:
qa I " <Esc> A " <Esc> j q
调用方式一:
10@a
调用方式二:
V GG :normal @a
课后练习
知道什么是宏,如何使用宏完成日常需求
- 想象一下编辑代码或者文本什么时候会使用到宏?
- 想一下还有没有其他方式来完成这个批量加引号的编辑需求
- 尝试亲自操作一下宏命令编辑。
2-11 Vim 补全大法 (07:33)
什么是补全?
只要手速快,补全什么的都是浮云。
- 补全是根据当前环境上下文由编辑器「猜」用户想要输入的内容
- 比如补全一个单词、文件名,或者代码中的函数名、变量名等
- Vim中提供了多种补全功能,还可以由插件扩展功能实现代码补全
Vim中常见的补全:
命令 | 补全类型 |
---|---|
<C-n> |
普通关键字 |
<C-x><C-n> |
当前缓冲区关键字 |
<C-x><C-i> |
包含文件关键字 |
<C-x><C-]> |
标签文件关键字 |
<C-x><C-k> |
字典查找 |
<C-x><C-l> |
整行补全 |
<C-x><C-f> |
文件名补全 |
<C-x><C-o> |
全能(Omni)补全 |
常见的三种补全类型:
使用
<Ctrl+n>
和<Ctrl+p>
补全单词Ctrl+n
:n(next)代表下一个补全的选项Ctrl+p
:p(previous)代表上一个补全的选项使用
<Ctrl+x>
+<Ctrl+f>
补全文件名Ctrl+w
:回删一个单词使用
<Ctrl+x>
和<Ctrl+o>
补全代码,需要开启文件类型检查,安装插件:filetype on
:开启文件类型检查:set filetype
:查看当前文件类型
:r! echo %
:当前文件名(文件名)。"%p
也可输出文件名
:r! echo %:p
:当前文件名称(文件路径+文件名)
For more info:
:help read
:help filename-modifiers
课后练习:
知道如何在Vim中使用补全,补全的几种常见类型
- 尝试使用Vim中的补全方式来补全单词
- 在Vim中输入文件名的时候尝试补全,想想如何输入现有的文件名?
- 延伸:目前补全都是基于文本匹配的,插件可是实现代码补全。
2-12 给 Vim 换个配色 (06:32)
Vim更换颜色
- 使用
:colorscheme
显示当前的主题配色,默认是default
- 使用
:colorscheme <Ctrl+d>
可以显示所有的配色 - 有中意的配色后,使用
:colorscheme 配色名
就可以修改颜色
vim duck.go duck.py -O
:打开两个文件并垂直分割。在一个窗口的一个Tab页中
从网上下载配色
默认的配色没有喜欢的怎们办?
从网络上寻找更好看的配色
安装之后就有大量的主题可以更换了
git clone https://github.com/w0ng/vim-hybrid.git mkdir -p ~/.vim/colors cp vim-hybrid/colors/hybrid.vim ~/.vim/colors
课后练习
- 尝试更改Vim的配色方案,想要持久化配置需要写到
.vimrc
中 - 在网上选一个喜欢的配色方案,下载并使用它,比如
hybird
- 下载多个配色方案到
.vim/colors
并且随时更换
2-13 本章小结:裸 Vim 也很强 (02:37)
裸的Vim
本节没使用配置过的Vim,而是用裸的Vim演示,目的何在?
- 很多初学者Vim基本命令都不熟练就开始找一些复杂的强大配置
- 不利于熟悉Vim,一旦出问题了还不知道怎们修复
- 建议初学者从裸的Vim开始学习。有些场景,比如服务器或者容器上无法配置Vim
裸的Vim也很强
学习Vim之前,先用正确打字指法和盲打
- 编辑代码,脑子🧠一般比手👋快,盲打有利于跟上你的大脑速度
- 裸的Vim也有很多强大的功能和使用方式
- 学会了使用Vim,可以在任何IDE上安装Vim插件,几乎所有流行的编辑器和IDE工具都支持Vim插件
下一步该学习什么?
前提是已经无障碍使用Vim,并且没有那么痛苦纠结了。
- 学习Vim配置,我的Vim我做主
- Vim也在与时俱进,探索学习各种炫酷和方便的插件
- 用中学,学中用。慢慢就有了肌肉记忆
第3章 编写 Vim 配置,我的 Vim 我做主
学习如何编写Vim 的配置文件,自定义 Vim。
3-1 编写 vim 配置,我的 vim 我做主 (17:09)
什么是Vim配置
什么是Vim的配置,为什么要使用它呢?
- Vim里有非常多常用的设置,比如
:set number
设置行号 - 之前的使用都是在Vim里临时设置,没法持久化,每次打开文件都需要设置
.vimrc
提供了一种持久化配置的方式,让用户自定义配置
如何编写Vim配置文件
- Linux/Unix下新建一个隐藏文件
vim ~/.vimrc
- Windows系统
vim $MYVIMRC
,通过环境变量编辑配置文件 - 接着就可以开始自定义配置
Vim配置都包含什么?
- 常用设置。比如:
set number
设置行号、colorscheme hybrid
设置主题 - 常用的Vim映射。比如:
noremap <leader>w :w<cr>
保存文件 - 自定义的
vimscript
函数(vim高手)和插件的配置(插件篇)
常用设置:
- 可以把常用的设置写到
.vimrc
里,避免每次打开Vim重新设置 - 比如设置行号
set number
、设置主题colorscheme hybrid
- Vim里有非常多的配置,可以参考大佬的配置
Vim中的映射
Vim中的映射比较复杂,源于Vim有多种模式
- 设置一下
<leader>
键,let mapleader = ','
,常用的是逗号,
或者空格<Space>
- 比如用
inoremap <leader>w <Esc>:w<cr>
在插入模式保存 - Vim中的映射概念稍微复杂,但是非常强大
Tmux使用Ctrl+B+%
实现垂直分割屏幕
zt
:将光标所在行定位于屏幕顶部
zz
:将光标所在行定位于屏幕中部
jj
:映射<Esc>
键,退到普通normal模式
:FormatJSON
:格式化JSON代码
Ctrl+h/j/k/l
:映射<Ctrl-w>+h/j/k/l
,光标在分屏窗口中移动
xp
:普通模式下,对调字符
:h option-list
:查看指令列表
Vim插件
现代化的Vim可以通过Vim插件管理器安装插件
- 通过插件用户可以无限扩充Vim的功能
- 想要使用插件需要具备一定的Vim配置知识
Vim脚本
Vim有自己的脚本语言
Vimscript
- Vim脚本对于Vim高级玩家来说可以实现强大的Vim插件
- 初学者知道有这个概念就好,Vim脚本是一种简单的脚本语言
- 可以通过
vimscript
实现更多Vim的控制,开发自己的插件
课后练习
掌握Vim配置需要对Vim本身很熟悉
尝试自己建立一个
~/.vimrc
文件,加入常见的设置选项研究一下GitHub上
vim-go
教程vim-go-tutoial
的.vimrc
文件拿来主义、网上、很多人开源了自己的配置(dotfiles)可参考学习
通过把
.vimrc
配置文件放到git版本库可以同步到其他电脑或者服务器上
课程讲师的.vimrc
文件:
" 常用设置
" 设置行号
set number
colorscheme hybrid
" 按F2进入粘贴模式
set pastetoggle=<F2>
" 高亮搜索
set hlsearch
" 设置折叠方式
set foldmethod=indent
" 一些方便的映射
let mapleader=','
let g:mapleader=','
" 使用 jj 进入 normal模式
inoremap jj <Esc>`^
" 使用 <leader>+w 直接保存
inoremap <leader>w <Esc>:w<cr>
noremap <leader>w :w<cr>
" 切换 buffer
nnoremap <silent> [p :bprevious<cr>
nnoremap <silent> [n :bnext<cr>
" use ctrl+h/j/k/l switch window
noremap <C-h> <C-w>h
noremap <C-j> <C-w>j
noremap <C-k> <C-w>k
noremap <C-l> <C-w>l
" Sudo to write
cnoremap w!! w !sudo tee % >/dev/null
" json 格式化
com! FormatJSON %!python3 -m json.tool
" 插件设置,这里使用了 vim-plug
call plug#begin('~/.vim/plugged')
" 安装插件只需要把 github 地址放到这里重启后执行 :PlugInstall 就好了
Plug 'mhinz/vim-startify'
Plug 'scrooloose/nerdtree'
call plug#end()
" 插件相关配置
" 禁止 stratify 自动切换目录
let g:startify_change_to_dir = 0
" nerdtree
nmap ,v :NERDTreeFind<cr>
nmap ,g :NERDTreeToggle<cr>
" 定义函数SetTitle,自动插入文件头
func SetTitle()
if &filetype == 'python'
call setline(1, "\#!/usr/bin/env python")
call setline(2, "\# -*- coding:utf-8 -*-")
normal G
normal o
normal o
call setline(5, "if __name__ == '__main__':")
call setline(6, " pass")
endif
endfunc
3-2 Vim 映射迷人眼 (14:53)
什么是Vim映射
Vim映射就是把「一个操作」映射到「另一个操作」
- 如果你不满意现在的按键设置,比如Vim本来的命令
- 或者想要映射一些方便的快捷键
- 按照用户意愿定制Vim
基本映射
基本映射指的是在普通normal模式下的映射,当然还有其他模式的映射
使用
map
就可以实现映射。比如::map - x
按-
就会删除字符取消
map
映射使用:unmap -
:map <space> viw
按空格键<space>
就会选中光标所在的整个单词:map <C-d> dd
按Ctrl+d
执行dd
删除一行
模式映射
Vim常用模式normal/visual/insert都可以定义映射
用
nmap
/vmap
/imap
定义映射,只在normal/visual/insert分别有效:vmap \ U
:把在visual模式下选中的文本大小写(u(小写)/U(大写)转化大小写)想想如何在insert模式下映射
Ctrl+d
来删除一行:imap <C-d> <Esc>ddi
现有映射的问题?
:nmap - dd :nmap \ -
当按下
\
时,Vim会解析\
为-
;因为又映射了-
,Vim会继续解析-
为dd
,即最终按下\
会删除整行。(类似于递归解析映射)
递归映射和非递归映射
*map
系列命令有递归的风险
- 如果用户安装了一个插件,插件映射了同一个按键的不同行为,有冲突就会有一个失效
- 想要保证插件映射没有冲突会非常痛苦
- 解决方案就是使用非递归映射
非递归映射
Vim提供了非递归映射,这些命令不会递归解析
- 使用
*map
对应的nnoremap
/vnoremap
/inoremap
- 何时使用递归映射
*map
?何时使用非递归映射*noremap
呢? - 「任何」时候都应该使用非递归映射,拯救自己同时也拯救了插件作者
``^:光标回到最后一次插入模式停止时光标的位置。
:help ^
查看帮助。
课后练习
尝试在
.vimrc
文件中定义一些映射,提升工作效率参考一些开源的Vim配置,看看哪些映射可以拿来使用
阅读《笨方法学Vimscript》书中关于映射的章节。
3-3 本章小结:配置 Vim,让她更顺手 (01:16)
学习和使用配置
学习和使用Vim配置是Vim玩家进阶的必修之路
- 了解常见的配置选项
- 学习和使用Vim映射,用得不爽我就改
- Vim进阶需要学习Vimscript。《笨发放学Vimscript》
下一步该学什么?
强大的Vim插件
- Vim也在与时俱进,发布了Vim8,还有Neovim
- 知道如何配置Vim之后,开始探索各种强大的Vim插件
- 打好Vim配置和映射的基础,开始学习如何安装和使用插件
第4章 Vim 安装和使用插件
学会如何安装和使用常见的 Vim 插件,增强 Vim 的功能。
4-1 Vim 安装插件,竟如此简单 (08:40)
什么是插件?
和其他现代流行编辑器一样,Vim同样支持强大的插件扩展
- Vim插件是使用vimscript或者其他语言编写的vim功能扩展
- 编辑器自带的功能有限,有了插件之后几乎可以无限扩充其功能
- 网络上比如GitHub.com等有很多开源的Vim插件可以使用
如何安装插件?
原始的方式是直接clone插件代码,如今Vim有很多插件管理器
目前Vim有很多插件管理器可供选择
常见的有:
vim-plug
、Vundle
、Pathogen
、Dein.Vim
、volt
等综合性能、易用性、文档等几个方面,推荐使用
vim-plug
https://www.slant.co/topics/1224/~best-plugin-managers-for-vim
使用vim-plug
安装插件
学习一个新东西的最好方式就是看官方文档
按照官方的教程,就可以非常容易地了解它的使用方式
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
安装第一个插件vim-startify
一个好用的vim开屏插件
修改
.vimrc
配置文件,增加该插件的名称重新启动vim或者执行
:source ~/.vimrc
,执行:PlugInstall
call plug#begin('~/.vim/plugged') Plug 'mhinz/vim-startify' call plug#end()
:source ~/.vimrc
:PlugInstall
如果已经安装完成,退出并重新打开Vim查看效果
课后练习
打开Vim操练起来,首先下载vim-plug并浏览其文档
- 安装vim-plug插件管理器
- 安装vim插件vim-startify、nerdtree,看看能否生效
4-2 如何寻找自己需要的插件 (06:42)
Google关键词搜索
浏览网上开源的vim配置,借鉴想要的插件
4-3 vim美化插件,让你的 vim 与众不同 (09:57)
vim美化插件
更改vim的外观
修改启动界面:https://github.com/mhinz/vim-startify
:Startify
vim配色方案
- vim-hybrid配色:https://github.com/w0ng/vim-hybrid
- solarized配色:https://github.com/altercation/vim-colors-solarized
- gruvbox配色:https://github.com/morhetz/gruvbox
课后练习
- 尝试使用vim-stratify快速打开最近使用的文件
- 安装vim-airline美化状态栏
- 安装indentline给vim增加代码缩进线
4-4 Vim文件目录和搜索插件,跳转文件so easy (12:20)
文件目录树:
默认的文件目录管理比较简陋,nerdtree弥补了这个问题

文件管理器nerdtree
使用nerdtree插件进行文件目录树管理
https://github.com/scrooloose/nerdtree
:NERDTree
:NERDTreeFind
:NERDTreeToggle
autocmd vimenter * NERDTree
可以在启动vim的时候打开NERDTree‘map <leader>v :NERDTreeFind<CR>
查找文件位置
快速搜索文件:
如何根据文件名快速查找打开一个文件

模糊搜索器
使用ctrlp插件快速查找并且打开文件
- https://github.com/ctrlpvim/ctrlp.vim
let g:ctrlp_map = '<c-p>'
- 使用
,然后输入少量字符就可以开始搜索
课后练习
快速定位文件是常用操作,需牢牢掌握提升效率
- 安装nerdtree插件,加入快捷键映射
- 安装ctrlp插件,然后使用快速定位文件
- 改变自己之前低效的操作方式,适应新的操作方式
4-5 Vim快速定位插件,文件位置任我行 (05:58)
Vim移动命令:
在基础篇学习了很多Vim移动的命令
- 比如,
w
/e
基于单词移动,gg
/G
文件首尾,0
/$
行首尾,f{char}
查询字符 Ctrl+f
、Ctrl+u
前后翻屏- 如果需要快速跳转到当前窗口显示区的任意位置需要怎们做?
如何快速移动到任意位置
可以使用vim的搜索/加上n跳转,但是使用easymotion更方便
- https://github.com/easymotion/vim-easymotion
- 官方文档较长,其实一个映射就能应付
nmap ss <Plug>(easymotion-s2)
课后练习
安装并使用easymotion插件
- 回忆一下vim里常用的移动操作
- 安装easymotion插件
- 使用easymotion练习在文件窗口的任意位置跳转
4-6 Vim-surround,编辑也要成双成对 (05:27)
vim-surround
如何快速更换一对单引号为双引号?
一个一个查找然后替换
vim-surround使用
normal模式下增加、删除、修改成对内容
ds
(delete a surrounding)cs
(change a surrounding)ys
(you add a surrounding)
例子:
ysiw"
:给单词增加"
cs"'
:修改"
为'
cs(]
:修改(
为]
,替换后的括号需要使用后括号,前括号会产生空格ds'
:删除'
ds(
:删除(
课后练习
vim-surround大法好
- 使用vim-plug安装vim-surround插件
- 使用练习修改成对的内容,比如修改单引号为双引号
- 多练习几次,使用插件提升编辑效率
4-7 强大的Vim模糊搜索与替换插件 (08:26)
模糊搜索
经常需要在一个代码项目中模糊搜索一些文本,怎们办?
- vim自带的搜索可以搜索当前文件,但是项目有很多个文件
- 需要使用插件来模糊搜索多个文件内容
- 使用Ag.vim或者fzf.vim,都可以很好的支持模糊搜索
fzf与fzf.vim
fzf是一个强大的命令行模糊搜索工具,fzf.vim集成到了vim里
安装
Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' } Plug 'junegunn/fzf.vim'
使用
Ag [PATTERN]
模糊搜索字符串使用
Files [PATH]
模糊搜索目录
例子:
:Files .
:查看当前目录下的所有文件,再输入文件名实现搜索
:Ag {PATTERN}
:查找文本内容。
此处遇到了一个问题:ag is not found
解决方法参考:https://github.com/junegunn/fzf.vim/issues/440
搜索替换插件far.vim
如果想要批量搜索替换,可以使用far.vim
使用
:Far foo bar **/*.py :Fardo
比如在代码重构的时候会经常使用到
:Far foo bar **/*.py
课后练习
模糊搜索和替换是一个非常常用的操作
- 使用vim-plug安装fzf.vim和far.vim
- 使用fzf.vim在一个项目中搜索想要的文本
- 使用far.vim批量替换一个项目下的文本
4-8 愉快写 golang 之vim-go插件 (10:19)
编辑器 VS IDE
IDE一代又一代,经典的编辑器却长久不衰
- 除了Java,很多人用vim编写shell/php/golang/python/ruby
- 前端很多人使用VSCode,sublime/Atom有没落之势
- 很多后端和运维工程师使用vim,微信后台和阿里飞天系统很多代码出自在服务器上使用vim的工程师
vim-go
功能强大的golang插件vim-go
代码补全、重构、跳转、自动格式化、自动导入等功能
基本可以满足golang日常开发
命令 说明 <Ctrl-x><Ctrl-o>
打开补全列表 <Ctrl-p>
向上选择补全 <Ctrl-n>
向下选择补全 <Ctrl-]>
跳转到定义的方法 <Ctrl-o>
跳转到上一次的地方 <Ctrl-i>
跳转到上一次的地方 命令 说明 :GoFmt
格式化代码 :GoRename
重构名称 :GoImports
自动带入包 :GoRun
运行代码 :w
保存文件自动格式化代码 vimrc配置:
autocmd BufNewFile,BufRead *.go setlocal noexpandtab tabstop=4 shiftwidth=4
课后练习
- 安装vim-go插件,阅读vim-go-tutorial教程
- 使用vim-go编写Go语言代码
- 如果遇到了问题,请查看vim-go-tutorial教程或者vim-go文档
4-9 python-mode把 vim 打造成轻量 Python IDE (07:11)
Python-mode
Python插件使用比较多的是jedi-vim和Python-mode
- https://github.com/python-mode/python-mode
- Python-mode具备基本的补全、跳转、重构、格式化功能
- 即使是在服务器上也能方便的调试Python代码
查看是否支持python:
vim --version | grep python
:vimrc配置
let g:pymode_python = 'python3' let g:pymode_trim_whitespaces = 1 let g:pymode_doc = 1 let g:pymode_doc_bind = 'K' let g:pymode_rope_goto_definition_bind = '<C-]>' let g:pymode_lint = 1 let g:pymode_lint_checkers = ['pyflakes', 'pep8', 'mccabe', 'pylint'] let g:pymode_options_max_line_length = 120
命令 | 说明 |
---|---|
<Ctrl-x><Ctrl-o> |
打开补全列表 |
<Ctrl-p> |
向上选择补全 |
<Ctrl-n> |
向下选择补全 |
<Ctrl-]> |
跳转到定义的方法 |
<Ctrl-o> |
跳转到上一次的地方 |
<Ctrl-i> |
跳转到上一次的地方 |
<Ctrl-C>ro |
整理导入包的顺序 |
命令 | 说明 |
---|---|
:PymodeLintAuto |
自动Lint整理格式代码 |
:w |
保存文件时做文件静态检查,并提示相应错误 |
课后练习:
- 安装python-mode插件
- 使用python-mode编写Python代码
- 如果遇到了问题,尝试查询python-mode文档解决
4-10 Vim tagbar,更愉快地浏览代码 (11:14)
tagbar
代码大纲,支持多种编程语言
需要安装Universal Ctags生成对应的tag文件
快速浏览当前文件代码结构,并且搜索跳转到对应代码块
vimrc配置
nnoremap <leader>t :TagbarToggle<CR>
安装ctags:
Universal Ctags:https://ctags.io/
https://docs.ctags.io/en/latest/osx.html#building-with-homebrew
brew tap universal-ctags/universal-ctags brew install --HEAD universal-ctags
命令 | 说明 |
---|---|
:Tagbar |
显示Tagbar |
:TagbarToggle |
显示Tagbar并定位到当前方法的目录 |
:ls |
查看buffer |
:b duck.py |
跳转到duck.py的buffer |
vim-interestingwords
高亮感兴趣的单词,浏览代码很有用
- https://github.com/lfv89/vim-interestingwords
- 浏览代码的时候经常需要知道一个变量的使用方式
- 可以使用这个插件同时高亮多个单词
命令 | 说明 |
---|---|
<leader>k |
高亮单词 |
u /U |
下/上一个高亮 |
<leader>K |
取消所有高亮 |
课后练习
- 安装tagbar,开启文件代码大纲
- 安装interestingwords,高亮感兴趣的单词
- 如果遇到了问题,尝试查询插件的官方文档/Google搜索/vim help解决
4-11 强大的 vim 代码补全插件 (07:16)
deoplete.nvim
一个强大的neovim/vim8异步补全插件
- https://github.com/Shougo/deoplete.nvim
- 多编程语言的支持,支持模糊匹配
- 需要安装对应编程语言的扩展
安装:
if has('nvim')
Plug 'Shougo/deoplete.nvim', { 'do': ':UpdateRemotePlugins' }
else
Plug 'Shougo/deoplete.nvim'
Plug 'roxma/nvim-yarp'
Plug 'roxma/vim-hug-neovim-rpc'
endif
如若报错请安装依赖:
pip3 install --user pynvim
配置:
let g:deoplete#enable_at_startup = 1
其他代码补全插件
deoplete-jedi:
Python语言代码补全,可以补全自己所写的库
deoplete-go:
Go语言代码补全
coc.nvim
一个强大的neovim/vim8补全插件。LSP支持
LSP(Language-Server-Protocol)
- https://github.com/neoclide/coc.nvim
- full language server protocol support as VSCode
- 多语言插件支持
课后练习
- 安装deoplete.nvim和coc.nvim
- 安装对应的编程语言扩展
- vim/neovim补全插件很多,有些支持异步。
4-12 Vim代码格式化与静态检查 (09:43)
格式化与静态检查
为什么需要这些工具呢?能让工具做的就不用让人去费心
- 把精力集中在代码逻辑本身,而不是整理格式这些浪费精力的事情上
- 静态检查是为了让编写的代码更加规范。golint/pylint/eslint等
- 无论编写何种编程语言,最好都加上自动格式化和静态检查
Neoformat
vim-autoformat和Neoformat是两种使用较多的格式化插件,这里使用neoformat
- https://github.com/sbdchd/neoformat
- 需要安装对应语言的格式化库。python的autopep8、javascript的prettier等
安装依赖:
pip3 install autopep8
:Neoformat
:格式化Python代码
静态检查Lint
neomake和ale是两种常见的lint插件,这里使用ale
- https://github.com/dense-analysis/ale
- 需要安装对应语言的lint库。比如golint/pylint/eslint等
- vim8/neovim支持异步检查,不会影响vim编辑,推荐使用
安装依赖:
pip3 install pylint
课后练习
让插件帮助完成代码的格式化和静态检查吧。
- 安装noeformat插件和相关的格式化库,格式化代码
- 安装ale和对应语言的lint库,修复代码的缺陷
- 需要自定义检查功能(比如忽略某些检查错误),参考官方文档
4-13 Vim快速注释代码 (03:06)
vim-commentary
vim注释插件有很多,推荐使用轻量的vim-commentary
- https://github.com/tpope/vim-commentary
- 记住常用的命令:gc注释和取消注释
- 插件会根据不同的文件类型使用不同注释。python(#)、golang(//)
行注释:
gcc
:注释代码gcgc
:取消注释代码
块注释:
gc
:注释/取消注释代码
课后练习
- 安装vim-commentary插件
- 尝试打开Python文件并快速注释一段代码
- 打开不同类型的文件,比如go文件,试试注释一段代码或文字
4-14 vim和git,强强联手 (07:11)
Fugitive
在vim里使用git
- https://github.com/tpope/vim-fugitive
- Gedit、Gdiff、Gblame、Gcommit等
- 使用tmux新开一个窗口来使用git
vim-gitgutter
在vim里显示文件变动
- https://github.com/airblade/vim-gitgutter
- 当修改文件之后可以显示当前文件的变动
- 哪些行新增,哪些行修改,哪些行删除
配置:
set updatetime = 100
gv.vim
在命令行查看提交记录,命令行工具tig
使用
:GV
命令调用可以浏览代码提交变更
tig
课后练习
- 安装三个git插件
- 使用
:Gblame
等命令 - vim和tmux配合使用
4-15 本章小结:授人以渔,寻找自己需要的插件 (02:29)
Vim插件千千万
本章介绍了如何安装使用常用的插件
- Vim插件很多,不可能都全部介绍。学会自己寻找个安装
- 通过搜索引擎Google关键词、vimawesome、参考开源配置寻找插件
- 学会阅读插件的README文件和doc里的帮助文件,学习插件使用
缺什么就找什么插件吧!
第5章 与时俱进的 Vim
介绍如何安装和使用现有的开源配置,什么是 Neovim 等,站在巨人的肩膀上。
5-1 Vim和Tmux,天作之合 (08:27)
Tmux
强大的终端复用工具。通过brew(Mac)、apt-get(ubuntu)安装
- 可以复用终端、分屏、托管进程等
- 在服务器上即使退出服务器也不会被kill,托管进程也很方便
- 可以方便地分割屏幕,实现多个进程公用屏幕
Tmux使用文章:手把手教你使用终端复用神器 Tmux,丢掉鼠标不是梦
<Ctrl-b>%
:垂直分屏
<Ctrl-b>"
:水平分屏
<Ctrl-b>c
:创建新tmux窗口
<Ctrl-b>n
:跳转到下一个tmux窗口
<Ctrl-b>p
:跳转到上一个tmux窗口
<Ctrl-b>h
:向左切换分屏
<Ctrl-b>l
:向右切换分屏
<Ctrl-b>s
:查看所有会话
<Ctrl-b>d
:脱离当前会话。d(etach)
tmux ls
:查看会话列表
tmux new -s <session_name>
:创建会话
tmux att -t <session_name>
:链接会话。att(ach)
课后练习
在系统或者服务器上安装tmux
- 使用tmux分割屏幕
- 尝试一个窗口编写代码,另一个窗口使用shell命令
- 尝试退出和重新attach到一个tmux的会话
5-2 无处不在的 vim,让 vim 嵌入你的开发工具 (01:42)
几乎流行的编辑器和IDE都支持VIM插件
让vim嵌入开发工具,甚至Chrome都有vimium插件
- 即使不用vim作为主力编辑器,依然可以使用它的编辑方式
- 几乎流行的开发工具都支持vim插件,以vim的方式编辑
- 比如VSCode/Atom/PyCharm等都支持安装vim插件
课后练习
- 搜索相应开发工具的vim插件
- 安装vim插件到开发工具里
- 尝试在各种开发工具中使用vim的方式编辑提升效率
5-3 与时俱进的 vim 之 neovim (02:07)
Neovim
一个新的vim版本,支持异步特性(vim8也支持)
- https://neovim.io/
- https://github.com/neovim/neovim
- 开发更活跃,更丰富的特性和扩展异步支持
- neovim的设计可以嵌入到很多GUI里,加上好看的外壳
感兴趣的同学可以使用neovim代替vim啦!
5-4 站在巨人的肩膀上,使用强大的开源配置 (03:37)
开箱即用
如果你已经熟悉了vim配置,可以从网上直接使用一些开源配置
- https://github.com/SpaceVim/SpaceVim
- https://github.com/pegasuswang/vim-config
- 其他开源配置。不推荐新手直接使用,越复杂的配置上手成本越高
课后练习
- 找到一个合适的开源配置,尝试安装它
- 阅读其他文档,了解使用方式。一般开源配置都安装了很多插件
- 对于新手来说,配置太复杂太强大有时候可能会出现很多小问题
第6章 Vim虐我千百遍,我待Vim如初恋~
Vim虐我千百遍,我待Vim如初恋~
6-1 课程总结-vim虐我千百遍,我待 vim 如初恋 (03:17)
可以用一生的编辑器
vim从诞生到现在已经走过了快30个年头
- 几十年之间,无数的编辑器或者开发工具昙花一现
- 但是vim一直到现在依然有很多人在使用,甚至嵌入到各种开发工具
- 如今vim/neovim依然在活跃开发,很多开发者贡献插件
学习方法
熟悉vim靠的是肌肉记忆。脱离鼠标编辑能提升编辑效率
- 讲了很多,但是vim中依然有很多东西没有讲到,时不时发现一些使用技巧
- 在学中练,在练中学。熟能生巧,肌肉记忆
- 衡量投入产出比,是点到为止还是继续深入
继续练级
网络上有很多vim的资源,甚至练习的小游戏
- 《Practical vim》、中文版《Vim实用技巧》
- 《笨方法学vimscript》
- 学习和开发自己的插件
vim配置
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Sample vimrc "
" "
" Provided by: "
" Tuyk "
" "
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
syntax on " 自动语法高亮
" colorscheme xcode-default " 更换主题配色
" ======================...Basic Start...====================== "
" Turn on line numbering " 显示行号
set number
" Save 1,000 items in history " 设置历史行号
set history=1000
" Show the line and column number of the cursor position " 设置光标的位置值
set ruler
" Display the incomplete commands in the bottom right-hand side of your screen.
set showcmd
" Display completion matches on your status line
set wildmenu
" Show a few lines of context around the cursor
set scrolloff=5
" Highlight search matches " 设置查找的值高亮显示
set hlsearch
" Enable incremental searching " 设置边搜索边高亮
set incsearch
" Ignore case when searching " 设置忽略查找选项的大小写
set ignorecase
" Override the 'ignorecase' option if the search pattern contains upper case characters.
set smartcase
" Turn on file backups
set backup
" Don't line wrap mid-word.
set lbr
" Copy the indentation from the current line. " 设置自动复制上一行的缩进到下一行
set autoindent
" Enable smart autoindenting. " 设置自动识别“{}”缩进,写代码非常有用
set smartindent
" Use spaces instead of tabs " 使用空格替换tab
set expandtab
" Enable smart tabs
set smarttab
" Make a tab equal to 4 spaces
set shiftwidth=4 " 默认缩进4个空格
set tabstop=4 " tab 代表4个空格
set softtabstop=4 " 使用tab时 tab空格数
" 按F2进入粘贴模式
set pastetoggle=<F2>
" 设置折叠方式
" set foldmethod=indent
" 开启系统剪贴板
set clipboard=unnamed
" 解决中文乱码
set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936
set termencoding=utf-8
set encoding=utf-8
" Tell vim what background you are using " 设置背景颜色
" set bg=light
" set bg=dark
" 退格删除键不能用
set backspace=indent,eol,start
" ======================...Basic End...====================== "
" ======================...Mapping Start...====================== "
" Map Y to act like D and C, i.e. yank until EOL, rather than act like yy " Map 映射
" map Y y$
" Remap VIM 0 to first non-blank character
" map 0 ^
noremap <space> viw
" change the mapleader from \ to , " 一些方便的映射
" NOTE: This has to be set before <leader> is used.
let mapleader=','
let g:mapleader=','
" 使用 jj 进入 normal模式
inoremap jj <Esc>`^
" 使用 <leader>+w 直接保存
inoremap <leader>w <Esc>:w!<cr>
noremap <leader>w :w!<cr>
" 切换 buffer
nnoremap <silent> [p :bprevious<cr>
nnoremap <silent> [n :bnext<cr>
" use ctrl+h/j/k/l switch window
noremap <C-h> <C-w>h
noremap <C-j> <C-w>j
noremap <C-k> <C-w>k
noremap <C-l> <C-w>l
" Sudo to write
cnoremap w!! w !sudo tee % >/dev/null
" NERDTree
map <leader>v :NERDTreeFind<CR>
map <leader>g :NERDTreeToggle<CR>
" ctrlp.vim
let g:ctrlp_map = '<c-p>'
" vim-easymotion
nmap ss <Plug>(easymotion-s2)
" vim-go
autocmd BufNewFile,BufRead *.go setlocal noexpandtab tabstop=4 shiftwidth=4
" python-mode
let g:pymode_python = 'python3'
let g:pymode_trim_whitespaces = 1
let g:pymode_doc = 1
let g:pymode_doc_bind = 'K'
let g:pymode_rope_goto_definition_bind = '<C-]>'
let g:pymode_lint = 1
let g:pymode_lint_checkers = ['pyflakes', 'pep8', 'mccabe', 'pylint']
let g:pymode_options_max_line_length = 120
" tagbar
nnoremap <leader>t :TagbarToggle<CR>
" deoplete.nvim
let g:deoplete#enable_at_startup = 1
set completeopt -=preview " 关闭预览窗口
" vim-gitgutter
set updatetime =100
" ======================...Mapping End...====================== "
" ============================================================================== "
" json 格式化
com! FormatJSON %!python3 -m json.tool
" ============================================================================== "
" ======================...Plugins Start...====================== "
" 插件设置,这里使用了 vim-plug
call plug#begin('~/.vim/plugged')
" 安装插件只需要把 github 地址放到这里重启后执行 :PlugInstall 就好了
Plug 'mhinz/vim-startify'
Plug 'vim-airline/vim-airline'
Plug 'vim-airline/vim-airline-themes'
Plug 'Yggdroot/indentLine'
Plug 'scrooloose/nerdtree'
Plug 'ctrlpvim/ctrlp.vim'
Plug 'easymotion/vim-easymotion'
Plug 'tpope/vim-surround'
Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' }
Plug 'junegunn/fzf.vim'
Plug 'ggreer/the_silver_searcher'
Plug 'brooth/far.vim'
Plug 'fatih/vim-go', { 'do': ':GoUpdateBinaries' }
Plug 'python-mode/python-mode', { 'for': 'python', 'branch': 'develop' }
Plug 'majutsushi/tagbar'
Plug 'lfv89/vim-interestingwords'
if has('nvim')
Plug 'Shougo/deoplete.nvim', { 'do': ':UpdateRemotePlugins' }
else
Plug 'Shougo/deoplete.nvim'
Plug 'roxma/nvim-yarp'
Plug 'roxma/vim-hug-neovim-rpc'
endif
Plug 'neoclide/coc.nvim', {'branch': 'release'}
Plug 'sbdchd/neoformat'
Plug 'dense-analysis/ale'
Plug 'tpope/vim-commentary'
Plug 'tpope/vim-fugitive'
Plug 'airblade/vim-gitgutter'
Plug 'junegunn/gv.vim'
call plug#end()
" 插件相关配置
" 禁止 stratify 自动切换目录
let g:startify_change_to_dir = 0
" 启动时自动打开NERDTree
" autocmd vimenter * NERDTree
" ======================...Plugins End...====================== "
" ======================...Function Start...====================== "
" 定义函数SetTitle,自动插入文件头
func SetTitle()
if &filetype == 'python'
call setline(1, "\#!/usr/bin/env python")
call setline(2, "\# -*- coding:utf-8 -*-")
normal G
normal o
normal o
call setline(5, "if __name__ == '__main__':")
call setline(6, " pass")
endif
endfunc
" ======================...Function End...====================== "
" For more options see ":help option-list" and ":options".
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 tuyrk@qq.com
文章标题:1129-玩转Vim 从放弃到爱不释手
文章字数:14.6k
本文作者:神秘的小岛岛
发布时间:2019-11-05, 15:52:21
最后更新:2019-11-05, 16:03:00
原始链接:https://www.tuyrk.cn/imooc/1129-vim/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。