Linux操作系统(六):vim程序编辑器

2022/7/5 5:21:47

本文主要是介绍Linux操作系统(六):vim程序编辑器,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

  • vi与vim
  • vim的额外功能
  • 其他vim使用注意事项

 一、关于本文内容的导读

这部分不涉及具体内容的解析,只是作为浏览和查找相关知识点的引导内容,采用【主题 | 命令 | 对应内容小节编号】三个关键信息的组合模式,依照这些信息可以快速查找到相关详细的示例和解析。

1.1什么是vi和vim,为什么要学习vim

vi是一款文本终端的文本编辑器,vim是vi的高级版本,它提供了更多高级功能;在前面Linux相关博客中有简单的介绍过nano这款文本编辑器,但是所有UNIX-like系统都会內置vi文本编辑器,其他文本编辑器不一定存在。很多编辑器也是基于vi实现的,比如crontab、visudo、edquota等命令;

在Linux中使用文本编辑器来编辑Linux参数配置文件是非常常见的操作,vim还具有程序编辑的能力,可以主动以字体颜色辨别语法的正确性,方便程序设计,并且应用非常简单,编辑效率高。

1.2相关命令及主题

vim编辑器 | vim | vi | 2.3~3.*
转换文件的编码格式 | iconv | 4.1
转换dos与unix文件 | dos2unix | unix2dos | 4.2

 二、vi与vim

2.1vi的三种模式

vi共分为三种模式:一般命名模式、编辑模式、命令行模式;

一般命令模式:

以vi打开一个文件就直接进入一般命令模式了,在这个模式中,可以使用【上下左右】按键来移动光标,还可以使用【删除字符】或【删除整行】来处理文件内容,也可以使用【复制、粘贴】来处理相关内容。

编辑模式:

在一般命令模式无法编辑文件,要按下【i、l、o、O、a、A、r、R】等任何一个按键才会进入编辑模式。进入编辑模式在界面左下方会出现【INSERT】或【REPLACE】的字样,此时就可以开始编辑文本,必须按【ESC】键就能退出编辑模式,回到一般模式。

命令行模式:

在一般模式下,必须输入【:/?】三个字符任意一个才能将光标移动到最下面那一行,在这一行可以输入一些选项功能实现数据查找、读取、保存、批量替换、退出、显示行号等操作。

关于vi的使用其实非常简单,记得各种按键的功能和选项功能就行了,偶尔忘记了也可以使用man查看一下文档即可,然后对于刚刚使用vi编辑器的来说记得一般命令模式和编辑模式可以相互切换,但编辑模式不可以与命令模式不可以相互切换,在命令模式下必须执行了相关操作或者退出命令模式回到一般模式,再在一般模式下进入编辑模式。

2.2vi的按键说明

先不用急于去尝试使用vi,可以先通过man文档了解vi的按键和选项功能,然后再去使用你会发现非常简单,这里我将按钮和选项功能全部列举出来,以后就将这篇博客作为一个详细的使用对照文档来使用。

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

可以通过方向键或【h(左)、j(下)、k(上)、l(右)】逐个字符移动光标,如果要在一个方向上移动多次的化,可以在方向键之前输入数值(比如要向下移动10行就输入【10↓】);

可以通过【Ctrl + f 、b、d、u】实现翻页移动光标,它们分别实现向下移动一页(相当于【Page Down】按键)、向上移动一页(相当于【Page Up】按键)、向下移动半页、向上移动半页;

下面是一般模式下比较特殊的光标移动操作方法:

+ 光标移动到非空格符的下一行(比如当前光标在一段非空字符中间,这段字符前后都有空行,按下【+】键后光标就会移动到这段字符的下方的空行上)
- 光标移动到非空格符的上一行(原理逻辑同上,方向相反)
n<space> 表示从当前光标位置向右移动n个字符,例如输入【15 + 空格键】就是从当前光标位置开始向右移动15个字符(n表示数值,不是【n】这个按键);
0或【HOME】键 表示将光标移动到当前行最前面的字符处;
$或【END】键 表示将光标移动到当前行最后面的字符处;
H 表示将光标移动到屏幕最上方那一行的第一个字符;
M 表示将光标移动到屏幕中间那一行的第一个字符;
L 表示将光标移动到屏幕最下方那一行的第一个字符;
G 表示将光标移动到文件的最后一行;
nG 表示将光标移动到文件的第n行
gg 表示将光标移动到文件的第一行,相当于1G
n<Enter> 表示将光标向下移动n行(n表示数值,不是【n】这个按键);

 

