鸟哥的Linux私房菜 总结索引 | 第九章:vim 程序编辑器

命令行的文书编辑器。 在所有的 Linux distributions 上头都会有的一套文书编辑器就是 vi ,而且很多软件默认也是使用 vi 做为他们编辑的接口。此外,vim 是进阶版的 vi,可以将 vim 视为一种程序编辑器

1、vi 与 vim

绝大部分的配置文件 都是以 ASCII 的纯文本形态存在,因此 利用简单的文字编辑软件就能够修改设置

所有的 Unix Like 系统都会内置 vi 文书编辑器,其他的文书编辑器 则不一定会存在;
很多个别软件的编辑接口 都会主动调用 vi (例如未来会谈到的 crontab, visudo, edquota 等指令);
vim 具有程序编辑的能力,可以主动的以字体颜色辨别语法的正确性,方便程序设计

2、vi 的使用

vi 共分为三种模式,分别是 “一般指令模式”、“编辑模式” 与 “命令行命令模式”

1、一般指令模式 (command mode)
以 vi 打开一个文件 就直接进入一般指令模式了(这是默认的模式,也简称为 一般模式)。在这个模式中, 可以使用“上下左右”按键 来移动光标,你可以使用 “删除字符” 或 “删除整列” 来处理文件内容, 也可以使用 “复制、贴上” 来处理你的文件数据

2、编辑模式 (insert mode)
在一般指令模式中 可以进行 删除、复制、贴上 等等的动作,但是却无法编辑文件内容的。要等到 按下 “i, I, o, O, a, A, r, R” 等任何一个字母之后 才会进入编辑模式。通常在 Linux 中,按下这些按键时,在画面的左下方会出现 “ INSERT 或 REPLACE ” 的字样,此时才可以进行编辑。而如果要回到一般指令模式时, 则必须要按下 “Esc” 这个按键即可退出编辑模式

3、命令行命令模式
在一般模式当中,输入“ : / ? ”三个中的任何一个按钮,就可以 将光标移动到最下面那一列。在这个模式当中, 可以提供 “搜寻数据” 的动作,读取、存盘、大量取代字符、离开 vi 、显示行号等等的动作 则是在此模式中达成的

在这里插入图片描述
一般指令模式可与编辑模式及命令行界面切换, 但 编辑模式 与 命令行界面 之间不可互相切换

2.1 简易执行范例

想要使用 vi 来创建一个名为 welcome.txt 的文件时,使用“ vi filename ”进入一般指令模式

/bin/vi welcome.txt

按下 i 进入编辑模式,开始编辑文字(在一般指令模式之中,只要按下 i, o, a 等字符 就可以进入编辑模式),键盘上除了 [Esc] 这个按键之外,其他的按键 都可以视作为 一般的输入按钮了

按下 [ESC] 按钮回到一般指令模式

进入命令行界面,文件储存并离开 vi 环境(存盘 (write) 并离开 (quit) 的指令很简单,输入“:wq” 即可存盘离开)

2.2 按键说明

1、一般指令模式
可用的按钮说明,光标移动、复制贴上、搜寻取代等

移动光标的方法
h 或 向左方向键(←)光标向左移动一个字符
j 或 向下方向键(↓)光标向下移动一个字符
k 或 向上方向键(↑)光标向上移动一个字符
l 或 向右方向键(→)光标向右移动一个字符

hjkl 是排列在一起的,因此 可以使用这四个按钮来移动光标。 如果 想要进行多次移动的话,例如向下移动 30 列,可以使用 “30j” 或 “30↓” 的组合按键, 亦即加上想要进行的次数(数字)后,按下动作即可

