在所有的 Linux distributions 上头都会有的一套文书编辑器就 是 vi ,而且很多软件默认也是使用 vi 做为他们编辑的接口, 因此鸟哥建议您务必要学会使用 vi 这个正规的文书编辑器。
此外,vim 是进阶版的 vi , vim 不但可以用不同颜色显示文字内 容,还能够进行诸如 shell script, C program 等程序编辑功能, 你可以将 vim 视为一种程序编 辑器
9.1 vi 与 vim
9.1.1 为何要学 vim
-
所有的 Unix Like 系统都会内置 vi 文书编辑器,其他的文书编辑器则不一定会存在;
-
很多个别软件的编辑接口都会主动调用 vi (例如未来会谈到的 crontab, visudo, edquota 等指令);
-
vim 具有程序编辑的能力,可以主动的以字体颜色辨别语法的正确性,方便程序设计;
-
因为程序简单,编辑速度相当快速。
可以将 vim 视作 vi 的进阶版本,vim 可以用颜色或底线等方式来 显示一些特殊的信息。
vim 会依据文件的扩展名或者是文件内的开头信息, 判断该文件的内容而自动的调用该程序的语法判断式,再以颜色来显示程序码与一般信息
简单的来说, vi 是老式的文书处理器,不过功能已经很齐全了,但是还是有可以进步的地 方。 vim 则可以说是程序开发者的一项很好用的工具,就连 vim 的官方网站 (http://www.vim.org) 自己也说 vim 是一个“程序开发工具”而不是文书处理软件
9.2 vi 的使用
vi 共分为三种模式,分别是“一般指令模式”、“编辑模式”与“命令行命令模式”
模式 | 描述 |
---|---|
一般指令模式 (command mode) | 以 vi 打开一个文件就直接进入一般指令模式了(这是默认的模式,也简称为一般模式)。在 这个模式中, 你可以使用“上下左右”按键来移动光标,你可以使用“删除字符”或“删除整列”来 处理文件内容, 也可以使用“复制、贴上”来处理你的文件数据。 |
编辑模式 (insert mode) | 在一般指令模式中可以进行删除、复制、贴上等等的动作,但是却无法编辑文件内容的! 要 等到你按下“i, I, o, O, a, A, r, R”等任何一个字母之后才会进入编辑模式。注意了!通常在 Linux 中,按下这些按键时,在画面的左下方会出现“ INSERT 或 REPLACE ”的字样,此时才 可以进行编辑。而如果要回到一般指令模式时, 则必须要按下“Esc”这个按键即可退出编辑模 式。 |
命令行命令模式 (command-line mode) | 在一般模式当中,输入“ : / ? ”三个中的任何一个按钮,就可以将光标移动到最下面那一列。在 这个模式当中, 可以提供你“搜寻数据”的动作,而读取、存盘、大量取代字符、离开 vi 、显 示行号等等的动作则是在此模式中达成的! |
编辑模式与 命令行界面之间不可互相切换
9.2.1 简易执行范例
1. 使用“ vi filename ”进入一般指令模式
/bin/vi welcome.txt
# 在 CentOS 7 当中,由于一般帐号默认 vi 已经被 vim 取代了,因此得要输入绝对路径来执行才行!
root 账号和其他账号使用 type vi
可以看到不同
root 账号 vi 没有被 vim 取代
vi 后面一定要加文件名,不管该文件名存在与否
整个画面主要分为两部份,上半部与最下面一列两者可以视为独立的
图 中那个虚线是不存在的, 鸟哥用来说明而已啦!上半部显示的是文件的实际内容,最下面一 列则是状态显示列(如下图的[New File]信息),或者是命令下达列
如果你打开的文件是旧文件(已经存在的文件),则可能会出现
"/etc/man_db.conf" [readonly] 131L, 5171C
目前文件为只读状态,且文 件内有 131 列 以及具有 5171 个字符
2. 按下 i 进入编辑模式,开始编辑文字
在一般指令模式之中,只要按下 i, o, a 等字符就可以进入编辑模式了!在编辑模式当中,你 可以发现在左下角状态列中会出现 -- INSERT --
的字样
这个时候,键盘上除了 [Esc] 这个按键之外,其他的按键都可以视作为一般的输入按钮
3. 按下 [ESC] 按钮回到一般指令模式
按下 [Esc] 这个按钮即可!马上你就会发现画面左下角的 -- INSERT --
不见了
4. 进入命令行界面,文件储存并离开 vi 环境
存盘 (write) 并离开 (quit) 的指令很简单,输入“:wq”即可存盘离 开
9.2.2 按键说明
第一部份:一般指令模式可用的按钮说明,光标移动、复制贴上、搜寻取代等
移动光标的方法
指令 | 描述 |
---|---|
h | 或 向左方向键(←) 光标向左移动一个字符 |
j | 或 向下方向键(↓) 光标向下移动一个字符 |
k | 或 向上方向键(↑) 光标向上移动一个字符 |
l | 或 向右方向键(→) 光标向右移动一个字符 |
如果想要进行 多次移动的话,例如向下移动 30 列, 可以使用 “30j” 或 “30↓” 的组合按键, 亦即加上想要进行的次数(数字)后, 按下动作即可!
指令 | 描述 |
---|---|
[Ctrl] + [f] | 屏幕“向下”移动一页,相当于 [Page Down]按 键 (常用) |
[Ctrl] + [b] | 屏幕“向上”移动一页,相当于 [Page Up] 按键 (常用) |
[Ctrl] + [d] | 屏幕“向下”移动半页 |
[Ctrl] + [u] | 屏幕“向上”移动半页 |
+ | 光标移动到非空白字符的下一行 |
– | 光标移动到非空白字符的上一行 |
n |
那个 n 表示“数字”,例如 20 。按下数字后再 按空白键,光标会向右移动这一行的 n 个字 符。例如 20 则光标会向后面移动 20 个字符距离。 |
0 | 或功能键[Home] 这是数字“ 0 ”:移动到这一行的最前面字符处 (常用) |
$ | 或功能键[End] 移动到这一行的最后面字符处(常用) |
H | 光标移动到这个屏幕的最上方那一行的第一 个字符 |
M | 光标移动到这个屏幕的中央那一行的第一个 字符 |
L | 光标移动到这个屏幕的最下方那一行的第一 个字符 |
G | 移动到这个文件的最后一行(常用) |
nG | n 为数字。移动到这个文件的第 n 行。例如 20G 则会移动到这个文件的第 20 行(可配合 :set nu) |
gg | 移动到这个文件的第一行,相当于 1G 啊! (常用) |
n |
n 为数字。光标向下移动 n 行(常用) |
搜寻与取代
指令 | 描述 |
---|---|
/word | 向光标之下寻找一个名称为 word 的字串。例 如要在文件内搜寻 vbird 这个字串,就输入 /vbird 即可! (常用) |
?word | 向光标之上寻找一个字串名称为 word 的字 串。 |
n | 这个 n 是英文按键。代表“重复前一个搜 寻的动作”。举例来说, 如果刚刚我们执 行 /vbird 去向下搜寻 vbird 这个字串,则按下 n 后,会向下继续搜寻下一个名称为 vbird 的 字串。如果是执行 ?vbird 的话,那么按下 n 则会向上继续搜寻名称为 |
N | 这个 N 是英文按键。与 n 刚好相反,为“反 向”进行前一个搜寻动作。 例如 /vbird 后,按 下 N 则表示“向上”搜寻 vbird 。 |
使用 /word 配合 n 及 N 是非常有帮助 的!可以让你重复的找到一些你搜寻的 关键字!
指令 | 描述 |
---|---|
:n1,n2s/word1/word2/g | n1 与 n2 为数字。在第 n1 与 n2 行之间寻找 word1 这个字串,并将该字串取代为 word2 !举例来说,在 100 到 200 行之间搜寻 vbird 并取代为 VBIRD 则:“:100,200s/vbird/VBIRD/g”。(常用) |
:1,$s/word1/word2/g | 从第一行到最后一行寻找 word1 字串,并将 该字串取代为 word2 !(常用) |
:1,$s/word1/word2/gc | 从第一行到最后一行寻找 word1 字串,并将 该字串取代为 word2 !且在取代前显示提示 字符给使用者确认 (confirm) 是否需要取 代!(常用) |
删除、复制与粘贴
指令 | 描述 |
---|---|
x, X | 在一行字当中,x 为向后删除一个字符 (相 当于 [del] 按键), X 为向前删除一个字符 (相当于 [backspace] 亦即是倒退键) (常 用) |
nx n | 为数字,连续向后删除 n 个字符。举例来 说,我要连续删除 10 个字符, “10x”。 |
dd | 删除光标所在的那一整行(常用) |
ndd | n 为数字。删除光标所在的向下 n 行,例如 20dd 则是删除 20 行 (常用) |
d1G | 删除光标所在到第一行的所有数据 |
dG | 删除光标所在到最后一行的所有数据 |
d$ | 删除光标所在处,到该行的最后一个字符 |
d0 | 那个是数字的 0 ,删除光标所在处,到该行 的最前面一个字符 |
yy | 复制光标所在的那一行(常用) |
nyy | n 为数字。复制光标所在的向下 n 行,例如 20yy 则是复制 20 行(常用) |
y1G | 复制光标所在行到第一行的所有数据 |
yG | 复制光标所在行到最后一行的所有数据 |
y0 | 复制光标所在的那个字符到该行行首的所有 数据 |
y$ | 复制光标所在的那个字符到该行行尾的所有 数据 p, |
P p | 为将已复制的数据在光标下一行贴上,P 则 为贴在光标上一行! 举例来说,我目前光标 在第 20 行,且已经复制了 10 行数据。则按 下 p 后, 那 10 行数据会贴在原本的 20 行之 后,亦即由 21 行开始贴。但如果是按下 P 呢? 那么原本的第 20 行会被推到变成 30 行。 (常用) |
J | 将光标所在行与下一行的数据结合成同一行 |
c | 重复删除多个数据,例如向下删除 10 行,[ 10cj ] |
u | 复原前一个动作。(常用) |
[Ctrl]+r | 重做上一个动作。(常用) |
. | 不要怀疑!这就是小数点!意思是重复前一 个动作的意思。 如果你想要重复删除、重复 贴上等等动作,按下小数点“.”就好了! (常 用) |
u 与 [Ctrl]+r 是很常用的指令!一 个是复原,另一个则是重做一次
第二部份:一般指令模式切换到编辑模式的可用的按钮说明
进入插入或取代的编辑模式
指令 | 描述 |
---|---|
i, I | 进入插入模式(Insert mode):i 为“从目前光标所在处插入”, I 为“在目前所在行的第一个非空白 字符处开始插入”。 (常用) |
a, A | 进入插入模式(Insert mode):a 为“从目前光标所在的下一个字符 处开始插入”, A 为“从光标所在行 的最后一个字符处开始插入”。 (常用) |
o, O | 进入插入模式(Insert mode): 这是英文字母 o 的大小写。o 为“在目前光标所在的下一行处插 入新的一行”; O 为在目前光标所 在处的上一行插入新的一行!(常 用) |
r, R | 进入取代模式(Replace mode):r 只会取代光标所在的 那一个字符一次;R会一直取代光 标所在的文字,直到按下 ESC 为 止;(常用) |
[Esc] | 退出编辑模式,回到一般指令模式 中(常用) |
上面这些按键中,在 vi 画面的左下角处会出现“– INSERT–”或“–REPLACE–”的字样。 由名称就知道 该动作了吧!!特别注意的是,我们上面也提过 了,你想要在文件里面输入字符时, 一定要在左下 角处看到 INSERT 或 REPLACE 才能输入喔!
第三部份:一般指令模式切换到命令行界面的可用按钮说明
命令行界面的储存、离开等 指令
惊叹号 (!) 在 vi 当中,常常具 有“强制”的意思
指令 | 描述 |
---|---|
:w | 将编辑的数据写入硬盘文件中(常用) |
:w! | 若文件属性为“只读”时,强制写入该文件。不过,到底能 不能写入, 还是跟你对该文件的文件权限有关啊! |
:q | 离开 vi (常用) |
:q! | 若曾修改过文件,又不想储存,使用 ! 为强制离开不储存 盘案。 |
:wq | 储存后离开,若为 :wq! 则为强制储存后离开 (常用) |
ZZ | 这是大写的 Z 喔!若文件没有更动,则不储存离开,若 文件已经被更动过,则储存后离开! |
:w [filename] | 将编辑的数据储存成另一个文件(类似另存新文件) |
:r [filename] | 在编辑的数据中,读入另一个文件的数据。亦即将 “filename” 这个文件内容加到光标所在行后面 |
:n1,n2 w [filename] | 将 n1 到 n2 的内容储存成 filename 这个文件。 |
:! command | 暂时离开 vi 到命令行界面下执行 command 的显示结 果!例如 “:! ls /home”即可在 vi 当中察看 /home 下面以 ls 输出的文件信息! |
vim 环境的变更
指令 | 描述 |
---|---|
:set nu | 显示行号,设置之后,会在每一行的字首显示该行的行 号 |
:set nonu | 与 set nu 相反,为取消行号! |
9.2.4 vim 的暂存盘、救援回复与打开时的警告讯息
vim 就是通过“暂存盘”来救援
当我们在使用 vim 编辑时, vim 会在与被编辑的文件的目录下,再创建一个名为 .filename.swp 的文件
在 vim 的一般指令模式下按下 [ctrl]-z 的组合按键时,你的 vim 会被丢到后台去执行
由于暂存盘存在的关系,因此 vim 会主动的判断你的这个文件可能有些问题,vim 提示两点主要的问题与解决方案
-
问题一:可能有其他人或程序同时在编辑这个文件
-
问题二:在前一个 vim 的环境中,可能因为某些不知名原因导致 vim 中断 (crashed)
至于这个发现暂存盘警告讯息的画面中,有出现六个可用按钮,各按钮的说明如下:
-
[O]pen Read-Only
-
(E)dit anyway
-
(R)ecover
-
(D)elete it
- 测试的时候发现没有这个选项,可能是因为版本不同的关系
-
(Q)uit
-
(A)bort
9.3 vim 的额外功能
目前大部分的 distributions 都以 vim 取代 vi 的功能了!如果你使用 vi 后,却看到画面 的右下角有显示目前光标所在的行列号码,那么你的 vi 已经被 vim 所取代
# 查看命令别名
alias
9.3.1 区块选择(Visual Block)
多列编辑模式
指令 | 描述 |
---|---|
v | 字符选择,会将光标经过的地方反白选择! |
V | 列选择,会将光标经过的列反白选择! [Ctrl]+v 区块选择,可以用长方形的方式选择数据 |
y | 将反白的地方复制起来 |
d | 将反白的地方删除掉 |
p | 将刚刚复制的区块,在光标所在处贴上! |
9.3.2 多文件编辑
指令 | 描述 |
---|---|
:n | 编辑下一个文件 |
:N | 编辑上一个文件 |
:files | 列出目前这个 vim 的打开的所有文件 |
通过“ vim hosts /etc/hosts ”指令来使用一个 vim 打开两个文件
9.3.3 多窗口功能
指令 | 描述 |
---|---|
:sp [filename] | 打开一个新窗口,如果有加 filename, 表示在新窗口打开一个新文件,否 则表示两个窗口为同一个文件内容(同步显示)。 |
[ctrl]+w+ j [ctrl]+w+↓ | 按键的按法是:先按下 [ctrl] 不放, 再按下 w 后放开所有的按键,然后再按 下 j (或向下方向键),则光标可移动到下方的窗口。 |
[ctrl]+w+ k [ctrl]+w+↑ | 同上,不过光标移动到上面的窗口。 |
[ctrl]+w+ q | 其实就是 :q 结束离开啦! 举例来说,如果我想要结束下方的窗口,那么利 用 [ctrl]+w+↓ 移动到下方窗口后,按下 :q 即可离开, 也可以按下 [ctrl]+w+q 啊! |
9.3.4 vim 的挑字补全功能
指令 | 描述 |
---|---|
[ctrl]+x -> [ctrl]+n | 通过目前正在编辑的这个“文件的内容文字”作为关键字,予以补齐 |
[ctrl]+x -> [ctrl]+f | 以当前目录内的“文件名”作为关键字,予以补齐 |
[ctrl]+x -> [ctrl]+o | 以扩展名作为语法补充,以 vim 内置的关键字,予以补齐 |
9.3.5 vim 环境设置与记录: ~/.vimrc, ~/.viminfo
vim 会主动的将你曾经做过的行为登录下来,好让你下次可以轻松的作业 啊! 那个记录动作的文件就是: ~/.viminfo
vim 的环境设置参数有很多,如果你想要知道目前的设 置值,可以在一般指令模式时输入“ :set all ” 来查阅
环境设置参数 | 描述 |
---|---|
:set nu :set nonu | 就是设置与取消行号啊! |
:set hlsearch :set nohlsearch hlsearch | 就是 high light search(高亮度搜寻)。 这个就是设置 是否将搜寻的字串反白的设置值。默认值是 hlsearch |
:set autoindent :set noautoindent | 是否自动缩排?autoindent 就是自动缩排。 |
:set backup | 是否自动储存备份文件?一般是 nobackup 的, 如果设置 backup 的话,那么当你更动任何一个文件时,则原始文件会被另 存成一个文件名为 filename~ 的文件。 举例来说,我们编辑 hosts ,设置 :set backup ,那么当更动 hosts 时,在同目录下, 就会产生 hosts~ 文件名的文件,记录原始的 hosts 文件内容 |
:set ruler | 还记得我们提到的右下角的一些状态列说明吗? 这个 ruler 就是 在显示或不显示该设置值的啦! |
:set showmode | 这个则是,是否要显示 –INSERT– 之类的字眼在左下角的状态 列。 |
:set backspace=(012) | 一般来说, 如果我们按下 i 进入编辑模式后,可以利用倒退键 (backspace) 来删除任意字符的。 但是,某些 distribution 则 不许如此。此时,我们就可以通过 backspace 来设置啰~ 当 backspace 为 2 时,就是可以删除任意值;0 或 1 时,仅可删除 刚刚输入的字符, 而无法删除原本就已经存在的文字了! |
:set all | 显示目前所有的环境参数设置值。 |
:set | 显示与系统默认值不同的设置参数, 一般来说就是你有自行变动 过的设置参数啦! :syntax on :syntax off 是否依据程序相关语法显示不同颜色? 举例来说,在编辑一个纯 文本文件时,如果开头是以 # 开始,那么该列就会变成蓝色。 如 果你懂得写程序,那么这个 :syntax on 还会主动的帮你除错呢! 但是, 如果你仅是编写纯文本,要避免颜色对你的屏幕产生的干 扰,则可以取消这个设置 。 |
:set bg=dark :set bg=light | 可用以显示不同的颜色色调,默认是“ light ”。如果你常常发现注 解的字体深蓝色实在很不容易看, 那么这里可以设置为 dark 喔!试看看,会有不同的样式呢! |
整体 vim 的设置值一般是放置在 /etc/vimrc 这个文件,不过,不建议你修改他! 你 可以修改 ~/.vimrc 这个文件 (默认不存在,请你自行手动创建!)
在这个文件中,使用“ set hlsearch ”或“ :set hlsearch ”,亦即最前面有没有冒号“ : ”效果都是 一样的! 至于双引号则是注解符号!
9.3.6 vim 常用指令示意图
9.4 其他 vim 使用注意事项
9.4.1 中文编码的问题
-
你的 Linux 系统默认支持的语系数据:这与 /etc/locale.conf 有关;
-
你的终端接口 (bash) 的语系: 这与 LANG, LC_ALL 这几个变量有关;
-
你的文件原本的编码;
-
打开终端机的软件,例如在 GNOME 下面的窗口接口。
9.4.2 DOS 与 Linux 的断行字符
DOS(Windows) 与 Linux 断行字符不同
DOS 使用的断行字符为 ^M$
,我们称为 CR 与 LF 两个符号。 而在 Linux 下面,则是仅有 LF ($) 这个断行符号
可能造成“程序无法执行”的状 态
dos2unix [-kn] file [newfile]
unix2dos [-kn] file [newfile]
选项与参数:
-k :保留该文件原本的 mtime 时间格式 (不更新文件上次内容经过修订的时间)
-n :保留原本的旧文件,将转换后的内容输出到新文件,如: dos2unix -n old new
不建议你在 Windows 系统当中将文件编辑好之后,才上传到 Linux 系统,会容易发生错误问题
9.4.3 语系编码转换
举例来说,想要将 big5 编码转成 utf8
iconv --list
iconv -f 原本编码 -t 新编码 filename [-o newfile]
选项与参数:
--list :列出 iconv 支持的语系数据
-f :from ,亦即来源之意,后接原本的编码格式;
-t :to ,亦即后来的新编码要是什么格式;
-o file:如果要保留原本的文件,那么使用 -o 新文件名,可以创建新编码文件。
# 范例一:将 /tmp/vitest/vi.big5 转成 utf8 编码
iconv -f big5 -t utf8 vi.big5 -o vi.utf8
# 范例二:将繁体中文的 utf8 转成简体中文的 utf8 编码
iconv -f utf8 -t big5 vi.utf8 | iconv -f big5 -t gb2312 | iconv -f gb2312 -t utf8 -o vi.gb.utf8
原文地址:http://www.cnblogs.com/huangwenjie/p/16870669.html