前言
在此之前。我对 vim 的认知使用情况也就是停留在使用 vim filename
打开文件,然后按 i
进入插入模式,之后 :wq
保存退出。因为大部分时间都是 win 使用的居多,要打开也就是 vs code 啥的,这种上古神器一般也就服务器上改动点啥玩意时进去用一下。一次看了一个分享了一些 vim 小技巧的视频后改变了对 vim 的认知又激起了我的兴趣了(卧槽,还能这么玩),后了解到在慕课网还出了个系列教程视频就去围观学习了一遍,所以就有了文章来记录一下一些命令。常用命令虽然就那些,但一些技巧快捷键使用起来也挺舒服的,各种加起来就多了。
vim 的几种模式
Vim 最常用的有四个模式,分别是:normal
(普通)模式,insert
(插入)模式,Command
(命令)模式,Visual
(可视)模式
normal(普通)模式:
进入 vim 后默认的是 normal
(普通)模式。使用 ESC 从插入模式回到普通模式
普通模式下可以进行各种命令操作和移动
insert(插入)模式
在插入模式中,可以按 ESC 键回到普通模式。
插入命令如下:
使用小写 a
(append)当前字符后面插入
使用小写 i
(insert)当前字符前面插入
使用小写 o
(open a line below)当前行的下面一行插入
使用大写 A
(append after line)当前行的最后面插入
使用大写 I
(insert before line)当前行的最前面的插入
使用大写 O
(append a line above)当前行的上面一行插入
vim 插入小技巧
快速纠错Ctrl + h
删除上一个字符Ctrl + w
删除上一个单词Ctrl + u
删除当前行
使用 Ctrl + c
代替 Esc
(但可能中断某些插件)或者 Ctrl + [
gi
快速跳转到你最后一次编辑的地方并且进入插入模式
Command(命令)模式
顾名思义,执行 vim 命令 比如 保存 :w
,退出 :q
比如分屏 :vs
(vertical split) :sp
(split)
比如使用 :% s/foo/bar/g
全局替换
Visual(可视)模式
Normal 模式下是用 v
进入 visual 选择
使用 V
选择行
使用 ctrl + v
进行方块选择
快速移动大法
vim normal
模式下使用反人类的 h
j
k
l
来移动光标。
在单词间[飞舞]
单词之间移动是游览操作中最常使用的命令w
/W
移动到下一个 word/WORD 开头e
/E
移动到下一个 word/WORD 结尾b
/B
回到上一个 word/WORD 开头可以理解为 backword
注:word 指的是以非空白符分割的单词 WORD 以空白符分割的单词
行间搜索移动
同一行快速的移动方式其实是搜索一个字符并且移动到该字符上
使用 f{character}
可以移动到 char 字符上(例如 fa
)
t{character}
移动到 char 的前一个字符
大写 F{character}
表示反过来搜索前面的字符
如果第一次没搜到,可以使用分号 ;
)/,
逗号继续搜该行下一个/上一个
vim 水平移动
如何快速的移动到一行的行首或者行尾?
0
移动到行首的第一个字符 ^
移动到第一个非空白字符
$
移动到行尾 g_
移动到行尾非空白字符
记住常用的 0
和 $
就可以满足日常需求了,非空白字符移动了解即可一般很少使用
vim 垂直移动
我们还可以在句子和段落之间移动(了解知道有就行,不常用,而且中文和英文下区分句子和段落不一样)
使用 (
/ )
在句子间移动
使用 {
/ }
在段落之间移动
具体使用你也可以用 :help(
来查看帮助
vim 页面移动
翻页命令太多。2/8 定律,记住常用的就能满足需求
gg
/ G
移动到文件开头和结尾。你可以使用 Ctrl +o
快速返回
H
/ M
/ L
跳转到屏幕的开头(head)。中间(middle)和结尾(lower)
Ctrl +u
Ctrl +f
上下翻页(upword/forward)zz
可以把当前显示置为屏幕中间
[color=#536D92]注:以上命令都是在 normal
模式下使用[/color]
vim 快速增删改查
增加字符就是进入插入模式敲键盘就行
vim 快速删除
如何快速删除一个字符或者单词
vim 在 normal 模式下使用 x
快速删除一个字符
使用 d
(delete)配合文本对象快速删除一个单词 daw(d around word)
d
和 x
可以搭配数字可以多次使用,比如
v
/V
选中光标里的内容,按小 v
后进入单字符选择模式,按 hl
即可左右选择配合 x
来删除,大 V
后进入单行选模式,按 kj
即可上下选择配合 d
来进行整块删除。
daw
(删除一个单词及周围字符)
diw
(删除一个单词保留后边字符)
dd
(删除一行)
d0
(一行里快速删除光标前面的内容)
d$
(一行里快速删除光标后面的内容)
dt{character}
(当光标在座括号里时,使用该命令删除到又括号里的内容)比如要删除(一个括号里的内容)就 dt)
拓展:u
(恢复到之前的状态)
ctrl+R
(回到上一次修改的状态)
vim 快速修改
相比删除,更常用修改,一般是删除之后改成我们期望的文本
常用的三个 r (replace),c(change),s(substitute)
normal 模式下使用 r
可以替换一个字,(比如 xiaomo,光标停留在最后的 o 上面按 ri
就会变成 xiaomi)
大 R
的作用就是不间断的替换光标之后的内容
s
就是删除当前字符并且进入插入模式,也可以配合数字进行使用比如 4s
大 S
的作用就是删除一整行并且进入插入模式
使用 c
配合文本对象,我们可以快速进行修改
ac(修改光标下的字符为 c)
caw
(删除当前单词并且进入插入模式)
cw
当光标在一个单词里时按下可以快速删除并且进如插入模式
ct{character}
此命令和上面的删除命令用法一样 ct(
(当光标在座括号里时,使用该命令删除到右括号里的内容),然后进入插入模式
vim 查询
查询单词也是一个常用操作
使用 /
或者 ?
进行前向或者反向搜索 (用法; /字符)
使用 n
/N
跳转到下一个或者上一个匹配
使用 *
或者 #
进行当前单词的前向或者后向匹配
vim 如何搜索替换
substitute 命令允许我们查找并且替换掉文本,并且支持正则式
vim 替换命令:[range]s[ubstitiute]/{pattern}/{string}/[flags]
range 表示范围 比如;10,20 表示 10-20 行,% 表示全部
pattern 是要替换的文本,string 是替换后文本
flags 表示替换标志性,flags 有几个常用的标志:g
c
n
flags 有几个常用的标志:
g(global)表示全局范围内执行
:% s/要替换的词/替换的词/g
:1,9 s/要替换的词/替换的词/g
c(confirm)表示确认,可以确认或者拒绝修改:% s/要替换的词/替换的词/c
n(number)报告匹配到的次数而不是替换,可以用来来查询匹配次数:% s/要查询的词/(只做查询并不是真的替换,可留空)/n
Vim 多文件操作
在 vim 里它有几个概念 Buffer Window Tab
Buffer
是指打开的一个文件的内存缓存冲区
Window
窗口是 Buffer 可视化的分割区域
Tab
可以组织窗口为一个工作区
Buffer - 什么是缓冲区?
vim 打开一个文件后会加载内容到缓冲区
之后的修改都是针对内存中的缓冲区,并不会直接保存到文件
直到我们执行 :w
的时候才会把修改内容写入到文件里
Buffer 之间的切换:
使用 :ls
会列举当前缓冲区,当打开多个文件时,然后用 :b n
跳转到第 n 个缓存区
:bpre
:bnext
:bfirs
t :blast
或者使用 :b buffer_name
加上 tab 补全来跳转
Windows 窗口
一个缓冲区可以分割成多个窗口,每个窗口也可以打开不同的缓冲区
<Ctrl+w>s
水平分割 <Ctrl+w>v
垂直分割或者 :sp
和 :vs
每个窗口可以据徐被无限分割(就看你屏幕是否够大了 #手动滑稽)
如何切换窗口:
切换窗口的命令都是使用 Ctrl+w
作为前缀
<C-w>w
在窗口间循环切换
<C-w>h
切换到左边的窗口
<C-w>j
切换到下边的窗口
<C-w>k
切换到上边的窗口
<C-w>l
切换到右边的窗口
窗口下使用 :e buffer_name
可以打开不同的 Buffer
<C-w>L
当光标在左边时,把左边的窗口的内容移动到右边的窗口
<C-w>H
把右边的窗口的内容移动到左边的窗口
Tab(标签页)将窗口分组
vim 的 Tab 和其他编辑器不太一样,可以想象成 Linux 的虚拟桌面
比如一个 Tab 全用来写 PHP 文件,另一个 Tab 全是 HTML 文件
相比窗口,Tab 一般用的很少,Tab 太多管理起来也比较麻烦
Vim 复制粘贴与寄存器的使用
Vim Normal 模式复制粘贴
复制粘贴分别使用 y
(yank)和 p
(put),剪贴命令 d
和 p
我们可以使用 v
(visual)命令选中所需要复制的地方,然后使用 p
粘贴
配合文本对象:比如使用 yiw
复制一个单词,yy
复制一行
Insert 模式下的复制粘贴
这个和其他的文本编辑器差不多,但是粘贴代码有个坑
在 vimrc 中设置了 :set autoindent
后,
粘贴 python 代码缩进错乱
这个时候需要使用 :set paste
和 :set nopaste
解决
什么是 vim 的寄存器
你有没有好奇?vim 在 normal 模式下复制/剪贴的内容去了哪?
vim 里操作的是寄存器而不是系统剪贴板,这和其他编辑器不同
默认我们使用 d 删除或者应负责的内容都放了“无名寄存器”
用 x 删除一个字符放到无名结存器,然后 p 粘贴,可以换调两个字符
深入寄存器(register)
Vim 不使用单一剪贴板进行剪贴,复制与粘贴,而是多组寄存器
通过 "{register}
前缀可以指定寄存器,不指定就默认无名寄存器
比如使用 “ayiw
复制一个单词带无名寄存器 a
中,"bdd
删除当前行到寄存器 b
中
Vim 中 ""
表示无名寄存器,缺省使用。"" p
其实就等同于 p
食用 f 方法::reg {register}
查看当前寄存器里的内容,比如 :reg a
查看 a 寄存器里的内容,使用 “{register} p
来粘贴当前寄存器里的内容,比如 “a p
其他常见寄存器
除了有无名寄存器以及 a-z,Vim 中还有一些其他常见寄存器
复制专用寄存器,"0
使用 y
复制文本同时会被拷到复制寄存器 0
系统剪贴板 "+
可以在复制前加上 "+
复制到系统剪贴板
其他一些寄存器比如 "%
当前文件名,".
上次插入的文本(不常用,了解知道即可)
系统剪贴板食用方法:比如有需求从 vim 李复制内容到其他地方,这时候就要用到系统剪贴板。但首先要确保 vim 里的编译选项里有 clipboard
查看方法 :echo has('clipboard')
,如果输出是 1 的话,就说明支持这个特性。具体使用方法和上面深入寄存器里一样的大同小异的用法,比如可以使用 "+y
复制当前行到系统剪贴板,然后其他地方使用粘贴命令即可,同样其他地方复制的,vim 里也可以使用 "+p
来调用系统剪贴板里的内容。
当然如果你嫌每次前面都要带个 "+
很麻烦的话,可以使用命令 :set clipboard=unnamed
来让你直接复制粘贴系统结贴板的内容,比如 y
,d
,p
。同样 insert 模式里也可以使用 Ctrl+R+
来直接粘贴系统剪贴板的内容
Vim 如何用宏完成强大的批量操作
强大的 Vim 宏(macro)
从一个需求说起,给多行 url 链接加上双引号,你会怎么做?
https://moshanghua.net
https://moshanghua.net
https://moshanghua.net
https://moshanghua.net
什么是 Vim 宏(macro)
宏可以看成是一系列命令的合集、
我们可以使用宏[录制]一系列操作,然后用于[回放]
宏可以非常方便地把一系列命令用在多行文本上
如何使用宏
宏的使用分为录制和回放
Vim 使用 q 来录制,同时也使用 q 结束录制
使用 q{register}选择要保存的寄存器,把录制的命令保存在其中
适用@{register}回放寄存器中保存的一系列命令
用宏解决刚才的问题
先给一行加上双引号,然后再回放到其他所有行
我们先使用 q 来开始录制,给一行加上双引号,之后使用 q 退出
在剩下的所有行中回放录制的宏
食用方式:
首先使用 q
来录制,但 q
后面需要跟一个寄存器名称,表示我们把它放到寄存器里,比如这里使用 a
,就按 qa
然后使用大 I 跑到当前行的开头并且进入插入模式,然后按下"添加在开头后,按 Esc 返回 normal 模式
再按一下大 A 跑到当前行的结尾,再按一下"添加在结尾,然后又按 Esc 返回 normal 模式
最后在按一下 q
结束录制
接下来我们就可以使用宏利
按 j
移动到下一行后,用 @
带上刚才保存录制的寄存器 a
来回放宏,@a
就可以轻松的给当前行加上。
但加入链接成百上千时,显然这样也是不行的。这下这里就要使用 vim 的一个特性了,在命令行下面去执行 normal 模式下的命令
首先我们可以使用大 V 行选,然后使用 j 下移(大 G 可以直接移到到行尾),就可以实现部分选择或者全选操作
接下来就使用命令行模式 :
,在所有行执行 normal
命令,空格加上 @
回放寄存器 a
里面的内容(:normal @a
)然后按回车就可以了
关于在命令行下面去执行 normal 模式下的命令来完成批量操作还可以这样实现(不使用宏)
首先我们可以使用大 V 行选,然后使用 j 下移(大 G 可以直接移到到行尾),就可以实现部分选择或者全选操作
接下来就使用命令行模式 :
,在所选行执行 normal
命令,空格后面加上大 I"
表示在行首插入(:normal I"
),然后按下回车。
然后我们还可以按下 :
,按下 ctrl+p
去找到上一个命令,
当命令 :normal I"
出来后,用删除键把 I"
删掉按下 A"
换成行尾插入,这时候在回车一下。
Vim 补全大法
什么是补全?
只要手速块,补全什么的都是浮云
补全是根据当前环境上下文由编辑器[猜]你想输入的东西
比如补全一个单词,文件名,或者代码中的函数名,变量名等
vim 提供了多种补全功能,还可以由插件拓展功能实现代码补全
Vim 常见的补全方式
<C-n> 普通关键字补全
<C-x><C-n> 当前缓冲区关键字
<C-x><C-i> 包含文件关键字
<C-><C-]> 标签文件关键字
<C-><C-k> 字典查找
<C-><C-l> 整行补全
<C-><C-f> 文件名补全
<C-><C-o> 全能(omni)补全
常见的三种补全类型
使用 ctrl+n 和 ctrl+p 补全单词
使用 ctrl+x 和 ctrl+f 补全文件名
使用 ctrl+x 和 ctrl+0 补全代码,需要开启文件类型检查(:filetype on
)查询(:set filetype
),安装插件
Vim 更换配色
使用 :colorscheme
显示当前的主题配色,默认是 default
用:colorscheme <ctrl+d> 可以显示所有的配色
有中意的配色后,用 :colorscheme 配色名
就可以修改配色
默认的没有喜欢的也可以从网上下载自己喜欢的配色来进行安装使用
食用方法:
首先先 git clone
克隆下来自己喜欢主题的 github 地址,
比如:https://github.com/w0ng/vim-hybrid.git
然后我们要做的就是把克隆下来的文件夹 colors 里的主题文件复制或者移动到 vim 的 colors 主题文件夹里去,
这里我们可能要先创建个 .vim
的文件夹,自己可以使用命令查询下,如果有了就直接创建个 .vim 下的 colors 文件夹,mkdir .vim/colors
接下来我们就可以使用复制 cp
命令把它克隆进去 cp vim-hybrid/colors/hybrid.vim ~/.vim/colors/hybrid.vim
。
然后去 vim 里用 :colorscheme hybrid
就可以修改启用配色了
注:想要持久化配色需要把配置写到。vimrc 里去
未完待续...
作者:moshanghua
版权属于:字节星球/肥柴之家 (转载请联系作者授权)
原文链接:https://www.bytecho.net/archives/vim.html
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
太棒了 学习了@(真棒)