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/gu:撤销操作
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
endfunc3-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 = 100gv.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" 转载请保留原文链接及作者。
 
            