下面是一般命令模式下查找与替换的相关操作方法:

/word 从光标位置开始往后查询一个word字符串,word表示你要查找的字符串;
?word 从光标位置开始往前查询一个word字符串,word表示你要查找的字符串;
【n】 n就是表示其按键本身,表示重复前一次查找操作;
N 表示向上一次查找的相反方向继续查找操作,比如上一次是/word,那N就会基于当前的光标位置向前查找;
:n1,n2/word1/word2/g n1与n2都是表示一个数值,word1表示要查找的字符串,word2表示要替换word1的字符串。这个操作表示在n1到n2行之间查找word1,并使用word2替换;
:1,$s/word1/word2/g 从第一行到最后一行查找word1这个字符串,并使用word2替换word1;
:1,$s/word1/word2/gc 这个操作与:1,$s/word1/word2/g一样,只是在替换前会提示用户确认(confirm)是否需要替换;

 下面是一般命令模式下删除、复制、粘贴的相关操作方法:

x与X x表示向后删除一个字符,相当于【DEL】按键;X表示向前删除一个字符,相当于【BACKSPACE】退格键;
nx 表示向后删除n个字符;
dd 表示删除(剪切)光标所在的那一整行;
ndd 表示从光标所在的行开始,删除n行;
d1G 表示删除(剪切)光标所在的一行开始,到第一行的所有数据;
dG 表示删除(剪切)光标所在的一行开始,到最后一行的所有数据;
d$ 表示删除(剪切)光标所在处,到该行的最后一个字符;
d0 表示删除(剪切)光标所在处,到该行的最前面的一个字符(0是数值零);
yy 表示复制光标所在行的那一整行数据;
nyy 表示复制光标所在的向下n行数据;
y1G 表示复制光标所在行到第一行的所有数据;
yG 表示复制光标所在行到最后一行的所有数据;
y0 表示复制光标所在处,到该行的最前面的一个字符的数据;
y$ 表示复制光标所在处,到该行最后一个字符的数据;
p与P p表示将复制的数据粘贴到光标所在位置的下一行,P表示将复制的数据粘贴到光标所在位置的上一行,如果复制的数据是多行则粘贴多行数据;
J 将光标所在行与下一行的数据合并成同一行;
c 表示重复删除多个数据,例如向下删除5行数据就是【5cj】;
u 恢复前一个操作;
【Ctrl】+r 重复做上一个操作;
. 重复前一个操作;

从一般命令模式切换到编辑模式的相关方法及按键说明:

i与I 进入插入模式:i表示从目前光标所在处插入,I表示在目前光标所在行的第一个非空格符处开始插入;
a与A 进入插入模式:a表示从目前光标所在处的下一个字符处开始插入,A表示从光标所在行的最后一个字符处开始插入;
o与O 进入插入模式:o表示在目前光标所在行的下一行插入新的一行,O表示在目前光标所在行的上一行插入新的一行;
r与R 进入替换模式:r表示替换光标所在的那个字符一次。R表示一直替换光标所在的的字符,直到按下【ESC】为止;
【ESC】 退出编辑模式,回到一般命令模式;

从一般命令模式切换到命令航模是的相关方法及按键说明:

:w 将编辑的数据写入硬盘文件中;
:w! 若文件属性为只读时,强制写入该文件。不过这并不保证就能写入,这与文件的权限有关;
:q 退出vi编辑器;
:q! 若修改过文件,又不想保存,使用!为强制退出不保存;
:wq 表示保存后退出,若为:wq!则表示强制保存后退出;
ZZ 表示若文件没有修改,则不保存退出,若文件已被修改过,则保存后退出;
:w[fielname] 将编辑的数据保存成另一个文件(类似另存新文件);
:r[filename] 表示将指定的文件数据加入到当前文件内容中,加入的位置是当前光标所在位置的后面;
:! command 表示暂时退出vi,执行command这个命令,比如【:! ls /home】表示暂时退出当前的vi,查看/home的ls输出的文件信息;
:set nu 显示行号,设置之后,会在每一行的前缀显示该行的行号;
:set nonu 与set nu相反,表示取消行号;

 以上就是关于vi编辑器的基本操作说明,其实这个跟我们平时使用的编辑器差不多,只是操作从鼠标点击变成了命令形式,找一些案例练习几遍机会了,后面关于管理linux的应用也会使用到vi编辑器,用多了就熟练了。

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

