Linux系统中修改配置文件通过vi编辑器来实现,vi编辑器就相当于Windows系统中的WORD+记事本;vim是vi编辑器的增强版本,在vi编辑器的基础上扩展了很多实用的功能,但是习惯上也将vim称作vi。
vim格式:
vim file_name
如果指定的文件不存在,那么vim命令会创建文件并进入编辑状态,如果文件存在,则进入编辑状态对其进行编辑
一、vim编辑器的工作模式
在vi编辑界面中有三种不同的工作模式:命令模式、输入模式、末行模式
二、命令模式的操作
1、光标移动
命令模式下移动光标 |
h或向左方向键 | 光标向左移动一个字符 |
j或者向下方向键 | 光标向下移动一个字符 |
K或者向上方向键 | 光标向上移动一个字符 |
l或者向右方向键 | 光标向右移动一个字符 |
Ctrl + f 或者pageUP键 | 屏幕向前移动一页 |
Ctrl + b 或者pageDOWN键 | 屏幕向后移动一页 |
Ctrl + d | 屏幕向前移动半页 |
Ctrl + u | 屏幕向后移动半页 |
+ | 光标移动到非空格符的下一列 |
- | 光标移动到非空格符的上一列 |
n空格(n是数字) | 按下数字n然后按空格,则光标向右移动n个字符,如果该行字符数小于n,则光标继续从下行开始向右移动,一直到n |
0(数字0)或者Shift+6 | 移动到本行行首 |
Shift+4 | 即’$’移动到本行行尾 |
H | 光标移动到当前屏幕的最顶行 |
M | 光标移动到当前屏幕的中央那一行 |
L | 光标移动到当前屏幕的最底行 |
G | 光标移动到文本的最末行 |
nG(n是数字) | 移动到该文本的第n行 |
gg | 移动带该文本的首行 |
n回车(n是数字) | 光标向下移动n行 |
命令模式下删除、复制粘贴 |
x,X | x为向后删除一个字符,X为向前删除一个字符 |
nx(n为数字) | 向后删除n个字符 |
dd | 剪切光标所在的那一行 |
ndd(n为数字) | 删除光标所在的向下n行 |
d1G | 删除光标所在行到第一行的所有数据 |
dG | 删除光标所在行到末行的所有数据 |
yy | 复制光标所在的那行 |
nyy | 复制从光标所在行起向下n行 |
dG | 全部删除 |
ggyG | 全部复制 |
ggvG或者ggVG | 全选高亮显示 |
p,P | p 数据粘贴到光标的下一行,P则粘贴到光标的上一行 |
y1G | 复制光标所在行到第一行的所有数据 |
yG | 复制光标所在行到末行的所有数据 |
J | 讲光标所在行与下一行的数据结合成同一行 |
u | 还原过去的操作 |
进入输入模式 |
i | 在当前字符前插入字符 |
I | 在当前行行首插入字符 |
a | 在当前字符后插入字符 |
A | 在当前行行末插入字符 |
o | 在当前行下插入新的一行 |
O | 在当前行上插入新的一行 |
r | 替换光标所在的字符,只替换一次 |
R | 一直替换光标所在的字符,一直到按下ESC |
使用x或Del键可以删除光标处的单个字符,#x可以删除#个字符。使用dd命令可以删除当前光标所在行,使用d^可以删除当前光标之前到行首的所有字符,使用d$删除当前光标处到行尾的所有字符。#dd删除#行,如4dd表示删除光标所在行,以及光标下面的3行。使用yy可以复制当前行整行的内容到剪贴板,使用#yy可以复制从光标处开始的#行内容(其中#号用具体数字替换),按p键可将剪贴板中的内容粘贴到光标位置处之后。为了便于查看行间跳转效果,可以先进入末行模式执行“:set nu”命令显示行号,然后用“1G”或“gg”可以跳转到第1行,使用“G”可以跳转到最后一行,使用“3G”可以跳转到第3行,“5G”跳转到第5行等。按下“^”或数字“0”,可以将光标移动到所在行的行首。按下“$”或“End”键,可以将光标移动到所在行的行尾。按下“10→”,可以将光标向右移动10个字符;按下“10←”,可以将光标向左移动10个字符。
2、复制、粘贴、删除
3、撤销编辑
按u键可以撤销最近一次的操作,并恢复操作结果,按U键可以撤销对当前行所做的所有编辑。
三、末行模式操作
在命令模式下按“:”可以切换到末行模式,vi编辑器的最后一行将显示“:”提示符,用户可以在该提示符后输入特定的末行命令。
1、保存退出vim编辑器
:w | 将编辑过的文本保存 |
:w! | 若文本属性为只读时,强制保存 |
:q | 退出vim |
:q! | 不管编辑或未编辑都不保存退出 |
:wq | 保存,退出 |
:e! | 将文档还原成最原始状态 |
ZZ | 若文档没有改动,则不储存离开,若文档改动过,则储存后离开,等同于:wq |
:w [filename] | 编辑后的文档另存为filename |
:r [filename] | 在当前光标所在行的下面读入filename文档的内容 |
:set nu | 在每行的行首显示行号,永久显示在~./vimrc(/etc/vimrc )末尾直接添加set nu保存退出 |
:set nonu | 取消行号 |
n1,n2 w [filename] | 将n1到n2的内容另存为filename这个文档 |
:! command | 暂时离开vim运行某个linux命令,例如 :! ls /home 暂时列出/home目录下的文件,然后会提示按回车回到vim |
r!command .!command | r!command将执行后的结果插入到光标当前行的下一行 .!command将光标当前行内容替换成执行后的结果 |
n1,n2!command | 将n1-n2行内容指定给command进行处理,并替换n1-n2内容,例 :62,72 !sort,将62行到72行的内容进行排序 也可以以只指定起始行,例如:62 !tr [a-z] [A-Z],将62行的小写字母转为大写字母 也可以用.表示当前所在行,例如:. !tr [a-z] [A-Z],将当前行的小写转为大写 |
n1.n2w!command | 将n1-n2行的内容作为命令command的输入。不会改变当前编辑的文件的内 容 |
n,md | 删除n行到m行间的行 |
2、文件内容替换与查找
s表示替换,三根斜线中间是替换的样式,命令中的三根斜线分隔符可以换成别的符号,例如?
/word | 向光标之后寻找一个字符串名为word的字符串,当找到第一个word后,按”n”继续搜后一个 | ?word | 想光标之前寻找一个字符串名为word的字符串,当找到第一个word后,按”n”继续搜前一个 |
:1,$s/word1/word2/g | 从第一行到最末行,查找word1并替换成word2 | :1,$s/word1/word2/gc | 加上c的作用是,在替换前需要用户确认 |
2、删除空行
在命令状态下输入::g/^\s*$/d
:g 代表在全文档范围内
^代表行的开始
\s*代表空白字符
&代表行的结束
d代表删除用
//将3段代码隔开
vi和vim显示中文乱码
在 Vim 中,有四个与编码有关的选项,它们是:fileencodings、fileencoding、encoding 和 termencoding。在实际使用中,任何一个选项出现错误,都会导致出现乱码。
encoding 是 Vim 内部使用的字符编码方式。当我们设置了 encoding 之后,Vim 内部所有的 buffer、寄存器、脚本中的字符串等,全都使用这个编码。Vim 在工作的时候,如果编码方式与它的内部编码不一致,它会先把编码转换成内部编码。如果工作用的编码中含有无法转换为内部编码的字符,在这些字符就会丢失。因此,在选择 Vim 的内部编码的时候,一定要使用一种表现能力足够强的编码,以免影响正常工作。
由于 encoding 选项涉及到 Vim 中所有字符的内部表示,因此只能在 Vim 启动的时候设置一次。在 Vim 工作过程中修改encoding 会造成非常多的问题。如果没有特别的理由,请始终将 encoding 设置为 utf-8。
termencoding 是 Vim 用于屏幕显示的编码,在显示的时候,Vim 会把内部编码转换为屏幕编码,再用于输出。内部编码中含有无法转换为屏幕编码的字符时,该字符会变成问号,但不会影响对它的编辑操作。如果 termencoding 没有设置,则直接使用encoding 不进行转换。
举个例子,当你在 Windows 下通过 telnet 登录 Linux 工作站时,由于 Windows 的 telnet 是 GBK 编码的,而 Linux 下使用 UTF-8 编码,你在 telnet 下的 Vim 中就会乱码。此时有两种消除乱码的方式:一是把 Vim 的 encoding 改为 gbk,另一种方法是保持 encoding 为 utf-8,把 termencoding 改为 gbk,让 Vim 在显示的时候转码。显然,使用前一种方法时,如果遇到编辑的文件中含有 GBK 无法表示的字符时,这些字符就会丢失。但如果使用后一种方法,虽然由于终端所限,这些字符无法显示,但在编辑过程中这些字符是不会丢失的。
对于图形界面下的 GVim,它的显示不依赖 TERM,因此 termencoding 对于它没有意义。在 GTK2 下的 GVim 中,termencoding 永远是 utf-8,并且不能修改。而 Windows 下的 GVim 则忽略 termencoding 的存在。
fileencoding 当 Vim 从磁盘上读取文件的时候,会对文件的编码进行探测。如果文件的编码方式和 Vim 的内部编码方式不同,Vim 就会对编码进行转换。转换完毕后,Vim 会将 fileencoding 选项设置为文件的编码。当 Vim 存盘的时候,如果 encoding 和fileencoding 不一样,Vim 就会进行编码转换。因此,通过打开文件后设置 fileencoding,我们可以将文件由一种编码转换为另一种编码。但是,由前面的介绍可以看出,fileencoding 是在打开文件的时候,由 Vim 进行探测后自动设置的。因此,如果出现乱码,我们无法通过在打开文件后重新设置 fileencoding 来纠正乱码。
fileencodings 编码的自动识别是通过设置 fileencodings 实现的,注意是复数形式。fileencodings 是一个用逗号分隔的列表,列表中的每一项是一种编码的名称。当我们打开文件的时候,VIM 按顺序使用 fileencodings 中的编码进行尝试解码,如果成功的话,就使用该编码方式进行解码,并将 fileencoding 设置为这个值,如果失败的话,就继续试验下一个编码。
因此,我们在设置 fileencodings 的时候,一定要把要求严格的、当文件不是这个编码的时候更容易出现解码失败的编码方式放在前面,把宽松的编码方式放在后面。
例如,latin1 是一种非常宽松的编码方式,任何一种编码方式得到的文本,用 latin1 进行解码,都不会发生解码失败——当然,解码得到的结果自然也就是理所当然的“乱码”。因此,如果你把 latin1 放到了 fileencodings 的第一位的话,打开任何中文文件都是乱码也就是理所当然的了。
在/etc/vimrc 和/etc/virc文末添加
set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1
set termencoding=utf-8
set fileencoding=utf-8
set encoding=utf-8
ucs-bom 是一种非常严格的编码,非该编码的文件几乎没有可能被误判为 ucs-bom,因此放在第一位。
utf-8 也相当严格,除了很短的文件外(例如许多人津津乐道的 GBK 编码的“联通”被误判为 UTF-8 编码的经典错误),现实生活中一般文件是几乎不可能被误判的,因此放在第二位。
cp936 和 gb18030,这两种编码相对宽松,如果放前面的话,会出现大量误判,所以就让它们靠后一些。cp936 的编码空间比 gb18030 小,所以把 cp936 放在 gb18030 前面。
big5、euc-jp 和 euc-kr,它们的严格程度和 cp936 差不多,把它们放在后面,在编辑这些编码的文件的时候必然出现大量误判,但这是 Vim 内置编码探测机制没有办法解决的事。由于中国用户很少有机会编辑这些编码的文件,因此我们还是决定把 cp936 和 gb18030 前提以保证这些编码的识别。
latin1它是一种极其宽松的编码,以至于我们不得不把它放在最后一位。不过可惜的是,当你碰到一个真的 latin1 编码的文件时,绝大部分情况下,它没有机会 fall-back 到 latin1,往往在前面的编码中就被误判了。不过,正如前面所说的,中国用户没有太多机会接触这样的文件。
如果编码被误判了,解码后的结果就无法被人类识别,于是我们就说,这个文件乱码了。此时,如果你知道这个文件的正确编码的话,可以在打开文件的时候使用 ++enc=encoding 的方式来打开文件,如:
:e ++enc=utf-8 myfile.txt
查看当前系统语言
看安装的语言包
[root@localhost ~]# locale 如有zh cn 表示已经安装了中文语言 LANG=en_US.UTF-8 LC_CTYPE="en_US.UTF-8" LC_NUMERIC="en_US.UTF-8" LC_TIME="en_US.UTF-8" LC_COLLATE="en_US.UTF-8" LC_MONETARY="en_US.UTF-8" LC_MESSAGES="en_US.UTF-8" LC_PAPER="en_US.UTF-8" LC_NAME="en_US.UTF-8" LC_ADDRESS="en_US.UTF-8" LC_TELEPHONE="en_US.UTF-8" LC_MEASUREMENT="en_US.UTF-8" LC_IDENTIFICATION="en_US.UTF-8" LC_ALL= [root@Super ~]# locale -a|grep -i "cn" [root@localhost ~]# yum grouplist|grep -i chinese Chinese Support [zh] [root@localhost ~]# yum -y groupinstall "Chinese Support" [root@localhost ~]#
如何修改系统语言为中文
1 临时更换语言
2 永久更换语言
centos6:/etc/syconfig/i18n
centos7: /etc/locale.conf
[root@localhost python]# vim /etc/virc #vim /etc/vimrc set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1 set termencoding=utf-8 set fileencoding=utf-8 set encoding=utf-8 [root@localhost python]# source /etc/virc #source /etc/vimrc
重新连接即可正常显示中文,如果按照以上方法设置修改设置中文语言还是不行的话,注意您的链接终端选择的编码。如xshell为例,把终端的编码选择中文,或者UTF8即可