本篇是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内上下左右对应的
k
j
h
l
方向键,记住j
是下就好将切换窗口的方向快捷键改为大写效果是移动窗口
在不同窗口编辑同一个Buffer,所有的Buffer都会生效,因为都是编辑的同一块内存里的内容
替换操作
substitute命令允许我们查找并且替换掉文本,并且支持正则式
:[range]s[ubstitute]/{pattern}/{string}/[flags]
range
表示范围,比如:10, 20
表示10-20行,%
表示全部
s
substitute:表示替换
pattern
是要替换的文本,string
是替换后文本
flage
是替换标志,一般有:
g
global:表示全局范围内执行c
confirm:表示确认,可以确认或者拒绝修改n
number:报告匹配到的次数而不替换,可以用来查询某个单词出现的次数,例如::% 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好主题的仓库
git clone https://github.com/w0ng/vim-hybrid.git
然后在用户根目录下创建.vim/colors
文件夹,如果没有.vim
文件夹需要先创建好.vim
文件夹
mkdir ~/.vim
mkdir ~/.vim/colors
接着把hybird主题文件夹内的Vim主题文件拷贝到刚创建好的colors文件夹内
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下新建一个隐藏文件
vim ~/.vimrc
接着我们就可以开始自定义自己的配置了
Vimrc配置文件的内容
配置文件内需要设置的东西有以下四种:
常用设置,我们可以把常用的设置写到
.vimrc
内避免每次打卡爱vim重新设置,比如:set number
设置行号,colorscheme xxx
设置主题Vim内有非常多这种配置,可以参考别人的配置,常用的有:
" 设置行号 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中的映射概念和常用的映射配置
- 设置一下leader键
插件的配置,现代化的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
文件内,这里提供一些常用的映射配置:
" 把leader键映射为','
let mapleader=','
" 使用 jj 进入 normal 模式
inoremap jj <Esc>`^
" 使用 leader+w 直接保存
inoremap <leader>w <Esc>:W<Cr>
noremap <leader>w :W<cr>
" 切换buffer
nnoremap <silent> [b :bprevious<CR>
nnoremap <silent> [n :bnext<CR>
" 使用 ctrl+h/j/k/l 切换 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 强制写入
cnoremap w!! w !sudo tee % >/dev/null
" json格式化 这是命令模式下的映射
com! FormatJSON %!python3 -m json. tool
可以研究下笨方法学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:
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
如果使用的是Neovim,则使用以下命令:
curl -fLo ~/.local/share/nvim/site/autoload/plug.vim --create-dirs \
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
vim-plug的使用
编写配置文件
在.vimrc
文件内写入一行call plug#begin()
,指定插件安装的目录
然后在中间列出要安装的插件,格式为Plug 'xxx'
,注意插件名称前后必须使用单引号
最后在结尾加上一行call plug#end()
就可以安装插件了
可以参考文档给出的示例进行编写:
" Specify a directory for plugins:指定一个插件目录
" - For Neovim: stdpath('data') . '/plugged'
" - Avoid using standard Vim directory names like 'plugin':避免使用标准的Vim目录名称,例如“插件”
call plug#begin('~/.vim/plugged')
" Make sure you use single quotes:确保使用单引号
" 列出要安装的插件,例如:
Plug 'mhinz/vim-startify'
" Initialize plugin system:初始化插件系统
call plug#end()
这里起作用的代码其实就三行: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/