0
点赞
收藏
分享

微信扫一扫

Linux必备技能-vim编辑器深入讲解(9)

曾宝月 2023-07-25 阅读 79


vim编辑器

我们说过vim是文本编辑器,什么是文本编辑器呢?简单来讲我们从名字上就能知道它
能实现编辑文本的,但这里我们要强调一个概念文本,这里的文本指的是纯文本信息。
所谓纯文本站在ASCII的角度来讲,它指的是必须是纯粹的不加任何修饰的文本信息。

比如我们此前都接触过的字处理工具,word保存的就不是纯文本信息。为什么这样讲呢?
因为它的每一个字在定义完以后,字有字体有颜色、有下划线。这些本身是我看到的信
息本身吗?

不是的。但这个字处理工具要不要把他们保存下来?要的否则下次是没法查看的。这些
我们称为文本中的原数据。它们可以在里面加很多修饰符,很可能基于某种文档格式来
定义的。这些文档格式说白了就类似于浏览器中看到的超文本。超文本依靠于标签来
实现。而对word来讲也类似于这样,只不过用到的标签不同。这些标签是我们用户看
不到的。

而所谓文本处理工具表示绝不允许文本信息中出现任何多余的信息,任何一个文本除了
文本本身的数据之外没有任何别的信息了。这种才叫文本编辑器。Windows中的记事
本就类似于有这种功能。

vim是一个纯粹的文本编辑器,它这里能编辑ASCII,同时有支持Unicode编码方式。
但是对于中文的话,它们可能支持常见的字符集。 

Unicode是一种独特的字符集,大家知道jbk是中文编码、ASCII是纯英文编码、另外
还用拉丁编码等等。不管怎么讲它们其实都有许许多多的基本字符,在每一种语言当中。
为了能够使得一种字符集中能容纳全球的所有字符集。如果没有这种功能会有问题的。
为什么这样讲呢?

我们如果使用中文编码的中文的字符集拿到英国去,它们支持中文的话打开会出现的都
是乱码。为了避免出现这种问题。现在都有一种全球统一编码的字符集编码机制就叫做
Unicode。
因此Unicode目前来讲,为了能够使得更加全球化支持,包括网页开发也是同样道理。
通常现在比较流行使用Unicode编码机制。



文本编辑器:
	文本:纯文本,ASCII text; Unicode;

文本编辑的种类:
	行编辑器: sed
	全屏编辑器:nano,vi,

vi是什么意思呢?	可视化接口
	Visual Interface

vim: Vi IMproved vi的增强版

如何使用vi:

vim:
	模式化的编辑器

		基本模式:
			编辑模式,命令模式
			输入模式
			末行模式:
				内置的命令行接口


	模式化的编辑器,什么叫模式化呢?也就意味着对vi来讲他有诸多不同的模式。
  在每一种模式下就意味着我们用户基键操作所带来的功能是不一样的所有这种我们
  称为模式。
	
  也就意味着你的打开姿势不同,带来的结果也就不一样。

	一般而言vim有着几种基本模式,第一种我们称为编辑模式,也称为命令模式。
  既然叫编辑模式,我们所涉及到的操作主要就是编辑。大家知道比如我们打开一个
  记事本文档可以选中一个文本块,然后删除。然后选中一行或者两行文本复制并且
  找一个地方粘贴等等等。这个过程我们就称为编辑操作的过程。

	但是如果说我们打开一个记事本以后在里面原有的文本之上输入很多很多的数据,
  这个过程就是输入的操作。通常称为输入模式,也叫插入模式。

	第三种我们称为末行模式,末行模式其实是vim或者是vi的内置的命令行接口,
  也意味着说,这个编辑内部自带很多命令,我们可以在命令行的接口下向其发出
  指令,让其完成一定意义上的操作。大体上有这三种常见的模式。


如何使用vim打开文件?	

	对vim打开一个文件的时候,和nano一样事先指定的文件路径并不存在,他会事
  先创建此文件,并把我们编辑的内容都保留在文件当中。如果文件事先存在的话则
  会打开此文件。并让光标默认在第一行的最左侧。也就是第一行的第一个字符上。

	  # vim [options] [file ..]

	  		+#:打开文件后,直接让光标,直接处于第#行的行首;
	  		+/PATTERN:打开文件后,直接让光标定位于第一个被PATTENR匹配到的行
                  首;  

	  		注意:PATTERN就是我们学的正则表达式的模式,格式前两个是固定的