移动光标的方法
[Ctrl] + [f]屏幕“向下”移动一页,相当于 [Page Down]按键
[Ctrl] + [b]屏幕“向上”移动一页,相当于 [Page Up] 按键
[Ctrl] + [d]屏幕“向下”移动半页
[Ctrl] + [u]屏幕“向上”移动半页
+光标移动到非空白字符的下一行
-光标移动到非空白字符的上一行
n<space>n 表示“数字”,例如 20 。按下数字后 再按空白键,光标会向右移动这一行的 n 个字符。例如 20<space> 则光标会向后面移动 20 个字符距离
0 或功能键[Home]这是数字“ 0 ”:移动到这一行的最前面字符处
$ 或功能键[End]移动到这一行的最后面字符处
H光标移动到 这个"屏幕"的最上方那一行的第一个字符
M光标移动到 这个"屏幕"的中央那一行的第一个字符
L光标移动到 这个"屏幕"的最下方那一行的第一个字符
G移动到 这个文件的最后一行
nGn 为数字。移动到这个文件的第 n 行。例如 20G 则会移动到 这个文件的第 20 行
gg移动到这个文件的第一行,相当于 1G
n<Enter>n 为数字。光标向下移动 n 行
搜寻与取代
/word向光标之下 寻找一个名称为 word 的字串。例如要在文件内搜寻 vbird 这个字串,就输入 /vbird 即可
?word向光标之上 寻找一个字串名称为 word 的字串
n代表“ 重复前一个搜寻的动作 ”。举例来说, 如果刚刚 执行 /vbird 去向下搜寻 vbird 这个字串,则按下 n 后,会向下继续搜寻 下一个名称为 vbird 的字串。如果是执行 ?vbird 的话,那么按下 n 则会向上 继续搜寻名称为 vbird 的字串
N与 n 刚好相反,为“反向”进行前一个搜寻动作。 例如 /vbird 后,按下 N 则表示 “向上” 搜寻 vbird
:n1,n2s/word1/word2/gn1 与 n2 为数字。在第 n1 与 n2 行(从1开始)之间寻找 word1 这个字串,并将所有该范围内与这个字串相同的 取代为 word2。举例来说,在 100 到 200 行之间搜寻 vbird 并取代为 VBIRD 则:“:100,200s/vbird/VBIRD/g”(三条杠,1个逗号)
:1,$s/word1/word2/g从第一行 到 最后一行寻找 word1 字串,并将该字串取代为 word2
:1,$s/word1/word2/gc从第一行 到 最后一行寻找 word1 字串,并将该字串取代为 word2,且在取代前 显示提示字符给使用者确认 (confirm) 是否需要取代
删除、复制与贴上
x, X在一行字当中,x 为向后删除一个字符 (相当于 [del] 按键), X 为向前删除一个字符(相当于 [backspace] 亦即是倒退键)
nxn 为数字,连续向后删除 n 个字符
dd删除光标所在的那一整行
nddn 为数字。删除光标所在的向下 n 行,例如 20dd 则是删除 20 行
d1G删除光标所在 到第一行的所有数据
dG删除光标所在 到最后一列的所有数据
d$删除光标所在处,到该行的最后一个字符
d0删除光标所在处,到该行的最前面一个字符
yy复制光标所在的那一行
nyyn 为数字。复制光标所在的向下 n 行,例如 20yy 则是复制 20 行
yG复制光标所在行 到最后一行的所有数据
y0复制光标所在的那个字符 到该行 行首的所有数据,不包括光标所在位置的字符
y$复制光标所在的那个字符 到该行行尾的所有数据
p, Pp 为将已复制的数据 在光标下一个位置贴上(整行/多行就换下一行粘贴),P 则为贴在光标上一位置
J将光标所在列 与下一列的数据结合成同一列
u复原前一个动作
[Ctrl]+r重做上一个动作,与u逆操作
.重复上一次的编辑操作(前一个动作)

2、一般指令模式 切换到 编辑模式的可用的按钮说明

