Bootstrap

Linux学习系列四:光速掌握Vim,效率提升神器【划重点】



这个系列的Linux教程主要参考刘遄老师的《Linux就该这么学》。用的系统是RHEL8,如果遇见一些命令出现问题,请首先检查自己的系统是否一致,如果不一致,可网上查一下系统间某些命令之间的差异。

目前设计的这个Linux学习系列的目录如下:(会陆续更新~)

  1. Linux 学习系列一:Linux的简单介绍以及命令行的基本操作
  2. Linux 学习系列二:Linux中的常用命令
  3. Linux 学习系列三:管道符、重定向与环境变量
  4. Linux 学习系列四:光速掌握Vim,效率提升神器
  5. Linux 学习系列五:Shell命令脚本的基本语法
  6. Linux 学习系列六:用户身份与文件权限


\quad
\quad

在正文开始前,建议大家搜索一下Vim的好处,特别是结合一些代码编译器,Vim有多好用!具体的,在这里就不多说了,毕竟既然都点进来了,应该是了解一点Vim的吧?下面开始通关Vim吧!

Vim的基础知识

Vim概述

Vim是从vi发展出来的一个文本编辑器。代码补全、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。

Vim是一个功能强大的多模式编辑器, 是 Linux/UNIX 上最常用的文本编辑器, 它的作用是建立、编辑、显示文本文件。此外,Vim 没有菜单,只有命令。

