本篇是b站up主PegasusWang老师的玩转Vim 从放弃到爱不释手教程笔记,在大学的时候使用过vim,但只是停留非常低级的操作阶段,也在其他地方零散的学习过Vim,直到在b站发现了PegasusWang的视频,非常不错,是目前看到过最好的vim入门教程,经过几天的学习,Vim已经近乎熟练,再次感谢PegasusWang的无私奉献,笔记还会持续更新。
Vim编辑器的四种模式
Normal(普通)模式
使用vim打开文件时显示的模式,只可以查看,不可以做任何编辑操作
进行所有操作之后可以单击u(undo)来撤销操作
移动操作
w/W 移到下一-个word/WORD开头。e/E 下一个word/WORD尾
b/B 回到上一-个word/WORD开头,可以理解为backword
word指的是以非空白符分割的单词,WORD以空白符分割的单词
搜索操作
同一行快速移动的方式其实是搜索一个字符并且移动到该字符
f{char} 可以把光标移动到当前行的char字符上,t把光标移动到char的前一个字符
如果第一次没搜到,可以用分号;和逗号,继续搜该行里的下一个/上一个char字符
大写的F{char}表示反过来搜前面的字符
快速移动到一行的行首或者行尾
0 移动到行首第一个字符,^移动到第一个非空白字符
$ 移动到行尾,g_ 移动到行尾非空白字符
记住常用的0和$就可以满足日常需求了
页面移动
gg / G 移动到文件开头和结尾,你可以使用ctrl+o快速返回
H / M / L 跳转到屏幕的开头(Head),中间(Middle)和结尾(Lower)
Ctrl+u / ctrl+f 上下翻页 (upword/forward)
zz 把当前光标放置到屏幕置中间
删除操作
x 快速删除一个字符
dw delete word:快速删除一个单词
dd 快速删除当前整行内容
修改操作
常用有三个,r (replace) , c (change) ,s(substitute)
r可以替换一个字,s替换并进入插入模式
cw *change word:** 快速删除一个单词并且进入编辑模式
查询操作
/ 或者 ? 进行前向或者反向搜索
n / N 跳转到下一个或者上一个匹配
Normal下的复制粘贴
复制剪切分别使用y(yank)和p(put),剪切用d
我们可以使用v(visual)命令进入可视模式选中所要复制的地方,然后使用p粘贴
配合文本对象:比如使用yw复制一个单词, yy复制一行
编辑/插入模式
普通模式下单击以下字母进入编辑/插入模式
i insert: 在当前光标位置前面开始插入
I insert before line: 光标调到当前行最前面开始插入
a *append: *在当前光标位置后面开始插入
A append after line: 光标跳到当前行最后面开始插入
o open a line below: 在当前光标所在行下面新加一行开始插入
O open a line above: 在当前光标所在行上面新加一行开始插入
按Esc可以退出编辑模式进入普通模式,我在
.vimrc里配置了jj映射来方便地进入普通模式
快捷键
gi 快速返回上一次编辑的位置
终端中和vim插入模式下都可以使用的快捷键:
ctrl+h 删除上一个字符
ctrl+w 删除上一个单词
ctrl+u 删除当前行
ctrl+a 移动到开头
ctrl+e 移动到结尾
ctrl+b 往前移动
ctrl+f 往后移动
命令模式
普通模式下单击冒号:进入命令模式
保存退出方式
:q quite 退出
:w write 写入/保存
:wq write & quite 保存然后退出
ZZ 作用等同于:wq
:e! 禁止刚刚所有修改
多文件操作
Buffer、Window、Tab区别:
Buffer是指打开的一个文件的内存缓冲区- Vim打开一个文件后会加载文件内容到缓冲区
- 之后的修改都是针对内存中的缓冲区,并不会直接保存到文件
- 直到我们执行
:w(write)的时候才会把修改内容写入到文件里
Window是Buffer可视化的分割区域- 一个缓冲区可以分割成多个窗口, 每个窗口也可以打开不同缓冲区
- 每个窗口可以继续被无限分割(看你屏幕是否够大)
Tab可以组织窗口为一-个工作区.- Vim的Tab和其他编辑器不太一样,可以想象成Linux的虚拟桌面
- 比如一个Tab全用来编辑Python文件,一个Tab全是HTML文件
- 相比窗口,Tab一般用的比较少,Tab太多管理起来也比较麻烦
打开多个Buffer(缓冲区):
- 使用
:e {文件名}可以打开多个文件,这时虽然只有一个窗口,但是却有多个Buffer(缓冲区)
在Buffer(缓冲区)之间切换:
- 使用
:ls会列举当前缓冲区,然后使用:b n跳转到第n个缓冲区
- 使用
:bpre:bnext:bfirst:blast来跳转到 上一个/下一个/第一个/最后一个 缓冲区 - 或者用
:b {buffe名称}加上tab补全来跳转缓冲区
分割Window(窗口)命令:
<Ctrl+w>+s或:sp水平分割<Ctrl+w>+v或:vs垂直分割,:q来退出分屏- 使用
:sp {文件路径}或:vs {文件路径}可以在横竖分屏时直接打开指定的文件
在Window(窗口)之间切换:
<Ctrl+w>+w在窗口间循环切换
<Ctrl+w>+h切换到左边的窗口<Ctrl+w>+j切换到下边的窗口<Ctrl+w>+k切换到上边的窗口<Ctrl+w>+l切换到右边的窗口
可以使用
:q/:wq来关闭分屏切换窗口快捷键就是vim内上下左右对应的
kjhl方向键,记住j是下就好将切换窗口的方向快捷键改为大写效果是移动窗口
在不同窗口编辑同一个Buffer,所有的Buffer都会生效,因为都是编辑的同一块内存里的内容
替换操作
substitute命令允许我们查找并且替换掉文本,并且支持正则式
:[range]s[ubstitute]/{pattern}/{string}/[flags]
range 表示范围,比如:10, 20表示10-20行,%表示全部
s substitute:表示替换
pattern 是要替换的文本,string 是替换后文本
flage 是替换标志,一般有:
gglobal:表示全局范围内执行cconfirm:表示确认,可以确认或者拒绝修改nnumber:报告匹配到的次数而不替换,可以用来查询某个单词出现的次数,例如::% s/java//n(因为是查询所以java后面留空)
例如:
:% s/java/python/g表示在整个文件内把“java”替换为“python”,
%:所有文件s:替换g:全局替换
解决粘贴缩进混乱的操作
:set paste 保留原格式粘贴,先执行该命令,再按i进入编辑模式粘贴就会保留原文件格式
:set nopaste 关闭粘贴命令
h paste 显示粘贴命令帮助,:exit退出帮助
其他操作
:set nu 显示行号
:% s/java/python/g 全局替换字符,把“java”替换为“python” %:所有文件 s:替换 g:全局替换
Visual(可视)模式
v 进入VISUAL选择模式,会选中当前字符,左右移动光标可以连续选中左右字符,上下移动光标会选中整行字符
V 选中当前行,上下移动光标可以连续选中上下整行字符
ctrl + v 进入VISUAL BLOCK:列选择/块选择模式,用于列编辑
在visual模式下:
y yank:复制
d 剪切
p put:粘贴
dd 删除一行
yy 复制一行
给vim更换配色
使用普通命令方式更换第三方配色
以hybrid主题为例,先在用户根目录下clone好主题的仓库
1 | git clone https://github.com/w0ng/vim-hybrid.git |
然后在用户根目录下创建.vim/colors文件夹,如果没有.vim文件夹需要先创建好.vim文件夹
1 | mkdir ~/.vim |
接着把hybird主题文件夹内的Vim主题文件拷贝到刚创建好的colors文件夹内
1 | cp vim-hybrid/colors/hybrid.vim ./.vim/colors |
最后用Vim任意打开一个文件,键入:colorscheme,敲一个空格后按ctrl+d,就可以看到Vim可以更换的所有主题配色了
接着输入你想更换的配色的名字,点击回车,可以看到vim编辑器的配色就被成功更改了
这种方式不能持久化的更改vim编辑器的配色
Vim配置文件的使用
Vim里非常多常用的设置,比如:set number设置行号,之前的使用都是在Vim里临时设置,没法持久化,每次都要重新设置
但是Vim还提供了一种持久化配置的方式,使用.vimrc配置文件,让我们自定义配置
新建Vim配置文件
Linux/Unix下新建一个隐藏文件
1 | vim ~/.vimrc |
接着我们就可以开始自定义自己的配置了
Vimrc配置文件的内容
配置文件内需要设置的东西有以下四种:
常用设置,我们可以把常用的设置写到
.vimrc内避免每次打卡爱vim重新设置,比如:set number设置行号,colorscheme xxx设置主题Vim内有非常多这种配置,可以参考别人的配置,常用的有:
1
2
3
4
5
6
7
8
9
10" 设置行号
set number
" 设置主题
colorscheme hybrid
" 按F2进入粘贴模式
set pastetoggle=<F2>
" 高亮搜索
set hlsearch
" 设置折叠方式
set foldmethod=indent
Vim映射配置,Vim中的映射比较复杂,源于Vim有多种模式
设置一下leader键
let mapleader = ‘,’常用的是逗号或空格比如
noremap <leader>w :w<cr>保存文件在下面映射章节有详细讲解Vim中的映射概念和常用的映射配置
插件的配置,现代化的Vim可以通过插件管理器安装插件
- 通过插件可以无限扩充Vim的功能
- 使用插件需要具备一定的Vim配置知识
- 在下面插件章节有详细讲解如何安装和使用常用插件
Vim脚本函数配置,Vim有可以自定义的脚本语言vimscript
- Vim脚本对于Vim高级玩家来说可以实现强大的vim插件
- 初学者知道有这个概念就好, vim脚本是一种简单的脚本语言
- 可以通过vimscript实现更多vim的控制,开发自己的插件
可以研究下github上vim-go教程vim-go-tutorial的vimrc文件
这个文件是使用vim写go语言的一个最小配置,基本涵盖了一个编程语言需要设置的选项,可以用来参考学习
通过把vimrc配置放到git版本备库管理,可以同步到其他电脑或者服务器上
Vim映射的使用
Vim映射就是把「一个操作」映射到「另一个操作」
如果你不满现在的按键设置,比如vim本来的命令,或者你想映射一些方便的快捷键时,按照你的意愿定制Vim
基本映射
基本映射指的是normal模式下的映射,当然还有其他模式的映射
使用map就可以实现映射。比如:
map- x 表示按-就会删除字符
map <space> viw 表示按下空格的时候选中整个单词
map <c-d> dd 表示使用ctrl+d执行dd删除一行
模式映射
Vim常用模式normal/visual/insert都可以定义映射
用nmap/vmap/imap定义映射只在normal/visual/insert分别有效,比如:
:vmap \ U 表示把在visual模式下选中的文本用\转换大小写 (u/U转换大小写)
:imap <d-d> <Esc>ddi 表示在insert模式下用ctrl+d删除一行
递归映射与非递归映射
递归映射
*map系列命令有递归的风险,例如定义了以下两个映射:
:nmap \ - 和 :nmap - dd
当你按下\时, Vim会解释其为-,我们又映射了-,Vim会继续解析为dd,即它会删除整行,即有点类似于递归
通常情况是你安装了一个插件,插件映射了同一个按键的不同行为,有冲突就会有一个失效,解决方案就是使用非递归映射
非递归映射
Vim提供了非递归映射,这些命令不会递归解释
使用*map对应的nnoremap/vnoremap/inoremap
「任何」时候都应该使用非递归映射,防止自己的命令和其他命令冲突
一些方便的映射
以上的设置映射的命令都可以去掉冒号:持久化到.vimrc文件内,这里提供一些常用的映射配置:
1 | " 把leader键映射为',' |
可以研究下笨方法学Vimscript这本书中映射章节的内容
Vim插件的使用
和其他现代流行编辑器一样, Vim同样支持强大的插件扩展
Vim 插件是使用vimscript或者其他语言编写的vim功能扩展,编辑器自带的功能有限,有了插件之后几乎可以无限制扩充其功能
网络上比如github.com等有很多开源的vim插件可以使用
插件的安装
原始的方式是直接clone插件代码,如今vim有很多插件管理器可供选择,你可以选择一个顺手的使用
常见的有vim-plug,、Vundle、 Pathogen、Dein.Vim、volt等
综合性能、 易用性、文档等几个方面,这里推荐使用vim-plug
vim-plug的安装
进入vim-plug插件的github仓库:https://github.com/junegunn/vim-plug
根据文档内容,在终端输入命令安装vim-plug:
1 | curl -fLo ~/.vim/autoload/plug.vim --create-dirs \ |
如果使用的是Neovim,则使用以下命令:
1 | curl -fLo ~/.local/share/nvim/site/autoload/plug.vim --create-dirs \ |
vim-plug的使用
编写配置文件
在.vimrc文件内写入一行call plug#begin(),指定插件安装的目录
然后在中间列出要安装的插件,格式为Plug 'xxx',注意插件名称前后必须使用单引号
最后在结尾加上一行call plug#end()就可以安装插件了
可以参考文档给出的示例进行编写:
1 | " Specify a directory for plugins:指定一个插件目录 |
这里起作用的代码其实就三行:
call plug#begin('~/.vim/plugged')、Plug 'mhinz/vim-startify'和call plug#end()
安装第一个vim插件
我们将安装vim-startify,一个好用的vim开屏插件:vim-startify
根据仓库内的文档教程,修改你的.vimrc文件,增加该插件名称:Plug 'mhinz/vim-startify'
重新启动Vim或者使用:source ~/.vimrc ,然后执行:PlugInstall就可以开始安装插件了
安装完成后,回到终端重新启动vim就可以看到该插件的效果了,其他插件的安装方式也都类似
Vim插件网站:https://vimawesome.com/