先使用vi在/tmp下创建一个test.txt文件,随便输入一些内容后保存,这里这一步就当熟悉2.2中的vi相关操作:

 cd /tmp  #确保tmp目录下没有test.txt文件,如果有test.txt这个文件的话就跳过创建test.txt文件的步骤

 vi test.txt  #这一步执行后就会进入vi文件编辑的一般模式,然后使用【i、a、o、I、A、O】都可以进入文件编辑模式,进入编辑模式以后随便输入一些字符

 #输入一些字符以后使用【ESC】按键从编辑模式切换到一般模式

 #进入到一般模式以后使用【:w】将刚刚编辑的文件内容写入到磁盘(保存),不用退出,到这里文件创建就完成了

 #然后再使用【i、a、o、I、A、O】进入编辑模式,将文件内容做一些修改,再使用【ESC】回到一般模式

 #使用【CTRL+z】将vi丢到后台执行,然后输入下面的命令来查看/tmp下的文件信息

 ls -al  #找到下面这两个文件信息,就说明前面的操作都正确的完成了

 -rw-r--r--.  1 root root     21 7月   2 17:39 test.txt
 -rw-------.  1 root root  12288 7月   2 17:43 .test.txt.swp

在使用【CTRL+z】之后还会打印一些提示信息,严格来说这部分内容属于进程管理的相关内容,后面关于Linux进程管理会有详细的解析,这里只需要知道可以直接通过这个组合按键退出到终端的命令界面,并且不像使用【:wq】的方式退出会删除缓存,这个退出方式不会删除缓存,并且后面的文件修改也不会保存到test.txt中,因为修改的操作还缓存在.test.txt.swp这个文件中,因为非正常退出导致缓存没有真正写入到磁盘,除了这种强制的手动退出,还有就是当设备宕机时也会产生类似的情况。

下面再使用vim来打开test.txt文件:

 vim test.txt  #这时候会出现提示信息,而不是进入vi的一般模式,这个提示信息就是告诉你上次编辑文件时有未写入文件的缓存,可以使用【R】恢复(即【SHIFT+r】)

上面的【SHIFT+r】操作表示将缓存中的数据写入到文件中,但这并没有写入到磁盘中,还是需要【:w】写入到磁盘,然后需要注意的是即便这一次正常使用【:q】退出vi编辑器,上一次的缓存文件 .test.txt.swp 也不会被删除,而是还需要手动删除这个缓存文件,不然后面再使用vi打开test.txt文件还会提示有缓存没有写入文件。

 rm .test.txt.swp  #将已经恢复并保存到文件的缓存数据文件删除

还有一种可能再使用vim打开文件时出现提示缓存未被写入的情况,就是当前还有另一个用户在使用vi编辑同一个文件,这种情况就只能等待另一个用户结束vi编辑操作,然后你才能继续处理,不然多人同时编辑文件就会乱套了。当然除了恢复文件的缓存数据以外,也还支持其他方式处理缓存,也就是使用vi打开文件时出现缓存警告提示时:

O 使用只读模式打开文件,不会恢复缓存。
R 使用恢复缓存的模式打开文件,缓存中的数据会被恢复。
E 直接进入编辑模式,不会加载缓存;
Q 退出编辑;
A 标准终止这个命令操作,表面上看跟Q操作一致。

 

 三、vim的额外功能

3.1默认vim

在前面恢复缓存中就是用过vim了,不过有的新版Linux已经使用vim替换了vi,也就是说当你在使用vi的时候实际上是在使用vim,可以通过 alias 命令来查看当前的Linux是否使用vim替换了vi:

 alias  #这是用来查看Bash命令相关解释的内容,这在下一篇博客会介绍,如果该命令执行打印的内容有以下内容,就说明vim默认替换了vi

 #...

 #alias vi='vim'

 #...

3.2vim编辑程序文件的颜色字体

这个不需要太多介绍,在现在的代码编辑器中都有这样的功能,可以使用vim打开/etc/services这个系统规划的配置文件看看vim的程序文件颜色字体效果。

3.3可视区块(类似按住鼠标左键选择文本内容)

