文章目录
- vim编辑器的使用介绍
- vim的缓存、恢复与打开时的警告信息
- vim的额外功能
- 可视化区块
- 多文件编辑
- 多窗口功能
- vim的关键词补全功能
- vim环境设置与记录:~/.vimrc、~/.viminfo
- vim的环境设置参数
- vim常用的命令示意图
- 其他vim使用注意事项
- 中文编码的问题
- DOS与Linux的换行符
- 使用案例
- 语系编码转换
vim编辑器的使用介绍
Vim是Vi的改进版,也是Linux和Unix系统中常用的文本编辑器。相比于Vi,Vim增加了许多新的功能和改进的用户界面。它支持多级撤销、语法高亮、自动补全、多窗口支持等功能,使得用户可以更加高效地编辑文本。Vim同样是一个纯命令行界面的编辑器,需要一些学习和熟悉才能使用。和Vi一样,Vim也被广泛用于系统配置、编程、文本处理等方面。
vim的缓存、恢复与打开时的警告信息
目前主要的文本编辑软件都会有恢复的功能,当你的系统因为特殊原因宕机了,还可以通过特别的机制将你之前未保存的数据【救!】回来!,那么vim可以恢复吗?可以的
使用vim编辑器时,vim会在与编辑器的文件目录下,在建立一个名为【.filename.swp】的文件。
比如说你有个文件file.txt 当你在编辑这个文件时,vim会主动的建立【.file.txt.swp】的缓存,你对file.txt做的操作都会被记录到这个【.file.txt.swp】里。如果你系统宕机了,你可以通过这个文件来进行恢复。
首先我们先制造一个假的宕机然后进行恢复给你看
- 创建文件,进入vim然后按ctrl + z 暂停进程
[root@localhost ~]# cp -rf /etc/man_db.conf /root/csrfile.txt # 将文件复制过来
[root@localhost ~]# vim csrfile.txt # 在里面写几句话然后 ctrl + z 将vim暂停并放置到后台
[3]+ 已停止 vim csrfile.txt
- 查看缓存文件
[root@localhost ~]# ls -al
总用量 16
dr-xr-x---. 2 root root 65 4月 19 21:18 .
dr-xr-xr-x. 17 root root 224 4月 5 20:11 ..
-rw-r--r--. 1 root root 5184 4月 19 21:18 csrfile.txt
-rw-r--r--. 1 root root 4096 4月 19 21:18 .csrfile.txt.swp # 这就是缓存文件
- 我们将真在系统后台暂停的vim给kill掉,来模拟宕机情况。然后继续使用vim编辑csrfile.txt文件
[root@localhost ~]# vim csrfile.txt
E325: 注意
发现交换文件 ".csrfile.txt.swp"
所有者: root 日期: Wed Apr 19 21:18:19 2023
文件名: ~root/csrfile.txt
修改过: 是
用户名: root 主机名: localhost.localdomain
进程 ID: 103214
正在打开文件 "csrfile.txt"
日期: Wed Apr 19 21:18:14 2023
(1) Another program may be editing the same file. If this is the case,
be careful not to end up with two different instances of the same
file when making changes. Quit, or continue with caution.
(2) An edit session for this file crashed.
如果是这样,请用 ":recover" 或 "vim -r csrfile.txt"
恢复修改的内容 (请见 ":help recovery")。
如果你已经进行了恢复,请删除交换文件 ".csrfile.txt.swp"
以避免再看到此消息。
交换文件 ".csrfile.txt.swp" 已存在!
以只读方式打开([O]), 直接编辑((E)), 恢复((R)), 删除交换文件((D)), 退出((Q)), 中止((A)):
这是vim编辑器的一个提示信息,表示在打开文件时发现了交换文件(.swp文件),因此vim会主动判断你的这个文件可能会有些问题,上面的描述内容中给出了两种解决方法
问题一:可能有其他人或程序同时在编辑这个文件
由与多人多任务的环境下,因此很可能有很多人同时在编辑同一个文件。在很多人共同编辑的情况下,万一大家同时保存,那么这个文件就会很乱。为了避免这个问题vim会出现这个警告窗口,解决方法是:
- 找到另外的那个程序员,让他vim的工作结束,然后你再继续处理
- 如果你至少看该文件内容不会编辑任何底线,可以选择只读(O)
问题二:在前一个vim环境中,可能因为某些不知名的原因导致vim中断,解决方法很多,常见的方法有:
如果你之前vim处理操作尚未保存,此时你应该按下【R】,就是使用R的选项,此时vim会加载.csrfile.txt.swp的内容,让你来决定要不要保存,这样你就能够救回来之前未保存的信息。恢复后这个.csrfile.txt.swp文件并不会删除,需要自己手动删除。
- 如果你认为这个缓存是没有用的,那你可以直接按下【D】删除掉这个缓存。此时会加重csrfile.txt的内容,并将旧的.csrfile.txt.swp文件删除,建立这次会使用的新的.csrfile.txt.swp。
【O】:以只读方式打开文件
【E】:直接编辑文件
【R】:恢复修改的内容
【D】: 删除交换文件
【Q】:退出编辑器
【A】:中止当前操作
vim的额外功能
vim不仅具有缓存文件恢复的功能,vim还有具有颜色显示功能,并且还支持许多的程序语法,因此,当你使用vim编辑程序时(不论是C语言,还是shell脚本),我们的vim将可帮你直接进行【程序除错(debug)】的功能
如果你在命令行输入alias时,会出现这样的画面
[root@localhost ~]# alias
....
.....
alias vi='vim'
这表示当你使用vi这个命令时,其实使用的vim。
我们来看看vim的界面是怎么样的,假设我想要编辑【/etc/services】,则输入【vim /etc/services】
)
上面vim的界面示意图,在这个界面中有几点特色要说明:
- 由于/etc/service 是系统规划的配置文件,因此vim会进行语法检验,所以你会看到界面中内部主要为深蓝色,且深蓝色那一行是以注释符号【#】开头的
- 界面中最下面那一行,在左边显示该文件属性,包括只读文件、内容共有11176行670293个字符
- 最下面一行的右边出现的31,1表示光标所在的行
除了注释之外,其他的行就会有特别的颜色显示,可以避免打错字,最右下角%0代表目前你阅读到这一行占整体文件的0%,可见这里面写了非常多的信息。
可视化区块
刚刚我们提到简单的vi操作过程中,几乎提到的都是以行为单位的操作,那么如果我想要搞定的是一个区块(就是以列为单位)范围呢?例如以下文件:
192.168.1.1 host1.class.net
192.168.1.2 host2.class.net
192.168.1.3 host3.class.net
192.168.1.4 host4.class.net
..........
...
假设我想要将host1,host2等复制起来,并且加到每一行的后面,即每一行的结果要是【192.168.1.2 host2.class.net host2】这样的情况时,传统或现代的图形编辑器似乎不容易达到这个需求,但是咋们的vim办得到,那就可以使用可视化区块。当我们按下v或V或[Ctrl + v]时,这个时候光标移动过的地方就会开始泛白。这三个键分别的意义时
参数 | 介绍 |
---|---|
v | 字符选择,会将光标经过的地方泛白选择 |
V | 行选择,会将光标经过的行泛白选择 |
ctrl + v | 可视化区块,可以用矩形的方式选择数据 |
y | 将泛白的地方复制起来 |
d | 将泛白的地方删除掉 |
p | 将刚刚复制的区块,在光标所在处粘贴 |
我们来进行实际操作,就是将host再加到每一行的最后面。你可以这样做:
- 使用【vim csrhosts】来打开文件(可以自行准备一个测试文件)
- 将光标移动到第一行的host那个h上面,然后按下【ctrl + v】左下角出现可视块示意字样
- 将光标移动到最底部,此时光标移动过的区域会泛白
- 此时你可以按下【y】来进行复制,当按下【y】之后,泛白的区块就会消失不见。
- 最后,将光标移动到第一行最右边,按【i】进入编辑模式按下一个空格然后按下【ESC】按再下【p】后就会发现已经复制成功了
多文件编辑
假设我想要将刚刚我们的csrhosts文件内的IP复制到你的/etc/hosts 这个文件夹内,那么该如何编辑呢?我们知道再vi内可以使用【:r filename】来读取某个文件的内容,不过,这样毕竟是将整个文件读入。如果我向只读入部分内容呢?这时候我们的多文件编辑就很有用了,我们可以使用vim后面同时接好几个文件来同时打开,相关的按键有:
参数 | 解释 |
---|---|
:n | 编辑下一个文件 |
:N | 编辑上一个文件 |
:files | 列出目前这个vim开启的所有文件 |
做一下练习,假设你要将刚刚提供的【csrhosts】内的前四行 IP数据复制到你的【/etc/hosts】文件内,那可以怎么进行?
- 通过【vim hosts /etc/hosts】命令来使用一个vim打开两个文件
- 在vim中先使用【:files】查看一下编辑的文件数据有什么?如下图的最后一行显示的是【请按下ENTER或其他命令继续】就会回到vim的命令模式
- 在第一行输入【4yy】复制4行
- 在vim的环境下输入【:n】会来到第二个编辑的文件,就是/etc/hosts内
- 在/etc/hosts 按下【G】到最后一行,再输入【p】粘贴
-
按下多次的【u】来还原原本的数据
-
最终按下【:q】来退出vim的多文件编辑
利用多文件编辑功能,可以让你很快地就将需要的数据复制到正确的文件内,当然这个功能也可以利用窗口界面来达到
多窗口功能
想象一下这两个情况:
- 当我有一个文件非常大,我查到后面的数据时,想要对照前面的数据,是否需要使用 【ctrl + f】与【ctrl + b】(或PageUp,PageDown功能键)来跑前跑后查看?
- 我有两个需要对照着看的文件,不想使用前一小节提到的多文件编辑功能:
在一般窗口界面下的编辑软件大多有【划分窗口】或是【冻结窗口】的功能来将一个文件划分成多个窗口的展现,那么vim能不能达到这个功能呢?可以,但是如何划分窗口并放入文件?很简单,在命令行魔术输入【:sp{filename}】即可。这个filename可有可无,如果想要在新窗口启动另一个文件,之后输入【:sp】再次的打开这个文件一次,如何再输入【G】结果如下
万一你再输入【:sp /etc/hosts】时
看到了吗,两个文件同时再一个屏幕上显示,你还可以利用【ctrl + w + ↑】及【ctrl + w + ↓】在多个窗口之间移动。这样复制、查看就会变得很简单,划分窗口相关命令很多只介绍一下几种
参数 | 解释 |
---|---|
:sp [filename] | 打开一个新窗口,如果有加filename,表示在新窗口创建一个新文件,否则表示两个窗口为同一个文件内容(同步显示) |
ctrl + w + j | 按键的按法是:先按下ctrl不放,再按下w后放开所有的键,之后再按下j,则光标可移动到下方窗口 |
ctrl + w + ↓ | 按键的按法是:先按下ctrl不放,再按下w后放开所有的键,之后再按下向下的箭头,则光标可移动到下方窗口 |
ctrl + w + k | 同上,不过光标移动到上面的窗口 |
ctrl + w + ↑ | 同上,不过光标移动到上面的窗口 |
ctrl + w + q | 其实就是:q结束退出。举例来说,如果我想要结束下方的窗口,那么利用ctrl + w ↓ 移动到下方窗口后,输入:q即可退出,也可以按下ctrl + w + q 此外也可输入【:close】关闭所在的窗口 |
vim的关键词补全功能
我们知道bash的环境下面可以按下[tab]按键来完成命令、参数、文件名的补全,但是再vim里面按TAB就是很多个空格,那么有没有可以补全命令的按键呢?有的
主要的vim补齐功能
组合键 | 补全内容 |
---|---|
【ctrl + x】 => 【ctrl + n】 | 通过目前正在编辑的这个【文件的内容文字】作为关键字,给予补齐 |
【ctrl + x】=> 【ctrl + f】 | 以当前目录内的文件名作为关键词,给予补齐 |
【ctrl + x】=> 【ctrl + o】 | 以扩展名为语法补充,以vim内置的关键词,给予补齐 |
比较有用的是第一个和第三个组合键,第一个组合键中,你可能会再同一个文件里面重复出现许多相同的关键词,那么就能够通过这个来补全,如下图
如果你想要使用vim内置的语法检验功能来处理取得关键词补全,那么第三个选项就很有用。不过你要注意,如果你想要使用第三个功能,就得要注意你编辑的文件的扩展名,我们下面来做个简单测试。
假设我们要编写网页,忘记
后面跟什么参数了就可以使用第三个功能,可以列出很多相关的关键词让你选择。注意,一定要使用正确的扩展名,否则会无法出现任何关键词。
vim环境设置与记录:/.vimrc、/.viminfo
有没有发现,如果我们以vim软件来查找一个文件内部的某个字符时,这个字符串会泛白,而下次我们再次以vim编辑这个文件时,该查找的字符串泛白情况还是存在的。甚至于在编辑其他文件时,如果其他文件内也存在这个字符串,竟然还是会主动泛白,很神奇。另外,我们重复编辑同一个文件时,当第二次进入该文件时,光标竟然就在上次退出的那一行上面。为什么会这样呢?
这是因为我们的vim会主动地将你曾经做过的操作记录下来,好让你下次可以轻松作业
,这个记录操作文件就是:【~/.viminfo】
。如果你曾经使用过vim,那你的根目录应该会存在这个文件才对。这个文件是自动生产的,不用自行建立。在vim里所做过的操作,可以在这个文件内查询到。
此外,每个Linux发行版对vim的默认环境都不太相同,举例来说,某些版本在查到关键词时并不会高度泛白,有些版本则会主动帮你进行缩进的操作。但是这些都是可以设置的,那就是vim的环境设置,
整体vim的设置一般放置在【/etc/vimrc】这个文件中,不过不建议你修改它,你可以修改【~/.vimrc】这个文件(默认不存在,需要自行手动建立),将你所希望的设置值写入。
vim的环境设置参数
参数 | 解释 |
---|---|
:set nu(:set nonu) | 就是设置行号和取消行号(nonu) |
:set hlsearch(:set nohlsearch) | hlsearch就是high light search(高亮度查找) |
:set autoindent(:set noautoindent) | 是否自动缩进?autoindent就是自动缩进 |
:set backup | 是否自动保存备份文件?一般是nobackup的,如果设置backup的话,那么当你修改任何一个文件时,则源文件会被另存成一个文件名为filename~ 的文件。 |
:set ruler | 还记得我们提到右下角的一些状态栏说明?这个ruler就是在设置显示或不显示该设置值的 |
:set showmode | 这个则是,是否显示 --INSERT-- 这类的字眼在左下角的状态栏 |
:set backspace=(012) | 一般来说,如果我们按下【i】进入编辑模式后,可以利用退格键【Backspace】来删除任意字符。但是,某些Linux发行版则不许如此。此时,我们就可以通过backspace来设置,当backspace为2时,就是可以删除任意值;0或1时,仅可删除刚刚输入的字符,而无法删除原本就已经存在的文件 |
:set all | 显示目前所在的环境参数设置值 |
:set | 显示 系统默认值不同的设置参数,一般来说就是你有自行变动过的设置参数 |
:syntax on(:syntax off) | 是否依据程序相关语法显示不同颜色?举例来说,在编辑一个纯文本文件时,如果开头是以 # 开始,那么该行就会变成蓝色。 |
:set bg=dark(:set bg=light) | 可用以显示不同的颜色色调,默认是【light】,如果你常常发现注释的深蓝色字体很不容易看,那么这里可以设置为【dark】,试看看,会有不同的样式 |
可以这样设置【~/.vimrc】
[root@localhost ~]# vim ~/.vimrc
set bg=dark # 显示不同的底色色调(经实验好像至是把带颜色的字加粗了)
set nu # 显示行号
set hlsearch # 高亮泛白
set ruler # 可显示最后一行的状态
set backspace=2 # 可随时用退格键删除
syntax on # 进行语法检验
set autoindent # 自动缩进
在编写【~/.vimrc】这个文件时 我们也可以使用vim的关键词补全功能 我们上面没有介绍,可以使用【ctrl + x】=>【ctrl + v】 来补全vim命令非常好用,如下图
vim常用的命令示意图
其他vim使用注意事项
vim功能非常强大,下面我们还有一些要注意的事项
中文编码的问题
很多人经常会遇到它们的vim无法正常显示中文,这是为什么呢?其实很有可能是因为编码的问题。因为中文编码有【Big5、GBK、UTF-8】等几种,如果你的文件是使用GBK编码,但在vim的终端界面中你使用的是UTF-8,由于编码的不同,你的中文内容当然就是一堆乱码了,怎么办呢?这时你要考虑很多东西
- 你的Linux系统默认支持的语系数据:这与【/etc/locale.conf】有关
- 你的终端【bash】的语系:这与LANG、LC_ALL 这几个变量有关
- 你的文件原本的编码
- 打开终端的软件,例如在GNOME下面的窗口界面
事实上最重要的是上面的第三和第四点,只要这两点的编码一致,就能够正确的看到与编辑你的中文文件,否则就是一堆乱码
如何设置呢?
[root@localhost ~]# LANG=zh_CN.UTF-8
[root@localhost ~]# export LC_ALL=zh_CN.UTF-8
LANG 和 LC_ALL 是环境变量,用于设置 Linux 系统的本地化语言环境。
LANG 变量用于设置系统的默认语言环境,它影响所有的本地化工具和应用程序。比如,LANG=en_US.UTF-8 表示使用英语(美国)的 UTF-8 编码。
LC_ALL 变量用于覆盖 LANG 变量,它会强制设置所有本地化工具和应用程序的语言环境。比如,LC_ALL=zh_CN.UTF-8 表示强制使用中文(中国)的 UTF-8 编码。
DOS与Linux的换行符
DOS和Linux系统在换行符的使用上有所不同。
在DOS系统中,每行的结尾是由两个字符组成的,即“回车符”(CR)和“换行符”(LF)。这是由当初的打印机技术决定的,为了打印机能够回到行首并换行,需要发送两个字符。因此,DOS系统中的文本文件中每行结尾都是“CR+LF”。
在Linux系统中,每行的结尾只有一个“换行符”(LF)。这是因为在Unix时代,打印机只需要一个“换行符”就能回到行首并换行。因此,在Linux系统中,文本文件中每行结尾只有一个“LF”。
这种差异造成的结果是,如果在Windows系统中编写的文本文件打开到Linux系统中,每行结尾就会多出一个“CR”字符。而如果在Linux系统中编写的文本文件打开到Windows系统中,每行结尾就会少一个“CR”字符,导致文本格式混乱。
为了解决这个问题,一些编辑器和工具会自动处理文本文件的换行符,例如Notepad++、Sublime Text等编辑器会自动识别并转换换行符格式。此外,也可以使用一些特定的工具来进行换行符的转换,例如dos2unix和unix2dos等命令行工具。
dos2unix [-kn] file [newfile]
unix2dos [-kn] file [newfile]
选项:
-k:保留该文件原本的mtime 时间格式(不更新文件上次内容经过自定义的时间)
-n:保留原本的旧文件,将转换后的内容输出到新文件,如:dos2unix -n old new
使用案例
使用之前先确保自己安装了这两个命令
[root@localhost csr]# yum install -y unix2dos
将/etc/man_db.conf 重新复制到/tmp/csr/ 下面,并将其修改为dos换行
[root@localhost csr]# mkdir /tmp/csr/
[root@localhost csr]# cd /tmp/csr/
[root@localhost csr]# cp -a /etc/man_db.conf .
[root@localhost csr]# ll man_db.conf
-rw-r--r--. 1 root root 5171 4月 20 19:32 man_db.conf
[root@localhost csr]# unix2dos -k man_db.conf
unix2dos: converting file man_db.conf to DOS format ... # 显示这行信息,就表示换行转为DOS格式了
[root@localhost csr]# ll man_db.conf
-rw-r--r--. 1 root root 5302 4月 20 19:32 man_db.conf
# 因为换行符多了^M,所以容量增加了
将上述的man_db.conf 转成Linux换行符,并保留旧文件,新文件1防御 man_db.conf.linux
[root@localhost csr]# dos2unix -k -n man_db.conf man_db.conf.linux
dos2unix: converting file man_db.conf to file man_db.conf.linux in Unix format ...
[root@localhost csr]# ls
man_db.conf man_db.conf.linux
[root@localhost csr]# ll
总用量 16
-rw-r--r--. 1 root root 5302 4月 20 19:32 man_db.conf
-rw-r--r--. 1 root root 5171 4月 20 19:32 man_db.conf.linux
[root@localhost csr]# file man_db.conf*
man_db.conf: ASCII text, with CRLF line terminators # 很清楚说明的是CRLF换行
man_db.conf.linux: ASCII text
如果你在不同的系统之间复制一些纯文本文件时,千万记得要使用unix2dos或dos2unix来转换一下换行格式。
语系编码转换
在Linux中,语系编码转换是一个常见的操作,通常需要在不同的编码之间进行转换,以便在不同的环境中更好地显示和处理文本数据。以下是Linux语系编码转换的详细说明:
inconv --list
inconv -f 原本编码 -t 新编码 filename [-o newfile]
选项:
--list:列出iconv支持的语系数据
-f:from,就是来源的意思,后面接原本的编码格式
-t:to,就是后来的新编码是什么格式
-o file:如果要保留原本的文件,那么使用-o 新文件名,可以建立新编码文件
- 列出iconv支持的语系数据
inconv --list
- 转换语系编码
可以使用iconv命令来进行语系编码转换,例如:
iconv -f utf-8 -t gbk input.txt > output.txt
# 然后使用file 文件名检查语系编码是否转换了
上面的命令将UTF-8编码的input.txt文件转换为GBK编码的output.txt文件。
3. 批量转换文件编码
如果需要批量转换多个文件的编码,可以使用find命令和xargs命令来进行批量操作,例如:
find . -type f -name "*.txt" | xargs -I {} iconv -f utf-8 -t gbk {} -o {}.gbk
上面的命令将当前目录下所有扩展名为txt的文件从UTF-8编码转换为GBK编码,并将转换后的文件保存为原文件名加上.gbk后缀的文件。
换语系编码
可以使用iconv命令来进行语系编码转换,例如:
iconv -f utf-8 -t gbk input.txt > output.txt
# 然后使用file 文件名检查语系编码是否转换了
上面的命令将UTF-8编码的input.txt文件转换为GBK编码的output.txt文件。
3. 批量转换文件编码
如果需要批量转换多个文件的编码,可以使用find命令和xargs命令来进行批量操作,例如:
find . -type f -name "*.txt" | xargs -I {} iconv -f utf-8 -t gbk {} -o {}.gbk
上面的命令将当前目录下所有扩展名为txt的文件从UTF-8编码转换为GBK编码,并将转换后的文件保存为原文件名加上.gbk后缀的文件。