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

  • Post author:
  • Post category:linux




这个系列的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

是可以提高日常使用中的效率的!

给个图,具体怎么记这四个键就看自己了。主要是

j



k

容易记混淆。

在这里插入图片描述

当然,

hjkl

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



单词光标移动

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

快捷键 用途

w
跳到下一个单词开头

b
跳到本单词或上一个单词开头

e
跳到本单词或下一个单词结尾

ge
跳到上一个单词结尾

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

在这里插入图片描述

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

  • 如果你认为单词是由

    默认方式

    (默认上来说,一个单词由字母,数字和下划线组成),那么就用小写的

    e



    w

  • 如果你认为单词是由

    blank

    字符分隔符,那么你需要使用大写的

    E



    W

如下图,什么时候用大写的,什么时候用小写的,也是有讲究的!

在这里插入图片描述

提到这里,说一下,在Vim里面,一般相同的大小写字母所带来的功能一般是相反的。比如

o

是换行并切换为插入模式,而

O

是换行,跳转到上一行并切换到插入模式。



行间光标移动

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

快捷键 用途

0
跳到行首(光标所在行)

^

跳到从行首开始第一个非空字符

$

跳到行尾

gg

跳到第一行

G

跳到最后一行

:n
跳转到第几行

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

在这里插入图片描述

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



括号移动


%

: 匹配括号移动,包括

(

,

{


,

[

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

%.gif



相同单词间移动


*



#

: 匹配光标当前所在的单词,(

*

是下一个,

#

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

#.gif



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

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



动作

动作主要就是

i



a

的区别,见下图。简单来说,

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

即可粘贴)。

c



d

的区别是

c

删除后还会进入插入模式,这在有些时候会更方便。

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

快捷键 用途

u
撤销刚才的操作

U
撤销光标所在行的修改

ctrl + r
恢复撤销操作

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

image.png



动作+操作符❤❤❤

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

动作+操作符示例:


  1. yiw

    ->

    p

    :复制一个单词

yiw.gif


  1. daw

    ->

    p

    :剪切一个单词(包括单词前后的空格)

daw.gif

看清楚

a



i

的区别了吗?

a

会同时处理前后的空格、空号之类的字符,而

i

不会。


  1. di(

    :删除括号里的所有内容

dib.gif


  1. dab

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

dab.gif


  1. ci"

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

ci.gif

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

ya.gif

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

p

指令例子 功能

yw
复制一个

w

移动经过的所有字符,还有

ynw

是复制

n



w

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

是删除

n



w

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. gUU



    guu

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

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}的后一个字符的位置
; 重复上次的字符查找操作
, 反向查找上次的查找命令

重点记住

f



F

即可。

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



版权声明:本文为qq_37085158原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。