进入插入或取代的编辑模式
i, I进入插入模式:i 为“从目前光标所在处插入”, I 为“在目前所在行的 第一个非空白字符处(行首非空白处)开始插入”
a, A进入插入模式:a 为“从目前光标所在的 下一个字符处开始插入”, A 为“从光标所在行的 最后一个字符处开始插入”
o, O进入插入模式:“在目前光标所在的下一列处 插入新的一行”; O 为 在目前光标所在处的上一列 插入新的一行
r, R进入取代模式:r 只会取代光标所在的那一个字符一次;R会一直取代光标所在的文字,直到按下 ESC 为止
[Esc]退出编辑模式,回到一般指令模式中

3、一般指令模式 切换到 命令行界面的可用按钮说明

命令行界面的储存、离开等指令
:w将编辑的数据写入硬盘文件中
:w!若文件属性为“只读”时,强制写入该文件。到底能不能写入, 还是跟 对该文件的文件权限有关
:q离开 vi
:q!若曾修改过文件,又不想储存,使用 ! 为强制离开 不储存盘案
ZZ若文件没有更动,则不储存离开,若文件已经被更动过,则储存后离开
: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 相反,为取消行号

在 vi 中,“数字”是很有意义的,数字通常代表 重复做几次的意思
移动到第 43 列,向右移动 59 个字符:先按下 “43G” 再按下 “59→”

2.4 vim 的暂存盘、救援回复与打开时的警告讯息

1、当你的系统 因为某些原因而导致类似死机的情况时, 还可以 通过某些特别的机制来 让你将之前未储存的数据“救”回来
vim 就是通过“暂存盘”来救援

在使用 vim 编辑时, vim 会在与被编辑的文件的目录下,再创建一个名为 .filename.swp 的文件。 比如说 在编辑 ~/Linux/test 这个文件时, vim 会主动的创建 ~/Linux/.test.swp 的暂存盘,对 test 做的动作就会被 记录到这个 .test.swp 当中。如果你的系统 因为某些原因断线了, 导致你编辑的文件还没有储存,这个时候 .test.swp 就能够发挥救援的功能了

在这里插入图片描述
kill 可以仿真将系统的 vim 工作删除的情况,可以假装死机。由于 vim 的工作被不正常的中断,导致暂存盘 无法借由正常流程来结束, 所以 暂存盘就不会消失,而继续保留下来
如果 继续编辑那个 test

在这里插入图片描述
在上面的图示中 vim 提示两点主要的问题与解决方案,分别是这样的:

问题一:可能有其他人或程序同时在编辑这个文件:
由于 Linux 是多用户多任务的环境,因此很可能有很多人同时在编辑同一个文件。如果在多人共同编辑的情况下, 万一大家同时储存,那么这个文件的内容将会变的乱七八糟,为了避免这个问题,因此 vim 会出现这个警告窗口。解决的方法则是:
找到 另外那个程序或人员,请他将该 vim 的工作结束,然后 再继续处理
如果 你只是要看该文件的内容 并不会有任何修改编辑的行为,那么可以选择打开成为只读(O)文件, 亦即上述画面反白部分输入英文“ o ”即可,其实就是 [O]pen Read-Only 的选项

问题二:在前一个 vim 的环境中,可能因为 某些不知名原因导致 vim 中断 (crashed):
这就是常见的不正常结束 vim 产生的后果。解决方案依据不同的情况而不同。常见的处理方法为:
1)如果 之前的 vim 处理动作尚未储存,此时 应该要按下 “R”,亦即使用 (R)ecover 的项目, 此时 vim 会载入 .test.swp 的内容,让 自己来决定要不要储存。这样就能够救回来 之前未储存的工作。 不过那个 .test.swp 并不会在 结束 vim 后自动删除,所以 离开 vim 后还得要自行删除 .test.swp 才能避免每次打开这个文件 都会出现这样的警告

2)如果 确定这个暂存盘是没有用的,那么 可以直接按下 “D” 删除掉这个暂存盘,亦即 (D)elete it 这个项目即可。 此时 vim 会载入 test ,并且将旧的 .test.swp 删除后,创建这次会使用的新的 .test.swp

