Vim笔记

Xiaomo

分类: Vim 81 0

前言

在此之前。我对vim的认知使用情况也就是停留在使用vim filename 打开文件,然后按i进入插入模式,之后:wq保存退出。因为大部分时间都是win使用的居多,要打开也就是vs code啥的,这种上古神器一般也就服务器上改动点啥玩意时进去用一下。一次看一个分享了一些vim小技巧的视频后改变了对vim的认知又激起了我的兴趣了(卧槽,还能这么玩)后了解到在慕课网还出了个系列教程视频就去围观学习了一遍,所以就有了本文章来记录一下一些命令,以备自己有所需时可以快速查看一下。常用命令虽然就那些,但一些技巧快捷键使用起来也挺舒服的,各种加起来就多了。要学会使用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 模式下使用反人类的hjki来移动光标。

在单词间[飞舞]

单词之间移动是游览操作中最常使用的命令
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可以把当前显示置为屏幕中间

注:以上命令都是在normal 模式下使用

vim快速增删改查

增加字符就是进入插入模式敲键盘就行


vim快速删除
如何快速删除一个字符或者单词


vim在normal模式下使用 x 快速删除一个字符
使用d(delete)配合文本对象快速删除一个单词daw(d around word)
dx 可以搭配数字可以多次使用,比如
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有几个常用的标志:gcn


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 :bfirst :blast
或者使用:b buffer_name 加上tab补全来跳转

Windows 窗口

一个缓冲区可以分割成多个窗口,每个窗口也可以打开不同的缓冲区
s水平分割 v垂直分割或者:sp :vs
每个窗口可以据徐被无限分割(就看你屏幕是否够大了 #手动滑稽)

如何切换窗口:

切换窗口的命令都是使用Ctrl+w作为前缀
w在窗口间循环切换
h切换到左边的窗口
j切换到下边的窗口
k切换到上边的窗口
l切换到右边的窗口
窗口下使用:e buffer_name可以打开不同的Buffer
L当光标在左边时,把左边的窗口的内容移动到右边的窗口
H把右边的窗口的内容移动到左边的窗口

Tab(标签页)将窗口分组

vim的Tab和其他编辑器不太一样,可以想象成Linux的虚拟桌面
比如一个Tab全用来写PHP文件,另一个Tab全是HTML文件
相比窗口,Tab一般用的很少,Tab太多管理起来也比较麻烦

Vim复制粘贴与寄存器的使用

Vim Normal模式复制粘贴
复制粘贴分别使用y(yank)和p(put),剪贴命令dp
我们可以使用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来让你直接复制粘贴系统结贴板的内容,比如ydp。同样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常见的补全方式

普通关键字补全
当前缓冲区关键字
包含文件关键字
标签文件关键字
字典查找
整行补全
文件名补全
全能(omni)补全


常见的三种补全类型
使用ctrl+n 和 ctrl+p补全单词
使用ctrl+x 和 ctrl+f补全文件名
使用ctrl+x 和 ctrl+0补全代码,需要开启文件类型检查(:filetype on)查询(:set filetype),安装插件

Vim更换配色

使用:colorscheme显示当前的主题配色,默认是default
用:colorscheme 可以显示所有的配色
有中意的配色后,用: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里去


未完待续…

  • 0人 Love
  • 0人 Haha
  • 0人 Wow
  • 0人 Sad
  • 0人 Angry
Vim、技巧快捷键、笔记

作者简介:Xiaomo

学无止境,生命不息,折腾不止!

共 0 条评论关于 “Vim笔记”

Loading...