vim 的官方网站((http://www.vim.org)。

Vim的设计理念是命令的组合。用户学习了各种各样的文本间移动/跳转的命令和其他的普通模式的编辑命令,并且能够灵活组合使用的话,能够比那些没有模式的编辑器更加高效的进行文本编辑。同时Vim与很多快捷键设置和正则表达式类似,可以辅助记忆。并且Vim针对程序员做了优化。

Vim有许多有用的功能,可以与现代文本编辑器竞争,如Sublime Text,Atom,UltraEdit或jEdit。它们包括支持正则表达式的搜索,轻松重复命令的能力,直接记录和执行宏,自动完成,文件合并,鼠标集成,拼写检查,语法突出显示,分支撤消/重做历史,支持流行网络协议和文件存档格式等。

虽然Vim的功能令人印象深刻,但其真正的优势在于其可扩展性。 Vim有自己的脚本语言,称为Vim脚本(也称为vimscript或VimL),用户可以通过多种方式使用它来增强Vim,例如为其他编程语言启用语法高亮,自动化语法检查或将Vim与其他应用程序和服务。

除了可扩展性之外,Vim还具有高度可配置性,包含Vim核心全局设置(称为vimrc)的文件可以在各个Vim安装之间共享。如果您不想在闲暇时间搞乱设置和编辑配置文件但仍希望充分发挥Vim的优势,可以从互联网上下载许多现成配置文件中的一个,或者使用Vim等工具创建一个配置。

提到Vim,你知道他的学习曲线吗?


快来和我一起通关Vim吧~

划重点:

Vim的四个模式

基本上,Vim有四种模式:

  • 普通模式(普通模式)(Normal-mode)
  • 插入模式(输入模式)(Insert-mode)
  • 命令模式(末行模式)(Command-mode)
  • 可视模式 (Visual-mode)

不同的教程,对这几个模式的叫法都不一样,所以我给了英文名字,由于叫习惯了,我就按着我习惯的叫法来写了。

注意:在每次运行Vim编辑器时,默认进入普通模式,此时需要先切换到插入模式后再进行文档编写工作,而每次在编写完文档后需要先返回普通模式,然后再进入命令模式,执行文档的保存或退出操作。需要注意: 在Vim中,无法直接从插入模式切换到命令模式。 任何模式互相切换,都可以先 Esc 切换到命令模式

下面开始学习各个模式能干啥,和切换方式。

普通模式(Normal-mode)

普通模式一般用于浏览文件,也包括一些复制、粘贴、删除等操作。这时击键时,一些组合键就是 vim 的功能键,而不会在文本中键入对应的字符。

在这个模式下,可以通过键盘在文本中快速移动光标,光标范围从小到大是字符、单词、行、句子、段落和屏幕。启动 VIM 后默认位于普通模式。不论是什么模式,按一下 键 (有时可能需要按两下,插入模式按一下 Esc ,就会切换到普通模式,命令模式或者可视模式下执行完操作以后,就会自动进入普通模式,如果进入命令模式或者可视模式没有执行任何操作,按两下 Esc 即可 )都会进入普通模式。

下面的大多命令都是在这个模式下使用的!比如光标移动、复制粘贴、删除等等。

插入模式(Insert-mode)

在普通模式中按下个别字母键,会进入插入模式。该模式启动以后,就会进入编辑状态,通过键盘输入内容。其实插入模式就可以理解为txt记事本之类的编辑器,你敲什么字符就出来什么字符。

常用的切换到插入模式的命令如下:

  • i是在光标所在的字符之前插入需要录入的文本。
  • I 是在光标所在行的行首插入需要录入的文本。
  • a 是在光标所在的字符之后插入需要录入的文本。
  • A 是在光标所在行的行尾插入需要录入的文本。
  • o是光标所在行的下一行行首插入需要录入的文本。
  • O 是光标所在行的上一行行首插入需要录入的文本。
  • s 删除光标所在处的字符然后插入需要录入的文本。
  • S删除光标所在行,在当前行的行首开始插入需要录入的文本。

需要注意上面的命令的区别。比如i是在光标当前的字符之前的位置插入字符。比如下面的图中,光标的字符是“f”,那么按i就是在“h”和“f”之间插入字符,同理,按a是“f”和“i”之间插入字符。
在这里插入图片描述

另外,可以把o理解成Windows的换行操作,把O理解成在当前行的上一行插入新的一行进行插入。S是删除当前行,并进入插入模式。这些都可以去实操感受一下各个命令之间的区别,根据需求来使用会加快效率。

命令模式(Command-mode)

在普通模式中,按下:(冒号)键或者/ (斜杠),会进入命令模式。在命令模式中可以执行一些输入并执行一些 VIM 或插件提供的指令,就像在shell里一样。这些指令包括设置环境、文件操作、调用某个功能等等。
举个简单的例子,在Vim里写好一个文档怎么退出?这在网上可以是个很好玩的梗~如果要退出并保存,就需要先进入命令模式,然后输入相关命令就行了,比如输入:wq是保存并退出,偶尔会出现权限问题,保存失败,那么可使用:wq!强制保存退出。如果不保存直接退出可以使用:q

可视模式(Visual-mode)

在普通模式按下v, V, <Ctrl>+v可以进入可视模式。可视模式中的操作有点像拿鼠标进行操作,选择文本的时候有一种鼠标选择的即视感,有时候会很方便。选中文本之后,可以进行复制、删除之类的操作,这点和Windows中的操作很类似。

各个模式间的切换

四种模式之前的切换,是非常重要的,主要的切换方法,我用一张图表示出来了。
在这里插入图片描述

这个图应该是很清晰的,我把常用的切换命令都列出来了。

PS:Vim的这几个模式,是需要好好理解的,并且需要记一下模式的切换方法。值得一提的是,下文大多的命令都是在普通模式下的,而且其他模式一般都是从普通模式切换过去的!所以在命令不起作用的时候,记得首先看一下自己当前是出于哪个模式。

光标移动

接下来学习Vim的光标移动。这可不是你想象的只有一直狂按上下左右来移动,这样极其低效!

上下左右光标移动

首先,Vim里面上下左右分别是hjkl,见下图吧,应该很清晰。当然,你按键盘上的上下左右方向键也OK,不过由于方向键在偏右边的地方,其实不是很方便,记一下hjkl是可以提高日常使用中的效率的!
给个图,具体怎么记这四个键就看自己了。主要是jk容易记混淆。
在这里插入图片描述

当然,hjkl肯定得是在普通模式下才有效,后文就不再强调这点了。

单词光标移动

除了简单的上下左右移动外,还有一些常用的命令可以做到以单词为单位来移动!首先看下表:

快捷键用途
w跳到下一个单词开头
b跳到本单词或上一个单词开头
e跳到本单词或下一个单词结尾
ge跳到上一个单词结尾

画了个图,下图描述了上面四个命令具体怎么移动的,应该很容易理解吧!
在这里插入图片描述

另外,要注意这里的命令,包括下面的命令都是有大小写区分的。关于这里的移动还有一点技巧,这在写程序时是非常实用的:

  • 如果你认为单词是由默认方式(默认上来说,一个单词由字母,数字和下划线组成),那么就用小写的ew
  • 如果你认为单词是由blank字符分隔符,那么你需要使用大写的EW

如下图,什么时候用大写的,什么时候用小写的,也是有讲究的!
在这里插入图片描述

提到这里,说一下,在Vim里面,一般相同的大小写字母所带来的功能一般是相反的。比如o是换行并切换为插入模式,而O是换行,跳转到上一行并切换到插入模式。

行间光标移动

下面是常用的行间光标移动的命令,非常实用。

快捷键用途
0跳到行首(光标所在行)
^跳到从行首开始第一个非空字符
$跳到行尾
gg跳到第一行
G跳到最后一行
:n跳转到第几行

注意自己多去练习哦~我就懒得去一个一个录制gif啦(懒.jpg)

在这里插入图片描述

再来两个非常有用的命令:

括号移动

% : 匹配括号移动,包括 (, {,[. (需要把光标先移到括号上)。作为显示,看下图,这个命令会在下图两个箭头来回跳动。
%.gif

相同单词间移动

*#: 匹配光标当前所在的单词,(*是下一个,#是上一个)这个命令会搜索出该文档中当前光标下所有的这个单词,并且可以使光标来回移动。
#.gif

Vim的进阶操作:动作+操作符

重头戏来啦!这绝对是核心中的核心!多图警告!!!首先来看下两个概念,也就是动作和操作符。

动作

动作主要就是ia的区别,见下图。简单来说,a包含的内容更多。
image.png
动作可以和下面的命令配合使用:
image.png
举个例子,iw就是选中当前的单词,ab就是选中当前光标小括号里的内容(包含小括号)。具体操作还需要结合下面的操作符来使用,不要着急,好用的来了!

操作符

操作符来了,作为一个标致的程序员(啊不是),我决定先把复制粘贴列在这!(少谁这个也不能少啊.jpg)
image.png
在Vim里面,y表示复制(yank),p表示粘贴(paste)。

然后,下面再列三个常用的:

快捷键用途
d(delete)删除 (剪切)
c(change)修改(删除并进入插入模式)
v(visual)选中并进入 VISUAL 模式

d其实可以理解为剪切(d把选中的内容删掉之后,把删掉的内容拷贝进了粘贴板,这个时候按p即可粘贴)。cd的区别是c删除后还会进入插入模式,这在有些时候会更方便。

当然,【ctrl+z】肯定不能少是吧?在Vim里面,撤销与恢复撤销代表的符号如下:

快捷键用途
u撤销刚才的操作
U撤销光标所在行的修改
ctrl + r恢复撤销操作

下面给出重要指令的英文,用以大家辅助记忆:
image.png

动作+操作符❤❤❤

下面开始重头戏啦!上面讲了动作和操作符,实际操作中这两者往往是结合着来用的。为了较好的展现Vim的优势,下面开始疯狂举例子:

动作+操作符示例:

  1. yiw->p:复制一个单词

yiw.gif

  1. daw->p:剪切一个单词(包括单词前后的空格)

daw.gif
看清楚ai的区别了吗?a会同时处理前后的空格、空号之类的字符,而i不会。

  1. di(:删除括号里的所有内容

dib.gif

  1. dab:删除括号内的所有内容(包括括号本身)

dab.gif

  1. ci":剪切双引号包括的内容,并且切换到插入模式,这时可以正常写入字符。

ci.gif

  1. `ya``:复制反引号(```)包含的内容,包括反引号本身。

ya.gif

复制相关(为了配合复制演示,下面对应的粘贴复制的内容,也就是指令p

指令例子功能
yw复制一个w移动经过的所有字符,还有ynw是复制nw
yfa复制光标到下一个a的字符处,ynfa同理
yy复制一行,nyy同理
y$复制光标到本号的结尾
yH复制屏幕显示的第一行文本到光标所在的行
yG复制光标所在行到文本的结束

下面一一展示这些指令:

  1. yw:回顾一下上面单词光标移动w指令,这里的yw也就是从当前光标复制一个w移动经过的所有字符。

yw.gif

  1. y2w:同理,复制两个w的内容

y2w.gif

  1. yft:复制光标到下一个t的字符处

yft.gif

  1. yy:复制一行

在这里插入图片描述

  1. y$:复制光标到本号的结尾

y.gif

  1. yH:复制屏幕显示的第一行文本到光标所在的行

yH.gif

  1. yG:复制光标所在行到文本的结束

yG.gif

与删除(剪切)相关的指令:

指令例子功能
dw删除一个w移动经过的所有字符,还有ynw是删除nw
dfa删除光标处到下一个 a 的字符处( fa 定位光标到 a 处 )
dd删除一整行
d$删除光标到本行的结尾
dH删除屏幕显示的第一行文本到光标所在的行
dG删除光标所在行到文本的结束

这里删除的用法和上面复制y的用法一模一样,就不再录制gif了。

删除字符操作和替换

指令例子功能
x删除光标当前所在的字符
r替换掉光标当前所在的字符
R替换掉从光标开始以后的所有字符,除非 退出。
  1. x:删除光标当前所在的字符

x.gif

  1. r:替换掉光标当前所在的字符

r.gif

  1. R:替换掉从光标开始以后的所有字符,除非 退出。

r.gif

翻页操作:

指令例子功能
ctrl+f查看下一页内容
ctrl+b查看上一页内容

提升技巧

重复

  1. .:(小数点) 可以重复上一次的命令,这里的命令包括查找、删除、替换之类的命令。比如:

...gif

  1. N<command>:重复某个命令N次,这个很简单,比如说10dd就是删除下面10行内容,5jj就是向下移动5行。
  2. 10idesu [ESC]:快速打出n个一样的单词

10idesu.gif

组合命令

  • 0y$:拷贝当前行所有内容(等同于yy
    • 0 → 先到行头
    • y → 从这里开始拷贝
    • $ → 拷贝到本行最后一个字符

0y.gif

  • ye:从当前位置拷贝到本单词的最后一个字符。

ye.gif

  • y2/foo :拷贝当前字符到第2个 “foo” 之间的字符串。

y2foo.gif

大小写转换

快捷键用途
~将光标下的字母改变大小写
3~将光标位置开始的3个字母改变其大小写
g~~改变当前行字母的大小写
gUU将当前行的字母改成大写
guu将当前行的字母改成小写
gUaw(gUiw)将光标下的单词改成大写
guaw(guiw)将光标下的单词改成小写
  1. ~:将光标下的字母改变大小写

~.gif

  1. g~~:改变当前行字母的大小写

g~~.gif

  1. gUUguu:将当前行的字母改成大写(小写)

guu.gif

命令模式中常用的命令

命令作用
:w保存
:q退出
:q!强制退出(放弃对文档的修改内容)
:wq!强制保存退出
:set nu显示行号
:set nonu不显示行号
:命令执行该命令
:整数跳转到该行
:s/one/two将当前光标所在行的第一个one替换成two
:s/one/two/g将当前光标所在行的所有one替换成two
:%s/one/two/g将全文中的所有one替换成two
?字符串在文本中从下至上搜索该字符串
/字符串在文本中从上至下搜索该字符串
  • %s代表整个全文,g代表不询问,也可以用c代表询问。

:set nu / :set nonu:显示行号与否
setnu.gif
其余命令就不过多展示了,关于查找和替换的命令下面开始详细说。

查找/搜索/替换

单行查找操作

快捷键用途
f{char}光标跳到下个{char}所在位置
F{char}反向移动到上一个{char}所在位置
t{char}光标跳到下个{char}的前一个字符的位置
T{char}光标反向移动到上个{char}的后一个字符的位置
;重复上次的字符查找操作
,反向查找上次的查找命令

重点记住fF即可。
fj.gif

全文查找操作

查找方式输入斜杠/(也是进入末行模式的方式之一)切换到命令模式,再输入要查找或搜索的关键词,然后回车。如果在一个文件中,存在多个满足条件的结果。在搜索结果中切换上/下一个结果:

  • N:大写N代表上一个结果
  • n:小写n代表下一个结果(next)

如果需要取消高亮,则需要在末行模式中输入:noh(no highlight)
foo.gif

文件内容的替换

操作方法:

  • 第一步:首先要进入末行模式(在命令模式下输入冒号:
  • 第二步:根据需求替换内容

下面举一些例子:

  1. 只替换光标所在这一行的第一个满足条件的结果(只能替换1次
:s/要替换的关键词/替换后的关键词   +  回车

案例:把hello rhel中的rhel替换为rhel8
首先切换光标到hello rhel这一行,然后输入如下指令:

:s/rhel/rhel8

rhel.gif

  1. 替换光标所在这一行中的所有满足条件的结果(替换多次,只能替换一行
:s/要替换的关键词/替换后的关键词/g		g=global全局替换

案例:把hello rhel中的所有rhel都替换为rhel8
首先切换光标到hello rhel这一行,然后输入如下指令:

:s/rhel/rhel8/g

rhelg.gif

  1. 针对整个文档中的所有行进行替换,只替换每一行中满足条件的第一个结果
:%s/要替换的关键词/替换后的关键词

案例:把每一行中的第一个hello关键词都替换为hi

:%s/hello/hi

hello.gif

  1. 针对整个文档中的所有关键词进行替换(只要满足条件就进行替换操作
:%s/要替换的关键词/替换后的关键词/g

案例:替换整个文档中的hello关键词为hi

:%s/hello/hi/g

hellog.gif

总结

以上就是Vim的基础用法了,有一些内容我略过了,大家感兴趣的自行去学习,这些内容重点都在于熟练。没啥好说的,只有多练,熟能生巧对吧~

然后,Vim可以和代码编译器结合使用,比如想VS、VSCode、Pycharm等等编译器都是支持Vim的,只需对应的安装一个Vim插件就行了,如果有小伙伴看完了这篇文章,可以试试在代码编译器中使用Vim在码代码,或许你大概率会爱上他!(前提是耐得住一开始的各种不习惯!)

更多的Vim的高阶技巧,后续空了我再整理吧~

感谢观看…图有点多,难免出现错误,如有错误敬请指出,第一时间修改!

END

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;