六个可用按钮 的说明如下:

  • [O]pen Read-Only:打开此文件成为只读文件, 可以用在 只是想要查阅该文件内容 并不想要进行编辑行为时。一般来说,在上课时,如果 是登陆到同学的计算机去看他的配置文件, 结果发现其实同学他自己也在编辑时,可以使用这个模式;
  • (E)dit anyway:还是用正常的方式 打开你要编辑的那个文件, 并不会 载入暂存盘的内容。不过很容易出现两个使用者互相改变对方的文件,不好
  • (R)ecover:就是 载入暂存盘的内容,用在你要救回之前 未储存的工作。 不过当 救回来并且储存离开 vim 后,还是要手动自行删除那个暂存盘
  • (D)elete it:确定那个暂存盘是无用的,那么打开文件前 会先将这个暂存盘删除。可能不确定这个暂存盘是怎么来的,所以就删除掉他
  • (Q)uit:按下 q 就离开 vim ,不会进行 任何动作回到命令提示字符
  • (A)bort:忽略这个编辑行为,感觉上与 quit 非常类似, 也会送回到命令提示字符

3、vim 的额外功能

使用 vim 编辑程序时 (不论是 C 语言,还是 shell script ),vim 将可 直接进行“程序除错 (debug)”的功能

3.1 区块选择(Visual Block)

区块选择的按键意义
v字符选择,会将光标经过的地方反白选择
V行选择,会将光标经过的行 反白选择
[Ctrl]+v区块选择,可以用长方形的方式 选择数据
y将反白的地方复制起来
d将反白的地方删除掉
p将刚刚复制的区块,在光标所在处贴上

3.2 多文件编辑

在 vi 内可以使用 :r filename 来读入某个文件的内容, 不过,这样毕竟是将整个文件读入,只是想要部分内容
可以使用 vim 后面 同时接好几个文件来 同时打开

多文件编辑的按键
:n编辑下一个文件
:N编辑上一个文件
:files列出目前这个 vim 的打开的所有文件

要将 hosts 内的前四列 IP 数据复制到 /etc/hosts 文件内,保留原格式

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
  • 通过“ vim hosts /etc/hosts ”指令来使用一个 vim 打开两个文件;
  • 在 vim 中先使用“ :files ”察看一下编辑的文件数据有啥
  • 在第一行输入“ 4yy ”复制四行(hosts 内)
  • 在 vim 的环境下输入“ :n ”会来到第二个编辑的文件,亦即 /etc/hosts 内;
  • 在 /etc/hosts 下按“ G ”到最后一行,再输入“ p ”贴上;
  • 按下多次的“ u ”来还原原本的文件数据;
  • 最终按下“ :q ”来离开 vim 的多文件编辑吧

3.3 多窗口功能

将一个文件分区成多个窗口的展现:如果 想要在新窗口启动另一个文件,就加入文件名,否则仅输入 :sp 时, 出现的则是同一个文件在两个窗口间

在这里插入图片描述
可以利用 “[ctrl]+w+↑” 及 “[ctrl]+w+↓” 在两个窗口之间移动

多窗口情况下的按键功能
:sp [filename]打开一个新窗口,如果有加 filename, 表示在新窗口打开一个新文件,否则表示 两个窗口为同一个文件内容(同步显示)
[ctrl]+w+j [ctrl]+w+↓按键的按法是:先按下 [ctrl] 不放, 再按下 w 后放开所有的按键,然后再按下 j (或向下方向键),则光标可移动到下方的窗口
[ctrl]+w+k [ctrl]+w+↑同上,不过光标移动到上面的窗口
[ctrl]+w+q如果 想要结束下方的窗口,那么利用 [ctrl]+w+↓ 移动到下方窗口后,按下 :q 即可离开, 也可以按下 [ctrl]+w+q

3.4 vim 的挑字补全功能