如何实现模式转换?	  		
	因为对我们要使用vim来讲最重要的就是在各个模式之间转换,因为我们需要在不同
  模式下完成不同的操作。

	比如说,我们第一个模式默认处在编辑模式,是让我们打开文件时默认就处在编辑模
  式。所以编辑模式是默认模式,但是在编辑模式下我们打开文件以后会执行某些编辑
  操作。	比如执行某些输入操作,在我打开的文件中加上一行信息怎么办呢?这就需
  要进入输入模式。我们如何能够将输入的信息给输入进去,这就需要将编辑模式转化
  为输入模式。由编辑模式进入到输入模式大体上需要这样几个命令。

	编辑模式:默认模式
		编辑模式-->输入模式:
			i: 表示insert。在光标所在出输入;
			a: append,在光标所在处后方输入;
			o: 在光标所在处打开一个下方打开一个新行;
			I: 在光标所在行的行首输入;
			A: 在光标所在行的行尾输入;
			O: 在光标所在处的上方打开一个新行;

		输入模式-->编辑模式
			只需要键入ESC键

		
	从编辑模式进入到末行模式只需要用冒号就可以了 ":"。使用末行模式们可以完成许
	多复杂的操作,比如说删除文件中的10到100行。:10,100d。这样就可以删除了。
  如果不想删除了还可以撤销回来。所以在末行模式下我们可以支持许多复杂的操作。
  
  在比如说我们可以在每一行的行首显示行号: set nu。
  撤销行号的显示 :set nonu。所以这
	是一个非常强大的内置命令行接口。
	

		编辑模式-->末行模式
			使用冒号 :

		末行模式-->编辑模式
			连续按两次ESC

如何关闭文件?		
	ZZ:在编辑模下使用连续按两次大写的ZZ,表示保存并退出。

	末行模式下的退出:
		q: 退出。使用的前提是文件没有任何修改,只是单纯的看了看文件。
		q!: 强制退出,不保存此前的编辑操作
		wq: 保存修改并退出 
		x: 保存并退出
		w/PATH/TO/SOMEFILE: 把做出的修改保存至写出到指定的文件中去。
							这个相当于另存为文件。