v 选择光标经过的字符;
V 选择光标经过的行;
【Ctrl+v】 选择光标移动矩块的字符;
y 复制选择的字符;
d 删除选择的字符;
p 将复制的内容粘贴到光标所在位置;

 3.4vim多文件编辑

vim可以一次打开多个文件,还有在一般模式下使用【:r filename】读入某个文件,都可以在一个vim编辑窗口下同时编辑多个文件,关于编辑多文件的以下操作如下:

:n 编辑下一个文件;
:N 编辑上一个文件;
:files 列出目前vim打开的所有文件;

 根据前面示例创建的test.txt文件,这里可以通过vim test.txt test1.txt同时打开两个文件来测试多文件编辑,打开文件以后可以先测试【:files】,然后测试【:n】、【:N】,然后使用yy复制test.txt中一行数据,再通过【:n】切换到test1.txt中使用【p】粘贴,测试完这些就能理解vim的多文件编辑了。

3.5vim多窗口功能

有了3.4中的多文件编辑经历你肯定会因为一个vim窗口只显示一个文件内容,导致浏览和编辑切换体验非常差,那这个多窗口功能就是最好的解决方案,上面3.4的测试案例如果你没有退出的话,vim窗口上显示应该是test1.txt的文件内容,这时候可以尝试使用【:sp test.txt】创建一个新的窗口来展示单前被隐藏的test.txt文件。下面再来介绍一下多窗口的相关具体操作:

:sp [filename] 创建一个新的窗口,filename是可选的,如果没有文件名就创建一个空白窗口,如果指定文件名则可以在这个窗口展示新的文件,这个文件可以是当前vim打开的文件,也可以不是当前打开的文件;
【Ctrl+w+j】 或【Ctrl+w+↓】 切换到上一个窗口
【Ctrl+w+k】 或【Ctrl+w+↑】 切换到下一个窗口

 多窗口也可以实现同时多个窗口打开同一个文件,这样就是在不同的窗口上展示出同一个文件的不同行的数据;切换窗口除了使用按键组合还可以使用【Ctrl+w】连续触发来逐个切换,还可以长按来快速逐个切换。

3.6vim的关键词补全功能

关于vim的补全功能相对于vs code这些功能丰富的文档编辑器就现得有些麻烦了,在现代文档编辑器中他会有自动补全提示,而在vim中就需要使用【Ctrl+x】+【Ctrl+n | f | o】的方式来实现补全。【Ctrl+x】是切入到补全状态,它会将当前光标的位置开始往前到一个空格符的一段字符作为补全的前部分,然后再使用后面三种补全匹配方式来检索匹配要不全内容,比如【Ctrl+n】则是在当前文档内容中匹配内容,通过多次【Ctrl+n】来切换到要补全的内容,后面了两则一致,只是它们三个补全检索的内容不一样:

【Ctrl+n】检索匹配的是文件内容、【Ctrl+f】检索匹配的是文件名(即当前打开的文件名称)、【Ctrl+o】检索匹配的是vim內置的关键字。

3.7vim环境设置与记录

还记得前面的的可视区块使用v、V、【Ctrl+v】选中的字符吗?当选中字符以后会出现反白的提示,如果这时候不做任何操作,直接退出然后再使用vim打开这个文件时会发现上次选中的反白提示还在,这就是vim将上一次操作记录了下来,甚至再次打开的文件不是同一个文件但上次选中的字符在这个再次打开的文件中也存在,这个被打开的文件对应的字符也会出现反白。还有比如上一次vim退出前光标停留的位置,在下一次打开文件以后也会在上一次位置上。以上这些记录被存储在~/.viminfo中。

然后就是一些vim环境配置,关于vim的换进配置信息都存储在/etc/vimrc这个文件中,可以通过【:set all】来查看环境配置信息:

:set nu

:set nonu

设置与取消行号;

:set hlsearch

:set nohlsearch

高亮查找,就是将查找的字符串做反白处理,默认hlsearch开启;

:set autoindent

:set noautoindent

是否自动缩进;

:set backup

:set nobackup

是否自动备份原文件?一般情况下是nobackup,如果设置未backup的话,当修改一个文件以后,该文件的源文件会被备份另存为一个filename~的文件;
:set ruler 这个是用来定义是否显示右下角信息,就是显示光标位置的信息;
:set showmode 这个是用来定义是否显示左下角信息,比如使用i进入编辑模式时会显示--INSERT--的信息那一栏;
:set backspace=(0|1|2) 一般使用i进入编辑模式时,可以使用退格键【BACKSPACE】删除刚刚编辑的字符,但有些Linux发行版不可以,当这个值设置为2时可以删除任意字符,0和1仅可删除刚刚输入的字符;
:set all 显示所有环境参数设置信息;
:set 显示非默认环境参数设置信息,就是显示自定义的环境参数;

