目录
慕课网:https://www.imooc.com/learn/111
1 VIM编辑器概述
VIM是VI的升级版本,vim是一个“程序编辑器”。用VI打开一个文件后按a才可以进行编辑,VI编辑器一次可以编辑多个文件。
2 VIM编辑器的操作模式
2.1 vim的模式
- 一般模式:以 vim 打开一个文件就直接进入一般模式了(这是默认的模式)。在这个模式中,你可以使用上下左右按键来移动光标,你可以删除字符或删除整行,也可以复制、粘贴你的文件数据。
- 编辑模式:在一般模式中可以进行删除、复制、粘贴等的操作,但是却无法编辑文件内容的。要等到你按下“i,I,o,O,a,A,r,R”等任何一个字母之后才会进入编辑模式。通常在Linux中,按下这些按键时,在界面的左下方会出现 INSERT 或 REPLACE 的字样,此时才可以进行编辑。而如果要回到一般模式时,则必须要按下【Esc】这个按键即可退出编辑模式。
- 命今行搜式:在一版模式当中,输入“: 、/、?”3个中的任何一个按钮,就可以将光标移动到最下面那一行。在这个模式当中,可以提供你查找数据的操作,而读取、保存、大量替换字符、离开vi、显示行号等操作则是在此模式中完成的。
简单地说,我们可以将这3个模式想成下面的图来表示,如下图所示。
vim abc
使用vim编辑器打开名为abc的文件,没有这个文件时,自动创建。刚启动时,默认命令模式;敲击字母I,或者Insert键,进入输入模式;修改好后,点击esc键,进入底行模式,再选择退出方式退出。
vim打开文件后,底行模式下双击D可以删除光标所在的一行。
2.2 简单执行范例
[root@localhost tmp]# vim /etc/man.config
当vim 打开的是旧文件时,如上图所示,最后一行会有额外信息。第一个红框是文件名;第二个红框代表文件内有152行以及4940个字符的意思;第三个红框代表光标所处的行、字符;最后一个红框显示的是所处的位置,有可能是百分数。
2.3 按键说明
2.3.1 移动游标
2.3.2 搜索与取代
2.3.3 删除、复制以及粘贴
2.3.4 一般模式切换到编辑模式
2.3.5 一般模式切换到命令列模式
2.3.6 块选择
2.3.7 多文件编辑
2.3.8 多窗口功能
2.3.9 补齐
2.3.10 环境设定参数
是否每次使用 vim 都要重新设置一次各个参数值?其实我们可以通过配置文件来直接规定我们习惯的vim操作环境,整体vim的设置值一般是放置在/elc/vimrc这个文件中,不过,不建设你修改它,你可以修改~/.vimrc这个文件(默认不存在,请你自行手动创建)、将你所希望的设重值写入。
vim的环境设定参数如下:
3 VIM编辑器的命令模式
“vim 文件名”打开时,有些Linux操作系统,光标默认在第一行;也有些Linux操作系统,光标定位在上次退出该文件时光标的位置。
vim + abc 打开文件后,光标定位在文件的最后一行。
vim +3 abc 打开文件后,光标定位在文件的第三行。当+号后面的数字大于最大的行数时,光标默认定位在最后一行。
vim +/imooc abc 打开文件后,光标定位在imooc出现第一次的那一行,按N可以向下查找下一个imooc。
vim aa bb cc 同时打开或创建这三个文件。打开时首先出现的aa文件,在底行模式中输入 :n,可以切换到bb文件;当切换到最后一个文件时,可以在底行模式输入 :N 或者 :prev 切换到前一个文件。
4 底行模式和命令模式常用指令
:w:将文件的修改将内存写入硬盘。
:q :退出vim打开的文件。
:! :强制
:ls :列出当前编辑器打开的所有文件
:n:切换到后一个文件
:15:光标快速定位到第15行
/xxx:从光标位置开始,向后搜索xxx字符串,搜索到xxx第一次出现的位置,并把光标定位到那个位置。
?xxx:从光标位置开始,向前搜索xxx字符串,搜索到xxx第一次出现的位置,并把光标定位到那个位置。
5 vim指令图
6 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 工作被不正常中断,此时暂存文件会被保留下来,但是如果此时继续编辑那个文件,会弹出警告信息。
这里可以看到找到了文件 man.config 的暂存文件 man.config.swp
此时vim会主动判断这个文件可能有问题,上面的提示中主要有两点主要的问题与解决方法。
(1)其他人或程序同时在线编辑这个文件
由于Linux是多人多工的环境,因此很可能有很多人同时在编辑同一个档案。如果在多人共同编辑的情况下,万一大家同时储存,那么这个档案的内容将会变的乱七八糟。为了避免这个问题,因此vim会出现这个警告视窗。解决的方法则是:
a) 找到另外那个程式或人员,请他将该 vim 的工作结束,然后你再继续处理。
b) 如果你只是要看该档案的内容并不会有任何修改编辑的行为,那么可以选择开启成为只读(O)档案,亦即上述画面反白部分输入英文“o”即可,其实就是 [O]pen Read-Only 的选项。
(2)在前一个vim的环境中,可能因为某些不知名原因导致vim中断(crashed)
这就是常见的不正常结束vim产生的后果。解决方案依据不同的情况而不同。常见的处理方法为:
a) 如果你之前的vim处理动作尚未储存,此时你应该要按下“R”,亦即使用(R)ecover的选项,此时vim会载入 .man_db.conf.swp 的内容,让你自己来决定要不要储存!这样就能够救回来你之前未储存的工作。不过那个.man_db.conf.swp并不会在你结束vim后自动删除,所以你离开vim后还得要自行删除.man_db.conf.swp,才能避免每次打开这个档案都会出现这样的警告!
b) 如果你确定这个暂存文件是没有用的,那么你可以直接按下“D”删除掉这个暂存档,亦即 (D)elete it 这个项目即可。此时vim 会载入man_db.conf ,并且将旧的 .man_db.conf.swp 删除后,建立这次会使用的新的 .man_db.conf.swp 。
这个发现暂存档警告讯息的画面中,有出现六个可用按钮,各按钮的说明如下:
[O]pen Read-Only:打开此档案成为只读档,可以用在你只是想要查阅该档案内容并不想要进行编辑行为时。一般来说,在上课时,如果你是登入到同学的电脑去看他的设定档,结果发现其实同学他自己也在编辑时,可以使用这个模式;
(E)dit anyway:还是用正常的方式打开你要编辑的那个档案,并不会载入暂存档的内容。不过很容易出现两个使用者互相改变对方的档案等问题!不好不好!
(R)ecover:就是载入暂存档的内容,用在你要救回之前未储存的工作。不过当你救回来并且储存离开vim后,还是要手动自行删除那个暂存档喔!
(D)elete it:你确定那个暂存档是无用的!那么开启档案前会先将这个暂存档删除!这个动作其实是比较常做的!因为你可能不确定这个暂存档是怎么来的,所以就删除掉他吧!哈哈!
(Q)uit:按下q就离开vim ,不会进行任何动作回到命令提示字元。
(A)bort:忽略这个编辑行为,感觉上与quit非常类似!也会送你回到命令提示字元就是啰!
7 中文编码的问题
https://blog.csdn.net/GX_1_11_real/article/details/84257586
Linux系统与windows系统在编码上有显著的差别。Windows中的文件的格式默认是GBK(gb2312),而Linux系统中文件的格式默认是UTF-8。这两个系统就好比是中国和日本。文件就好比是一个人,如果要在另外的国家居住就要办理居住许可证,使用他国的证件(编码和字符集),否则是不被允许的黑户。因此,解决中文乱码问题要从编码和字符集着手。
7.1 从系统的字符集处理
(1)查看当前系统默认采用的字符集
(2)查看系统当前字符集:
(3)查看系统是否安装中文字符集
出现zh开头的,即为安装了中文字符集
如未安装,需执行: yum -y groupinstall chinese-support
locale -a |grep zh
(4)修改系统字符集为中文
如果前面查看到的系统当前的字符集是英文,通常修改系统字符集为中文即可成功。
临时修改(当前终端生效):
export LANG="zh_CN.UTF-8"
永久修改:
echo "export LANG="zh_CN.UTF-8" >> /etc/proflile
source /etc/profile
7.2 从文件的编码处理
当系统的字符集为中文,文件的中文部分仍然显示乱码,就从文件的编码格式处理。
(1)查看文件编码
用vim打开文件,输入:set fileencoding
fileencoding后即为该文件编码格式
(2)查看文件编码(file方式)
file 文件名
或
file --mime-encoding 文件名
(3)修改文件的字符集
① 文件的编码转换(vim方式)
这个方法,仅在vim查看时进行编码转换,文件实际上本身编码并未转换,仅仅只是可看到。
临时转换:
用vim打开文件,输入:set fileencoding=utf-8
永久转换(先确认vimrc位置):
echo "set encoding=utf-8 fileencodings=ucs-bom,utf-8,cp936" >> /etc/vimrc
或
echo "set encoding=utf-8 fileencodings=ucs-bom,utf-8,cp936" >> ~/.vimrc
vim会依照fileencodings提供的编码列表,查找合适的编码,如果没有找到就用latin-1(ASCII)编码打开。
②文件的编码转换(iconv方式)
该命令可进行文件内容的编码转换,并输出到其他位置(文件)
命令参数
-f encoding 把字符由原来的编码开始转换
-t encoding 把字符转换为新编码
-l 列出支持的编码字符(可选)
-o file 指定输出文件(可选)
-c 忽略输出的非法字符(可选)
-s 禁止输出警告信息(可选)
--verbose 显示进度(可选)
{1}.列出当前支持的字符编码
iconv -l
{2}.编码转换
基本格式:
iconv -f 原编码 -t 新编码 原文件 -o 新文件
或
iconv -f 原编码 -t 新编码 原文件 > 新文件
示例:将UTF-8编码的wx.txt文件转换为GB2312编码的test01.txt
iconv -f UTF-8 -t GB2312 wx.txt -o test01.txt
③文件名编码转换(convmv方式)
该命令可转换文件名的编码(只是文件名编码的转换,文件内容不会发生变化)
安装命令:yum -y install convmv
命令参数:
-f 后面是原来的编码方式
-t 后面是要转换为的编码方式
-r 递归处理子文件夹
-i 询问每一个转换
--notest 真实的执行,在默认情况下只会测试(只能以root权限执行)
编码转换基本格式:
convmv -f 原编码 -t 新编码 --notest(可选) 文件名
或
convmv -f 原编码 -t 新编码 --notest(可选) -r 目录名
示例:将read目录下的UTF-8编码的文件名转换为GBK编码
convmv -f UTF-8 -t GBK --notest -r read/
④文件的编码转换(enca方式)
该工具能自动识别文件编码,且支持批量转换
安装命令:yum -y install enca
基本格式:
enca -L 原编码 -x 新编码 文件名
或
enca -L 原编码 -x 新编码 目录名
示例1:把当前目录下的所有文件都转成utf-8
enca -L zh_CN -x utf-8 *
示例2:检查文件的编码
enca -L zh_CN test.txt
示例3:将test.txt文件编码转换为"UTF-8"编码
enca -L zh_CN -x UTF-8 test.txt
示例4:将test.txt文件编码转换为"UTF-8"编码,并输入test2.txt中
enca -L zh_CN -x UTF-8 < test.txt > test2.txt
8 dos与Linux的断行字符
8.1 回车符号和换行符号产生背景
关于“回车”(carriage return)和“换行”(line feed)这两个概念的来历和区别。在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33)的玩意,每秒钟可以打10个字符。但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符。要是在这0.2秒里面,又有新的字符传过来,那么这个字符将丢失。
于是,研制人员想了个办法解决这个问题,就是在每行后面加两个表示结束的字符。一个叫做“回车”,告诉打字机把打印头定位在左边界;另一个叫做“换行”,告诉打字机把纸向下移一行。这就是“换行”和“回车”的来历,从它们的英语名字上也可以看出一二。
后来,计算机发明了,这两个概念也就被般到了计算机上。那时,存储器很贵,一些科学家认为在每行结尾加两个字符太浪费了,加一个就可以。于是,就出现了分歧。Unix系统里,每行结尾只有“<换行>”,即“\n”;Windows系统里面,每行结尾是“ <回车><换行>”,即“\r\n”;Mac系统里,每行结尾是“<回车>”。一个直接后果是,Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行;而Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号
windows创建的文件是 \n\r 结束的, 而linux,mac这种unix类系统是 \n 结束的。
所以unix的文本到windows会出现换行丢失(ultraedit这种软件可以正确识别); 而反过来就会出现^M的符号了
Windows等操作系统用的文本换行符和UNIX/Linux操作系统用的不同,Windows系统下输入的换行符在 UNIX/Linux 下不会显示为“换行”,而是显示为 ^M 这个符号(这是Linux等系统下规定的特殊标记,占一个字符大小,不是 ^ 和 M 的组合,打印不出来的)。Linux下很多文本编辑器(命令行)会在显示这个标记之后,补上一个自己的换行符,以避免内容混乱(只是用于显示,补充的换行符不会写入文件,有专门的命令将Windows换行符替换为Linux换行符)。 UNIX/Linux系统下的换行符在Windows系统的文本编辑器中会被忽略,整个文本会乱成一团。
8.2 格式转换(dos2unix、unix2dos)
dos2unix命令用来将DOS格式的文本文件转换成UNIX格式的(DOS/MAC to UNIX text file format converter)。DOS下的文本文件是以 \r\n
作为断行标志的,表示成十六进制就是0D 0A。而Unix下的文本文件是以 \n 作为断行标志的,表示成十六进制就是0A。DOS格式的文本文件在Linux底下,用较低版本的 vi 打开时行尾会显示^M
,而且很多命令都无法很好的处理这种格式的文件,如果是个shell脚本。而Unix格式的文本文件在Windows下用Notepad打开时会拼在一起显示。因此产生了两种格式文件相互转换的需求,对应的将UNIX格式文本文件转成成DOS格式的是unix2dos命令。
而unix2dos则是和dos2unix互为孪生的一个命令,它是将Linux&Unix格式文件转换为Windows格式文件的命令。
语法:
dos2unix [-hkqV] [-c convmode] [-o file ...] [-n infile outfile ...] unix2dos [options] [-c convmode] [-o file ...] [-n infile outfile ...]
选项:
参数 | 描述 | |
-h | 显示命令dos2unix联机帮助信息。 | |
-k | 保持文件时间戳不变 | |
-q | 静默模式,不输出转换结果信息等 | |
-v | 显示命令版本信息 | |
-c | 转换模式 | |
-o | 在源文件转换,默认参数 | |
-n | 保留原本的旧档,将转换后的内容输出到新档案.默认都会直接在原来的文件上修改 |
参数:
参数:需要转换到文件。
实例:
最简单的用法就是dos2unix直接跟上文件名:
dos2unix file
如果一次转换多个文件,把这些文件名直接跟在dos2unix之后。(注:也可以加上-o
参数,也可以不加,效果一样)
dos2unix file1 file2 file3
dos2unix -o file1 file2 file3