如何实现光标的跳转?							

	光标间跳转,根据跳转范围大体上可以分为所谓叫字符间跳转,也可以在单词间跳转
  
	同时又能在行首行尾跳转、行间跳转、句间跳转、也可以段间跳转。

	字符间跳转:
		h: 光标向左跳转  左
		j: 光标向下跳转  下
		k: 光标向上跳转  上
		l: 光标向右跳转  右

		#COMMAND: 跳转由#指定的个数的字符
	
	单词间跳转:
		w: 下一个单词的词首;
		e: 当前或后一个单词的词尾;
		b: 当前或前一个单词的词首;

		#COMMAND: 跳转由#指定的个数的单词

	行首行尾跳转:
		A: 跳转至行首的第一个非空白字符;
		O: 跳转至行首
		$: 跳转至行尾

	行间跳转:
		#G: 跳转至由#指定的行
		1G,gg: 跳转至第一行
		G: 跳转至最后一行

	句间跳转: 
		) : 右括号表示跳到下一句
		( : 左括号跳转到前一句
	
	段间跳转:
		} :前一段
		{ :后一段

翻屏操作:
	Ctrl+f: 向文件尾部翻一屏
	Ctrl+b: 向文件首部翻一屏
	Ctrl+d: 向文件尾部翻半屏
	Ctrl+u: 向文件首部翻半屏
	Enter: 按行向后翻

vim的编辑命令:

	字符编辑:
		x: 删除光标所在处的字符;
		#x: 删除光标所在处起始的#个字符

		xp: 交换光标所在处的字符与其后面字符的位置

	替换命令(replace):
		r: 替换光标所在处的字符
			r+CHAR
	删除命令:
		d: 删除命令,可结合光标跳转字符,实现范围删除;
			d$: 删除当前光标所在处至行尾的内容
			d^: 删除光标所在处至行首的内容
			
			dw: 删除当前单词
			de:	
			db:
				#COMMNAD
			dd: 删除光标所在处的这一整行
			#dd: 删除光标所在处的行起始的共#行;
				 删除的内容不会被清除掉,而是会保存在缓存区中。保留N个,最后一个
         可以被粘贴;
         
	粘贴命令(p,put,paste)
		p:缓冲区中的内容如果为整行,则粘贴在当前光标所在行的下方;否则,则粘贴  
    至当前光标所在处的后方;
	
  大写P: 缓冲区中的内容如果为整行,则粘贴在当前光标所在行的上方;否则,
  				则粘贴
		  至当前光标所在处的前方;
	
	复制命令(yank,y)
		y: 复制,工作行为相似于d命令

		y$:复制一部分内容
		y^:
		y0:

		ye
		yw
		yb
			#COMMAND
		yy: 复制一整行
		#yy: 复制#行

改变命令(change,c):
	编辑模式-->输入模式,实现删除操作;

	c$
	c^
	c0

	cb
	ce
	cw 
		#COMMAND
	cc: 删除光标所在的行,并转换为输出模式


可视化模式:
	v:按照字符选定
	V大写:按行选定

	结合编辑命令使用:
		d: 选中后删除
		c: 删除并且修改
		y: 复制


撤销(undo)操作:
	u: 撤销此前的操作	,默认前50次的编辑操作。保存在缓冲区才可以被撤销	

	#u: 撤销此前的#个操作

撤销此前的撤销操作:	
	Ctrl+r

重复执行前一个编辑操作:
	点号: .

vim自带的练习教程: vimtutor

vim 的高效用法进阶: vim编辑器和bash算术

vim末行模式:

内嵌的命令行接口

事实上各位应该知道,vim内键的命令行接口是一个能够使得vim编辑器功能更为完善,
更加强大的工具。我们要想在末行模式下实现文本编辑的功能的那么需要先学的是地址
定界。
说到这里我们需要交代一下Vim内键入的命令行接口所能够实现使用的命令行的命令种
类是非常多的。比如像定义vim自己的特性,再不然我们就是实现编辑的,还有实现文
本查找和替换的相关命令。

我们要结合所谓其内部的行地址定界机制来完成选对选定的文本在末行模式下做出编辑
操作。比如说我们现在此前讲到我们可以使用3dd和5dd等等删除3行或者5行。我们如
果删除第10行到第100行之间所有的行,用这样的方式太麻烦了。所以说这个时候使
用末行模式将更为简单,但是要想了解末行模式,第一步我们先学会如何实现在末行
模式下完成地址定界的功能,说白了就是我们指明对那个范围内或者是哪些范围内文
本做处相关操作。这个时候我们要指明。

一般而言地址定界方式我们指明start_pos并基于逗号隔开指明[,end_pos]
就是起始位置和结束位置。起始位置和结束位置之间我们使用逗号隔开。 而后面可
省略就表示我们也可以仅定位某一特定行。比如我们在末行模式下指明只有一个数字。
#表示特定的第#行,例如5即第5行。

(1)地址定界机制
	:start_pos[,end_pos]
		#: 特定的第#行,例如5即第5行;
		.:点号表示当前行;
		$:最后一行;	
		 	例如: .,$-1:表示从当前行到最后一行减一的那一行; 

		#,#: 指定行范围,左侧为起始行,右侧为结束行;
		#,+#: 指定行范围,左侧为起始行的绝对编号,右侧为相对左侧行号的偏移量;
			  例如:3+7.表示从第三行开始在包括向后面加7行,一共8行内容。
		%:全文。 1,$也表示全文
		/pattern/: 从光标所在处起始向文件尾部第一次被模式所匹配到的行;	  
			/first/,$
		/part1/,/pat2/: 从光标所在处起始,第一次由part1匹配到的行开始,至第一
						次由part2匹配到的行结束之间的所有行;	

		可同编辑命令一同使用,实现编辑操作:
			d:删除
			y:复制
			c:修改

			w/PATH/TO/SOMEFILE: 讲范围内的文本保存至指定的文件中	
			r /PATH/FROM/SOMEFILE: 将指定的文件中的文本读取并插入至指定的位
									置
				我们在实现文件合并的时候。这个命令是非常好用的	

(2)查找
	/PATTERN: 从当前光标所在处向文件尾部查找能够被当前模式匹配到的所有字符串
	?PATTERN: 从当前光标所在处向文件首部查找能够被当前模式匹配到的所有字符串	
		n: 下一个,与命令方向相同
		N: 上一个,与命令方向相反

(3)查找并替换: 							
	 s: 末行模式的命令: 使用格式:
	 	s/要查找的内容/替换为的内容/修饰符
	 		
	 		要查找的内容:可使用正则表达式
	 		替换为的内容:不能使用正则表达式,但可以引用;	
	 		
	 			如果 "要查找的内容" 部分在模式中使用分组符号: 在"替换为内容"
	 			中使用后向引用

	 			直接引用查找模式匹配到的全部文本,要使用&符号

	 		修饰符: 
	 			i: 查找时,忽略大小写
	 			g: 全局替换,意味着一行中如果匹配到多次,则均替换	

	 	可把分隔符替换为其它非常用字符:
	 		s@@@
	 		s###
	 						
	 	示例:%s@/cgroup/systemd@/etc/sysconfig@g	

	 	练习:只适用于Centos7

	 		1.复制/etc/grub2.cfg文件至//tmp目录中,用查找替换命令删除
	 		  /tmp/grub2.cfg文件中以空白字符开头的行的行首的空白字符;
	 		  	%s@^[[:space:]]\+@@

	 		2.复制/etc/rc.d/init.d/functions文件至/tmp目录中,用查找替换命
	 		  令为/tmp/functions文件的每个以空白字符开头的行的行首加上#;
	 		  	%s@^[[:space:]]@#&@g

	 		3. 为/tmp/grub2.cfg文件的前三行的行首加上#号
	 		
	 		4.将/etc/yum.repos.d/CentOS-Base.repo文件中所有的enabled=0替
	 		  换位enabled=1,所有gpgcheck=0替换为gpgcheck=1; 
	 		 	 %s@\(enabled\|gpgcheck\)=0@\1=1@g

vim的多文件功能:

多文件:
	vim FILE1 FILE2...

		在文件间切换末行模式下:
			:next 下一个
			:prev 上一个
			:first 第一个
			:last 最后一个

		退出所有文件:
			:wqall 保存所有文件并退出;
			:wall
			:qall
多窗口:
	-o: 水平分隔窗口
	-O: 垂直分隔窗口			

	在窗口间切换: Ctrl+w,同时按住。接下来可以按方向键ARROW

	注意:单个文件也可以分割为多个窗口进行查看

		Ctrl+w,s: 水平分隔窗口
		Ctrl+w,v: 垂直分隔窗口


定制vim的工作特性:
	
	注意: 在末行模式下的设定,仅对当前vim进程有效;
	
	永久有效:
		全局:/etc/vimrc
		用户个人: ~/.vimrc
			用户个人这个文件可能不存在,需要自己创建

	1、行号
		显示: set number,简写 set nu
		取消显示: set nonumber,set nonu

	2、括号匹配高亮显示
		匹配:set showmatch, set sm
		取消:set nosm 	

	3、自动缩进功能	
		abc第一行打完abc后在敲回车换号会直接缩进到a的位置开始

		启用: set ai
		禁用: set noai

	4.高亮搜索
		启用: set hlsearch
		禁用:  set nohlsearch

	5、语法高亮
		启用: syntax on
		禁用: syntax off

	6、忽略字符大小写
		启用: set ic
		禁用: set noic	

获取帮助:
	:help
	:help subject

课外作业:如何设置tab键缩进4个字符;

bash脚本编程之算术运算

+,-,*,/,**次方,%

bash脚本中如何实现算术运算功能?

必须使用算数运算格式

算术运算格式:
	(1)let命令
		let VAR=算术运算表达式; 运算结果就会保存到VAR变量中
		查看结果使用echo

	(2)	VAR=$[算术运算表达式]

	(3) VAR=$((算术运算表达式))

	(4) VAR=$(expr $ARG1 $OP   $ARG2)
					参数	 运算符  参数

	注意: 乘法符号在有些场景中需要使用转义字符

练习:						
	写一个脚本,完成如下功能:
		添加三个用户
		求此三个用户的UID之和

举报

相关推荐

0 条评论