【Linux】vim详解

1.什么是vi/vim?

简单来说,vi是老式的文本编辑器,不过功能已经很齐全了,但是还是有可以进步的地方。vim则可以说是程序开发者的一项很好用的工具,就连 vim的官方网站( http://www.vim.org)自己也说vim是一个程序开发工具而不是文本处理软件。

Vim是从 vi 发展出来的一个文本编辑器。代码补全、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用,和Emacs并列成为类Unix系统用户最喜欢的文本编辑器。

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

2.为何要学vi/vim?

其实是有原因的,因为:

  • 很多软件的编辑接口都会主动调用vi(例如crontab、visudo、edquota等命令);
  • 所有的UNIX-like系统都会内置vi文本编辑器,其他的文本编辑器则不一定会存在;
  • vim 具有程序编辑的能力,可以主动地以字体颜色辨别语法的正确性,方便程序设计;
  • 因为程序简单,编辑速度相当快速;

其实重点是上述的第二点,因为有太多Linux上面的命令都默认使用vi作为数据编辑的接口,所以你一定要学会Vi,否则很多命令你根本就无法操作。

3.vim的使用

由于啊这个vi和vim的用法基本一样,我们就讲一样就行了

基本上vim共分为3种模式,分别是一般命令模式、编辑模式与命令行模式。

这3种模式的作用分别是:

  • 一般命令模式(command mode)

以vi打开一个文件就直接进入一般命令模式了(这是默认的模式,也简称为一般模式)。

在这个模式中,你可以使用【上下左右】按键来移动光标,你可以使用【删除字符】或【删除整行】来处理文件内容,也可以使用【复制、粘贴】来处理你的文件内容。

  • 编辑模式/插入模式(insert mode)

在一般命令模式中可以进行删除、复制、粘贴等的操作,但是却无法编辑文件的内容。要等到你按下【i、I(大写i)、o、O(大写o)、a、A、R】等任何一个字母之后才会进入编辑模式。

注意了,通常在Linux中,按下【i、I(大写i)、o、O(大写o)、a、A】时,在界面的左下方会出现【INSERT】,按下【R】时会出现【REPLACE】的字样,此时才可以进行编辑,

而如果要回到一般命令模式时,则必须要按下【Esc】这个按键即可退出编辑模式。

  • 命令行模式/底行模式(command-line mode)

在一般模式当中,输入【: / ?】三个中的任何一个按钮,就可以将光标移动到最下面那一行。

在这个模式当中,可以提供你【查找数据】的操作,而读取、保存、批量替换字符、退出vi、显示行号等的操作则是在此模式中完成。

简单地说,我们可以将这3个模式想成下面的图例来表示:

注意到上面的图例,你会发现一般命令模式可与编辑模式及命令行模式切换,但编辑模式与命令行模式之间不可互相切换,这非常重要。

闲话不多说,我们下面以一个简单的例子来进行说明吧!

3.1.简易执行范例

如果你想要使用vim来建立一个名为welcome.txt的文件时,你可以这样做:

  • 1.使用【vim filename】进入一般命令模式

直接输入【vim文件名】就能够进入vi的一般命令模式。另外,请注意,记得vim后面一定要加文件名,不管该文件名存在与否。没有的话vim会自己创建一个新文件

进去之后底行就会出现下面这些字样

整个界面主要分为两部分,上半部分与最下面一行两者可以视为独立的。上半部分显示的是文件的实际内容,最下面一行则是状态显示行(图所示的[New File]信息),或是命令执行行。

我们使用vim打开一个新文件

如果使用vim打开的文件是已经存在的文件,则可能会出现如下的信息:

如图所示,

  1. 底行的那个【"/etc/man_db.conf"[readonly] 131L,5165c】代表的是现在打开的文件名为/etc/man_db.conf,由于打开者的身份缘故,目前文件为只读状态,且文件内有131行以及具有5165个字符的意思。
  2. 右边那个1,1的意思是光标目前处于第一行的第一个字符
  3. Top代表目前这个页面是在整个文件的最顶端

那一行的内容并不是在文件内,而是 vim 显示一些信息的地方,此时是在一般命令模式的环境下,接下来开始来输入吧!

  • 2.按下i进入编辑模式,开始编辑文字

在一般命令模式之中,只要按下【i、o、a】等字符就可以进入编辑模式了,在编辑模式当中,你可以发现在左下角状态栏中会出现--INSERT--的字样,那就是可以输入任意字符的提示。

这个时候,键盘上除了[Esc]这个按键之外,其他的按键都可以视作为一般的输入按钮,所以你可以进行任何的编辑。

当然,除了按 【i、o、a】等字符之外,我们还可以按【R】,只不过R进入的是替换模式,意思就是只能替换

  • 3.按下[Esc]键回到一般命令模式

好了,假设我已经按照上面的样式给它编辑完毕了,那么应该要如何退出呢?是的,没错,就是给它按下[Esc]这个键即可,马上你就会发现界面左下角的-INSERT-不见了。

  • 4.进入命令行模式,文件保存并退出vi环境

OK,我们要保存了,保存(write)并退出(quit)的命令很简单,输入【:wq】即可保存退出。(注意了,按下:该光标就会移动到最下面一行去)

这时你在提示字符后面输入【Is-l】即可看到我们刚刚建立的test2文件,整个图有点像下面这样:

如此一来,你的文件 test2 就已经建立。

需要注意的是,如果你的文件权限不对,例如为-r--r----r--时,那么可能会无法写入,此时可以使用【强制写入】的方式吗?

可以,使用【:wq!】多加一个感叹号即可。不过,需要特别注意,那个是在你的权限可以改变的情况下才能成立的。

3.2按键说明

除了上面简易示范的i、[Esc]、:wq 之外,其实vim还有非常多的按键可以使用。

在介绍之前还是要再次强调,vi的三种模式只有一般命令模式可以与编辑、命令行模式切换,编辑模式与命令行模式之间并不能切换。

下面就来谈谈vi软件中会用到的按键功能吧!

第一部分:一般命令模式可用的功能按键说明,光标移动、复制粘贴、查找替换等

|------------------|---------------------------------------------------------------------------------|
| h 或向左箭头键 | 光标向左移动一个字符 |
| j 或向下箭头键 | 光标向下移动一个字符 |
| k 或向上箭头键 | 光标向上移动一个字符 |
| i 或向右箭头键 | 光标向右移动一个字符 |
| [Ctrl]+[f] | 屏幕【向下】移动一页,相当于[PageDown]按键(常用) |
| [Ctrl]+[b] | 屏幕【向上】移动一页,相当于[PageUp]按键(常用) |
| [Ctrl]+[d] | 屏幕【向下】移动半页 |
| [Ctrl] + [u] | 屏幕【向上】移动半页 |
| + | 光标移动到非空格符的下一行 |
| - | 光标移动到非空格符的上一行 |
| n<space> | **那个n表示【数字】,按下数字n后再按空格键,光标会向右移动这一行的n个字符,**例如20<space>则光标会向后面移动20个字符距离 |
| 0或功能键[Home] | 这是数字【0】:移动到这一行的最前面字符处(常用) |
| $或功能键[End] | 移动到这一行的最后面字符(常用) |
| H | 光标移动到这个屏幕的最上方那一行的第一个字符 |
| M | 光标移动到这个屏幕的中央那一行的第一个字符 |
| L | 光标移动到这个屏幕的最下方那一行的第一个字符 |
| G | 移动到这个文件的最后一行(常用) |
| nG | n为数字,移动到这个文件的第n行,例如20G则会移动到这个文件的第20行(可配合:set nu) |
| gg | 移动到这个文件的第一行,相当于1G(常用) |
| n<Enter> | n为数字,光标向下移动n行(常用) |
[移动光标的方法]

注意:如果你将右手放在键盘上的话,你会发现hjki是排行在一起的,因此可以使用这四个按键来移动光标。

如果想要进行多次移动的话,例如向下移动30行,可以使用"30j"或"30↓"的组合按键,亦即加上想要进行的次数(数字)后,按下操作即可

|-----------------------|---------------------------------------------------------------------------------------------------------------------------------------|
| /word | 向光标之下寻找一个名称为word的字符串。 例如要在文件内查找vbird 这个字符串,就输入/vbird即可(常用) |
| ?word | 向光标之上寻找一个字符串名称为word的字符串 |
| n | 这个n是英文按键,代表【重复前一个查找的操作】。 举例来说, 如果刚刚我们执行/bird去向下查找vbird这个字符串,则按下n后,会向下继续查找下一个名称为vbird的字符串. 如果是执行?vbird的话,那么按下n则会向上继续查找名称为vbird的字符串 |
| N | 这个N是英文按键,与n刚好相反,为【反向】进行前一个查找操作,例如/vbird后,按下N则表示【向上】查找vbird |
| :n1,n2s/word1/word2/g | n1与n2为数字,在第n1与n2行之间寻找word1这个字符串,并将该字符串替换为word2, 举例来说,在100到200行之间查找 vbird 并替换为 VBIRD则:":100,200s/vbird/VBIRD/g"(常用) |
| :1,s/word1/word2/g | **从第一行到最后一行寻找word1字符串,并将该字符串替换为word2(常用)** | | :1,s/word1/word2/gc | 从第一行到最后一行寻找word1字符串,并将该字符串替换为word2,且在替换前显示提示字符给用户确认(confirm)是否需要替换(常用) |
[查找和替换]

|------------|------------------------------------------------------------------------------------------------------------------------------------|
| x和X | 在一行当中,x为向后删除一个字符(相当于[del]按键),X为向前删除一个字符(相当于[Backspace]即退格键)(常用) |
| nx | n为数字,连续向后删除n个字符。 举例来说,我要连续删除 10个字符,【10x】 |
| dd | 删除(剪切)光标所在的那一整行(常用) |
| ndd | n为数字,删除(剪切)光标所在的向下n行,例如20dd则是删除(剪切)20行(常用) |
| d1G | 删除(剪切)光标所在处到第一行的所有数据 |
| dG | 删除(剪切)光标所在处到最后一行的所有数据 |
| d | 删除(剪切)光标所在处,到该行的最后一个字符 | | d0 | 那个是数字的0,删除(剪切)光标所在处,到该行的最前面一个字符 | | yy | **复制光标所在的那一行(常用)** | | nyy | n为数字,复制光标所在的向下n行,例如20yy则是复制20行(常用) | | y1G | 复制光标所在行到第一行的所有数据 | | yG | 复制光标所在行到最后一行的所有数据 | | y0 | 复制光标所在的那个字符到该行行首的所有数据 | | y | 复制光标所在的那个字符到该行行尾的所有数据 |
| p和P | p为将已复制的数据在光标下一行粘贴,P则为贴在光标上一行。 举例来说,我目前光标在第20行,且已经复制了10行数据,则按下p后,那10行数据会贴在原本的20行之后,即由21行开始贴,但如果是按下P呢?那么原本的第20行会被推到变成30行(常用) |
| J | 将光标所在行与下一行的数据结合成同一行 |
| c | 重复删除多个数据,例如向下删除10行,[10cj] |
| u | 恢复前一个操作(常用) |
| [Ctrl]+r | 重做上一个操作(常用) |
| . | 不要怀疑,这就是小数点,意思是重复前一个操作的意思。 如果你想要重复删除、重复粘贴等操作,按下小数点【.】就好(常用) |
[删除,复制,粘贴]

这个u与[Ctrl]+r是很常用的命令。一个是恢复,另一个则是重做一次,利用这两个功能按键,你的编辑,嘿嘿,很快乐的啊。

第二部分:一般命令模式切换到编辑模式的可用的按键说明

|-----|--------------------------------------------------------------------------------------|
| i和I | 进入插入模式(Insert mode): i为【从目前光标所在处插入】,|为【在目前所在行的第一个非空格符处开始插入】(常用) |
| a和A | 进入插入模式(Insert mode ): a为【从目前光标所在的下一个字符处开始插入】,A为【从光标所在行的最后一个字符处开始插入】(常用) |
| o和O | 进入插入模式(Insert mode): 这是英文字母o的大小写,o为【在目前光标所在的下一行处插入新的一行】;O为在目前光标所在处的上一行插入新的一行(常用) |
| r和R | 进入替换模式(Replace mode): r只会替换光标所在的那一个字符一次;R会一直替换光标所在的文字,直到按下Esc为 止(常用) |
| Esc | 退出编辑模式,回到一般命令模式中(常用) |
[进入插入或替换模式的编辑模式]

上面这些按键中,在vim界面的左下角处会出现【--INSERT-】或【--REPLACE--】的字样。由名称就知道该操作了吧!

特别注意的是,我们上面也提过,你想要在文件里面输入字符时,一定要在左下角处看到 INSERT 或 REPLACE才能输入。

第三部分:一般命令模式切换到命令行模式的可用按键说明

|-----------------------|----------------------------------------------------------------------------|
| :w | 将编辑的数据写入硬盘文件中(常用) |
| :w! | 若文件属性为【只读】时,强制写入该文件。不过,到底能不能写入,还是跟你对该文件的文件权限有关 |
| :q | 退出vim(常用) |
| :q! | 若曾修改过文件,又不想保存,使用!为强制退出不保存 注意一下,那个感叹号(!)在vim当中,常常具有【强制】的意思。 |
| :wq | 保存后退出,若为:wq!则为强制保存后退出(常用) |
| ZZ | 这是大写的Z,若文件没有修改,则不保存退出,若文件已经被修改过,则保存后退出 |
| :w [filename] | 将编辑的数据保存成另一个文件(类似另存新文件) |
| :r [filename] | 在编辑的数据中,读入另一个文件的数据,亦即将【filename】这个文件内容加到光标所在行后面 |
| :n1,n2 w [filename] | 将n1到n2的内容保存为filename 这个文件 |
| :! command | **暂时退出vim到命令行模式下执行command的显示结果。**例如【:!ls /home 】即可在vi当中查看/home下面以Is输出的文件信息 |
| set nu | 显示行号,设置之后,会在每一行的前缀显示该行的行号 |
| set nonu | 与set nu相反,为取消行号 |
[命令行模式的保存,退出等命令]

特别注意,在Vim中,【数字】是很有意义的,数字通常代表重复做几次的意思,也有可能是代表去到第几个什么什么的意思

举例来说,要删除(剪切)50行,则是用【50dd 】。数字加在操作之前,那我要向下移动20行呢?那就是【20j】或是【20↓】即可。

OK,会这些命令就已经很厉害了,因为常用到的命令也只有不到一半。通常vim的命令除了上面鸟哥注明"常用"的几个外,其他是不用背的,你可以做一张简单的命令表在你的屏幕壁纸上,一有疑问可以马上查询。

3.3. vim的缓存、恢复与打开时的警告信息

目前主要的文本编辑软件都会有恢复的功能,即当你的系统因为某些原因而导致类似宕机的情况时,还可以通过某些特别的机制来让你将之前未保存的数据【救】回来,这就是鸟哥这里所谓的恢复功能。

那么vim有没有恢复功能?有的,vim就是通过缓存来恢复。

当我们在使用vim 编辑时,vim会在与被编辑的文件的目录下,再建立一个名为filename.swp的文件。

比如说编辑/tmp/vitest/man_db.conf这个文件时,vim会主动的建立/tmp/vitest/.man_db.conf.swp的缓存,你对man_db.conf 做的操作就会被记录到这个.man_db.conf.swp当中。如果你的系统因为某些原因掉线了,导致你编辑的文件还没有保存,这个时候.man_db.conf.swp就能够发挥恢复功能了。

我们来测试一下吧!下面的练习有些部分的命令

我们尚未谈到,没关系,你先照着做,后续再回来了解。

我们使用vim打开vitest,此时会进入到vim的界面,在vim的一般命令模式下按下【[ctrl]-z】的组合键就会退出来,就像下面这样子

**当我们在vim的一般命令模式下按下[ctl]-z的组合按键时,你的vim会被丢到后台去执行。**这部分的功能我们会在进程管理当中谈到,你这里先知道一下即可。

回到命令提示字符后,接下来我们来模拟将 vim的工作不正常的中断吧!

我们看最后一行那个.vitest.swp

我们来模拟vim停止工作

这个 kil 可以模拟将系统的vim工作删除的情况,你可以模拟宕机。

由于vim的工作被不正常地中断,导致缓存无法借由正常流程来结束,所以缓存就不会消失,而继续保留下来,**此时如果你继续编辑那个vitest,会出现什么情况?**会出现如下所示的状态:

由于缓存存在的关系,因此 vim会主动的判断你的这个文件可能有些问题,在上面的图例中vim提示两点主要的问题与解决方案,分别是这样的:

  • 问题一:可能有其他人或程序同时在编辑这个文件:

由于 Linux是多人多任务的环境,因此很可能有很多人同时在编辑同一个文件。如果在多人共同编辑的情况下,万一大家同时保存,那么这个文件的内容将会变的乱七八糟。为了避免这个问题,因此vim会出现这个警告窗口,解决的方法则是:

  1. 找到另外那个程序或人员,请它将该vim的工作结束,然后你再继续处理。
  2. 如果你只是要看该文件的内容并不会有任何修改编辑的操作,那么可以选择开启成为只读(O)文件,即上述界面反白部分输入英文【o】即可,其实就是[O]pen Read-Only的选项。
  • 问题二:在前一个 vim 的环境中,可能因为某些不知名原因导致vim 中断(crashed):

这就是常见的不正常结束vim产生的后果,解决方案依据不同的情况而不同,常见的处理方法为:

  • 如果你之前的vim 处理操作尚未保存,此时你应该要按下【R】,亦即使用(R)ecover 的选项,此时vim会加载.vitest.swp的内容,让你自己来决定要不要保存,这样就能够救回来你之前未保存的信息。****不过这个.vitest.swp 并不会在你结束vim 后自动删除,所以你退出vim后还得要自行删除,.vitest.swp才能避免每次打开这个文件都会出现这样的警告。
  • **如果你确定这个缓存是没有用的,那么你可以直接按下【D】删除掉这个缓存,即(D)elete it 这个选项即可。**此时vim会加载.vitest.swp,并且将旧的.vitest.swp删除后,建立这次会使用的新的.vitest.swp。

至于这个发现缓存警告信息的界面中,有出现六个可用按键,各按键的说明如下:

  1. [O]pen Read-Only:打开此文件成为只读文件,可以用在你只是想要查看该文件内容并不想要进行编辑操作时。一般来说,在上课时,如果你是登录到同学的计算机去看它的配置文件,结果发现其实同学它自己也在编辑时,可以使用这个模式;
  2. (E)dit anyway:还是用正常的方式打开你要编辑的那个文件,并不会加载缓存的内容,不过很容易出现两个用户互相改变对方的文件等问题。
  3. (R)ecover:就是加载缓存的内容,用在你要救回之前未保存的工作,不过当你救回来并且保存退出vim后,还是要手动自行删除那个缓存。
  4. (D)elete it:你确定那个缓存是无用的,那么打开文件前会先将这个缓存删除,这个操作其实是比较常做。因为你可能不确定这个缓存是怎么来的,所以就删除掉它吧!。
  5. (Q)uit:按下q就退出vim,不会进行任何操作回到命令提示字符。
  6. (A)bort:忽略这个编辑操作,感觉上与quit 非常类似,也会送你回到命令提示字符。
相关推荐
Gss7775 分钟前
Linux 进程管理与计划任务详解
linux·运维·服务器
one day3211 小时前
Linux和shell
linux·运维·服务器
鹏大师运维2 小时前
银河麒麟桌面操作系统:自定义截图快捷键操作指南
linux·运维·快捷键·国产操作系统·截图·麒麟kylinos·桌面操作系统
笑稀了的野生俊2 小时前
Ubuntu 下配置 NVIDIA 驱动与 CUDA 环境(适配 RTX 4060Ti)
linux·ubuntu·cuda·nvidia driver
仙云Q122 小时前
NAT技术与代理服务
linux·服务器·网络
用户4921013166572 小时前
基于FinalShell输入的虚拟机Linux指令
linux
ajassi20003 小时前
开源 Arkts 鸿蒙应用 开发(十二)传感器的使用
linux·华为·开源·harmonyos
自由鬼3 小时前
AI赋能操作系统:通往智能运维的未来
linux·运维·服务器·人工智能·程序人生·ai·操作系统
x晕x4 小时前
Qt 消息弹窗 Toast
linux·c++·windows·qt·mac
鹏大师运维4 小时前
MBR与GPT分区表深度解析:硬盘分区该怎么选?
linux·运维·服务器·gpt·国产操作系统·mbr·统信uos