组合按钮补齐的内容
[ctrl]+x -> [ctrl]+n通过目前正在编辑的这个“文件的内容文字”作为关键字,予以补齐
[ctrl]+x -> [ctrl]+f以当前目录内的“文件名”作为关键字,予以补齐
[ctrl]+x -> [ctrl]+o以扩展名作为语法补充,以 vim 内置的关键字,予以补齐

一定要使用正确的扩展名,否则会无法出现任何关键字词

3.5 vim 环境设置与记录: ~/.vimrc, ~/.viminfo

当 重复编辑同一个文件时,当第二次进入该文件时, 光标竟然 就在上次离开的那一列上头, vim 会主动的将 曾经做过的行为记录下来,记录动作的文件就是: ~/.viminfo
这个文件是自动产生的, 不必自行创建

每个 distributions 对 vim 的默认环境都不太相同,举例来说,某些版本 在搜寻到关键字时 并不会高亮度反白, 有些版本则会主动的 帮你进行缩排的行为。但这些其实 都可以自行设置的,那就是 vim 的环境设置,可以在 一般指令模式时输入“ :set all ” 来查阅

vim 的环境设置参数
:set nu :set nonu设置与取消行号
:set hlsearch :set nohlsearchhlsearch 就是 high light search(高亮度搜寻)。 这个就是设置是否将搜寻的字串反白的设置值
:set autoindent :set noautoindent是否自动缩排
:set backup是否自动储存备份文件。一般是 nobackup 的, 如果设置 backup 的话,那么当 更动任何一个文件时,则原始文件会 被另存成一个文件名为 filename~ 的文件
:set ruler是否显示 右下角的一些状态列说明
:set showmode是否要显示 --INSERT-- 之类的字眼在左下角的状态行
:set backspace=(012)按下 i 进入编辑模式后,可以利用倒退键 (backspace) 来删除任意字符的。 通过 backspace 来设置,当 backspace 为 2 时,就是可以删除任意值;0 或 1 时,仅可删除刚刚输入的字符, 而无法删除原本就已经存在的文字
:set all显示 目前所有的环境参数设置值
:set显示与系统默认值不同的设置参数(有自行变动过的设置参数)
:syntax on :syntax off依据程序相关语法显示不同颜色
:set bg=dark :set bg=light显示不同的颜色色调

可以通过配置文件来直接规定我们习惯的 vim 操作环境,不需要 每次使用 vim 都要重新设置一次各个参数值

整体 vim 的设置值 放置在 /etc/vimrc 这个文件,不建议你修改;可以修改 ~/.vimrc 这个文件 (默认不存在,自行手动创建),将 希望的设置值写入

vim ~/.vimrc
"这个文件的双引号是注解
set hlsearch            "高亮度反白
set backspace=2         "可随时用倒退键删除
set autoindent          "自动缩排
set ruler               "可显示最后一列的状态
set showmode            "左下角那一列的状态
set nu                  "可以在每一列的最前面显示行号啦!
set bg=dark             "显示不同的底色色调
syntax on               "进行语法检验,颜色显示。

在这个文件中,使用“ set hlsearch ” 或 “ :set hlsearch ”,亦即最前面有没有冒号 “ : ” 效果都是一样的,双引号则是注解符号

4、其他 vim 使用注意事项

4.1 中文编码的问题

中文编码有 big5 与 utf8 两种,如果 文件是使用 big5 编码制作的,但在 vim 的终端接口中 使用的是万国码(utf8), 由于编码的不同,中文文件内容 就是一堆乱码

4.3 语系编码转换

iconv --list
iconv -f 原本编码 -t 新编码 filename [-o newfile]

选项与参数:
--list :列出 iconv 支持的语系数据
-f     :from ,亦即来源之意,后接原本的编码格式;
-t     :to ,亦即后来的新编码要是什么格式;
-o file:如果要保留原本的文件,那么使用 -o 新文件名,可以创建新编码文件。

除了正体中文的 big5, utf8 编码之外,也支持简体中文的 gb2312

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值