:syntax on

:syntax off

是否根据程序相关语法显示不同颜色,on表示开启显示并且还会有错误提示,off表示关闭显示

:set bg=dark

:set bg=light

设置不同的颜色色调,配合syntax on使用

 以上的设置其实每次执行vim都会刷新,也就是说如果要自定以就要每次都设置,所以这样非常不方便,但一般情况下使用默认的环境配置也足够了,如果需要自定义固定的配置可以修改/etc/vimrc这个文件,但绝对不建议这样做。除了前面直接在/etc/vimrc上修改配置文件,还可以创建一个~/.vimrc文件来配置一个固定的vim环境配置,比如下面这样的配置:

 vim ~/.vimrc

然后示例配置信息如下:

"这个文件的双引号(")是注解
set hlsearch    "高亮度反白
set backspace=2    "可随时用退格键删除
set autoindent    "自动缩进
set ruler    "可显示右下角的信息
set showmode    "可显示左下角的信息
set nu    "显示行号
set bg=dark    ”显示不同的底色色调
syntax on    "进行语法检验,色调显示

 四、其他vim使用注意事项

4.1中文编码与语系编码转换

关于编码问题,首先是安装系统是的编码没有设置为中文编码格式,这部分在Linux操作系统(二):初步了解Linux的2.2中就有介绍了,然后就是vim的四个环境配置:fileencodings、fileencoding、encoding、termencoding。先来看这四个配置分别起到什么作用:

fileencodings:当vim打开文件时,vim会根据这个配置中设置的字符编码集列表来探测文件的编码格式,如果探测成功就会将探测成功的字符编码集赋给fileencoding,如果探测失败则会用空表示,使其与encoding配置编码集保持一致。

fileencoding:编辑当本是使用的字符编码集;

encoding:写入磁盘时的字符编码集,如果encoding与fileencoding不一致时,则会将fileencoding的字符编码数据转换成encoding的字符编码集数据再写入磁盘;

termencoding:表示vim屏幕上显示的字符编码集,如果它与fileencoding不一致时,它会将vim内部的编码也就是fileencoding的编码转换成termencoding显示出来,如果termencoding没有设置则直接使用encoding配置的字符编码集;

以上这四个配置都可以使用 :set 配置名称 在vim一般模式下查看它的值,搞明白这四个配置的相互关系基本上就能解决vim的编码问题了。这些关系到系统的字符编码相关问题,后面深入探究操作系统的相关博客中再详细的介绍。

然后就是文件的编码转换,这个需要使用到iconv这个命令,这个命令也是非常简单,就是将文件的编码格式转换成指定的编码格式,例如将一个Big5的编码格式文件转换成utf-8编码格式:

 iconv -f big5 -t utf8 filename.big5 -o filename.utf8  #-f表示原编码格式;-t表示目标编码格式;-o表示保留原文件,将转换编码格式的文件数据存储到新文件中

如果不是-o则会使用转换的文件数据替换原文件,文件后缀没有实际意义。

4.2DOS与Linux的换行符

在互联网环境下的应用不可避免的要在不同的操作系统的计算机之间传递文件,如果要在不同的计算机系统上打开另一个操作系统传递过来的文件肯定就会遇到换行符的问题,常见的就是基于DOS的windows系统的文件的换行符是^M$,通常被称为CR和LF两个符号;而在Linux上仅使用LF($)这个换行符,要想打开不同操作系统的文件就需要进行换行符转换,换行工具就是dos2unix、unix2dos,但是这个换行符转换工具并没有被Linxu系统默认安装,怎么安装我就不介绍了,网上的介绍文档很多,安装好以后就可以使用这两个命令来转换文件了:

 dos2unix -k filename  #将linux下的unix文件转换成dos文件

 unix2dos -k filename  #将dos文件转换成Linux下的unix文件

工具应用也非常简单,不了解怎么使用的话参考man文档就可以了,网上的介绍也不少。

 



这篇关于Linux操作系统(六):vim程序编辑器的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程