这个系列的Linux教程主要参考刘遄老师的《Linux就该这么学》。用的系统是RHEL8,如果遇见一些命令出现问题,请首先检查自己的系统是否一致,如果不一致,可网上查一下系统间某些命令之间的差异。
目前设计的这个Linux学习系列的目录如下:(会陆续更新~)
- Linux 学习系列一:Linux的简单介绍以及命令行的基本操作
- Linux 学习系列二:Linux中的常用命令
- Linux 学习系列三:管道符、重定向与环境变量
- Linux 学习系列四:光速掌握Vim,效率提升神器
- Linux 学习系列五:Shell命令脚本的基本语法
- 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吧~
划重点:
- 这里先浅浅的推荐一个视频:指尖飞舞:vscode + 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
是可以提高日常使用中的效率的!
给个图,具体怎么记这四个键就看自己了。主要是j
和k
容易记混淆。
当然,
hjkl
肯定得是在普通模式下才有效,后文就不再强调这点了。
单词光标移动
除了简单的上下左右移动外,还有一些常用的命令可以做到以单词为单位来移动!首先看下表:
快捷键 | 用途 |
---|---|
w | 跳到下一个单词开头 |
b | 跳到本单词或上一个单词开头 |
e | 跳到本单词或下一个单词结尾 |
ge | 跳到上一个单词结尾 |
画了个图,下图描述了上面四个命令具体怎么移动的,应该很容易理解吧!
另外,要注意这里的命令,包括下面的命令都是有大小写区分的。关于这里的移动还有一点技巧,这在写程序时是非常实用的:
- 如果你认为单词是由默认方式(默认上来说,一个单词由字母,数字和下划线组成),那么就用小写的
e
和w
。 - 如果你认为单词是由
blank
字符分隔符,那么你需要使用大写的E
和W
。
如下图,什么时候用大写的,什么时候用小写的,也是有讲究的!
提到这里,说一下,在Vim里面,一般相同的大小写字母所带来的功能一般是相反的。比如
o
是换行并切换为插入模式,而O
是换行,跳转到上一行并切换到插入模式。
行间光标移动
下面是常用的行间光标移动的命令,非常实用。
快捷键 | 用途 |
---|---|
0 | 跳到行首(光标所在行) |
^ | 跳到从行首开始第一个非空字符 |
$ | 跳到行尾 |
gg | 跳到第一行 |
G | 跳到最后一行 |
:n | 跳转到第几行 |
注意自己多去练习哦~我就懒得去一个一个录制gif啦(懒.jpg)
再来两个非常有用的命令:
括号移动
%
: 匹配括号移动,包括 (
, {
,[
. (需要把光标先移到括号上)。作为显示,看下图,这个命令会在下图两个箭头来回跳动。
相同单词间移动
*
和 #
: 匹配光标当前所在的单词,(*
是下一个,#
是上一个)这个命令会搜索出该文档中当前光标下所有的这个单词,并且可以使光标来回移动。
Vim的进阶操作:动作+操作符
重头戏来啦!这绝对是核心中的核心!多图警告!!!首先来看下两个概念,也就是动作和操作符。
动作
动作主要就是i
和a
的区别,见下图。简单来说,a
包含的内容更多。
动作可以和下面的命令配合使用:
举个例子,iw
就是选中当前的单词,ab
就是选中当前光标小括号里的内容(包含小括号)。具体操作还需要结合下面的操作符来使用,不要着急,好用的来了!
操作符
操作符来了,作为一个标致的程序员(啊不是),我决定先把复制粘贴列在这!(少谁这个也不能少啊.jpg)
在Vim里面,y
表示复制(yank),p
表示粘贴(paste)。
然后,下面再列三个常用的:
快捷键 | 用途 |
---|---|
d(delete) | 删除 (剪切) |
c(change) | 修改(删除并进入插入模式) |
v(visual) | 选中并进入 VISUAL 模式 |
d
其实可以理解为剪切(d
把选中的内容删掉之后,把删掉的内容拷贝进了粘贴板,这个时候按p
即可粘贴)。c
和d
的区别是c
删除后还会进入插入模式,这在有些时候会更方便。
当然,【ctrl+z】肯定不能少是吧?在Vim里面,撤销与恢复撤销代表的符号如下:
快捷键 | 用途 |
---|---|
u | 撤销刚才的操作 |
U | 撤销光标所在行的修改 |
ctrl + r | 恢复撤销操作 |
下面给出重要指令的英文,用以大家辅助记忆:
动作+操作符❤❤❤
下面开始重头戏啦!上面讲了动作和操作符,实际操作中这两者往往是结合着来用的。为了较好的展现Vim的优势,下面开始疯狂举例子:
动作+操作符示例:
yiw
->p
:复制一个单词
daw
->p
:剪切一个单词(包括单词前后的空格)
看清楚a
和i
的区别了吗?a
会同时处理前后的空格、空号之类的字符,而i
不会。
di(
:删除括号里的所有内容
dab
:删除括号内的所有内容(包括括号本身)
ci"
:剪切双引号包括的内容,并且切换到插入模式,这时可以正常写入字符。
- `ya``:复制反引号(```)包含的内容,包括反引号本身。
复制相关(为了配合复制演示,下面对应的粘贴复制的内容,也就是指令p
)
指令例子 | 功能 |
---|---|
yw | 复制一个w 移动经过的所有字符,还有ynw 是复制n 个w |
yfa | 复制光标到下一个a 的字符处,ynfa 同理 |
yy | 复制一行,nyy 同理 |
y$ | 复制光标到本号的结尾 |
yH | 复制屏幕显示的第一行文本到光标所在的行 |
yG | 复制光标所在行到文本的结束 |
下面一一展示这些指令:
yw
:回顾一下上面单词光标移动的w
指令,这里的yw
也就是从当前光标复制一个w
移动经过的所有字符。
y2w
:同理,复制两个w
的内容
yft
:复制光标到下一个t
的字符处
yy
:复制一行
y$
:复制光标到本号的结尾
yH
:复制屏幕显示的第一行文本到光标所在的行
yG
:复制光标所在行到文本的结束
与删除(剪切)相关的指令:
指令例子 | 功能 |
---|---|
dw | 删除一个w 移动经过的所有字符,还有ynw 是删除n 个w |
dfa | 删除光标处到下一个 a 的字符处( fa 定位光标到 a 处 ) |
dd | 删除一整行 |
d$ | 删除光标到本行的结尾 |
dH | 删除屏幕显示的第一行文本到光标所在的行 |
dG | 删除光标所在行到文本的结束 |
这里删除的用法和上面复制
y
的用法一模一样,就不再录制gif了。
删除字符操作和替换
指令例子 | 功能 |
---|---|
x | 删除光标当前所在的字符 |
r | 替换掉光标当前所在的字符 |
R | 替换掉从光标开始以后的所有字符,除非 退出。 |
x
:删除光标当前所在的字符
r
:替换掉光标当前所在的字符
R
:替换掉从光标开始以后的所有字符,除非 退出。
翻页操作:
指令例子 | 功能 |
---|---|
ctrl+f | 查看下一页内容 |
ctrl+b | 查看上一页内容 |
提升技巧
重复
.
:(小数点) 可以重复上一次的命令,这里的命令包括查找、删除、替换之类的命令。比如:
N<command>
:重复某个命令N次,这个很简单,比如说10dd
就是删除下面10行内容,5jj
就是向下移动5行。10idesu [ESC]
:快速打出n
个一样的单词
组合命令
0y$
:拷贝当前行所有内容(等同于yy
)0
→ 先到行头y
→ 从这里开始拷贝$
→ 拷贝到本行最后一个字符
ye
:从当前位置拷贝到本单词的最后一个字符。
y2/foo
:拷贝当前字符到第2个 “foo
” 之间的字符串。
大小写转换
快捷键 | 用途 |
---|---|
~ | 将光标下的字母改变大小写 |
3~ | 将光标位置开始的3个字母改变其大小写 |
g~~ | 改变当前行字母的大小写 |
gUU | 将当前行的字母改成大写 |
guu | 将当前行的字母改成小写 |
gUaw (gUiw ) | 将光标下的单词改成大写 |
guaw (guiw ) | 将光标下的单词改成小写 |
~
:将光标下的字母改变大小写
g~~
:改变当前行字母的大小写
gUU
和guu
:将当前行的字母改成大写(小写)
命令模式中常用的命令
命令 | 作用 |
---|---|
: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
:显示行号与否
其余命令就不过多展示了,关于查找和替换的命令下面开始详细说。
查找/搜索/替换
单行查找操作
快捷键 | 用途 |
---|---|
f{char} | 光标跳到下个{char}所在位置 |
F{char} | 反向移动到上一个{char}所在位置 |
t{char} | 光标跳到下个{char}的前一个字符的位置 |
T{char} | 光标反向移动到上个{char}的后一个字符的位置 |
; | 重复上次的字符查找操作 |
, | 反向查找上次的查找命令 |
重点记住f
和F
即可。
全文查找操作
查找方式输入斜杠/
(也是进入末行模式的方式之一)切换到命令模式,再输入要查找或搜索的关键词,然后回车。如果在一个文件中,存在多个满足条件的结果。在搜索结果中切换上/下一个结果:
N
:大写N
代表上一个结果n
:小写n
代表下一个结果(next)
如果需要取消高亮,则需要在末行模式中输入:noh
(no highlight)
文件内容的替换
操作方法:
- 第一步:首先要进入末行模式(在命令模式下输入冒号
:
) - 第二步:根据需求替换内容
下面举一些例子:
- 只替换光标所在这一行的第一个满足条件的结果(只能替换1次)
:s/要替换的关键词/替换后的关键词 + 回车
案例:把hello rhel
中的rhel
替换为rhel8
。
首先切换光标到hello rhel
这一行,然后输入如下指令:
:s/rhel/rhel8
- 替换光标所在这一行中的所有满足条件的结果(替换多次,只能替换一行)
:s/要替换的关键词/替换后的关键词/g g=global全局替换
案例:把hello rhel
中的所有rhel
都替换为rhel8
。
首先切换光标到hello rhel
这一行,然后输入如下指令:
:s/rhel/rhel8/g
- 针对整个文档中的所有行进行替换,只替换每一行中满足条件的第一个结果
:%s/要替换的关键词/替换后的关键词
案例:把每一行中的第一个hello
关键词都替换为hi
:%s/hello/hi
- 针对整个文档中的所有关键词进行替换(只要满足条件就进行替换操作)
:%s/要替换的关键词/替换后的关键词/g
案例:替换整个文档中的hello
关键词为hi
:%s/hello/hi/g
总结
以上就是Vim的基础用法了,有一些内容我略过了,大家感兴趣的自行去学习,这些内容重点都在于熟练。没啥好说的,只有多练,熟能生巧对吧~
然后,Vim可以和代码编译器结合使用,比如想VS、VSCode、Pycharm等等编译器都是支持Vim的,只需对应的安装一个Vim插件就行了,如果有小伙伴看完了这篇文章,可以试试在代码编译器中使用Vim在码代码,或许你大概率会爱上他!(前提是耐得住一开始的各种不习惯!)
更多的Vim的高阶技巧,后续空了我再整理吧~
感谢观看…图有点多,难免出现错误,如有错误敬请指出,第一时间修改!
END