第十章 vim 程序编辑器

1.  vim 是进阶版的 vivim 不但可以用不同颜色显示文字内容,还能够进行诸如 shell script, C program 等程序编辑功能,你可以将 vim 视为一种程序编辑器。

2.  在 ASCII 系统中的图标与代码可以参考 http://zh.wikipedia.org/wiki/ASCII

3.  所有的 Unix Like 系统都会内建 vi 文本编辑器,其他的文本编辑器则不一定会存在;很多软件的编辑接口都会主动呼叫 vi (例如crontab, visudo, edquota 等指令);vim 具有程序编辑的能力,可以主动地以字体颜色辨别语法的正确性,方便程序设计;因为程序简单,vim 编辑速度相当快速。

4.  vim (http://www.vim.org)会依据档案的扩展名或者是档案内的开头信息, 判断该档案的内容而自动地调用该程序的语法解析器,再以颜色来显示程序代码与一般信息。甚至一些 Linux 基础配置文件内的语法,都能够用 vim 来检查。

5.  基本上 vi 共分为三种模式,分别是『一般模式』、『编辑模式』与『指令列命令模式』:

    1)  一般模式:以 vi 打开一个档案就直接进入一般模式了(这是默认的模式)。在这个模式中, 你可以使用『上下左右』按键来移动光标,你可以使用『删除字符』或『删除整行』来处理档案内容, 也可以使用『复制、粘贴』来处理你的文件数据。

    2)  编辑模式: 在一般模式中可以进行删除、复制、粘贴等等的动作,但是却无法编辑文件内容。要等到你按下『i, I, o, O, a, A, r, R』等任何一个字母后才会进入编辑模式。而如果要回到一般模式时,则必须要按下『Esc』这个按键退出编辑模式。

    3)  指令列命令模式:在一般模式当中,输入『 : / ? 』三个中的任何一个按钮,就可以将光标移动到最底下那一行。在这个模式当中, 可以提供你『搜寻资料』的动作,而读取、存盘、大量取代字符、离开 vi 、显示行号等等的动作则是在此模式中进行的。


第十章  vim 程序编辑器
 

6.  输入『 vi 档名』就能够进入 vi 的一般模式了:

 
第十章  vim 程序编辑器
 

图中那个虚线是不存在的, 只是用来说明而已。上半部显示的是档案的实际内容,最底下一行则是状态显示列(图中的[New File]表示文件是新建的,如果文件已经存在则会显示有多少行和多少字符,如 "141L , 4617C" ), 或者是命令下达列。

7.  在一般模式下,只要按下 i, o, a 等字符就可以进入编辑模式了:


第十章  vim 程序编辑器

在编辑模式中,左下角状态栏会出现-- INSERT -- 的字样,那就是可以输入任意字符的提示。这时,键盘上除了 [Esc] 这个按键外,其他按键都可以规作为一般的输入按钮。按下 [ESC] 按钮回到一般模式。

8.  在一般模式中按下[:]键,光标就会移动到最底下一行去:


第十章  vim 程序编辑器
 

按 wq 储存后离开 vi。如果你的档案权限不对,例如为 -r--r--r-- 时,那么可能会无法写入,此时可以使用使用『 :wq! 』 多加一个惊叹号『强制写入』。但那是在『你的权限可以改变』的情况下才行。

9.  一般模式可用的按键说明:

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

如果想要进行多次移动的话,例如向下移动 30 行,可以使用 "30j" 或 "30↓" 的组合按键,

亦即加上想要进行的次数(数字)后,按下动作即可。

[Ctrl] + [f]屏幕『向下』移动一页,相当于 [Page Down]按键 (常用)
[Ctrl] + [b]屏幕『向上』移动一页,相当于 [Page Up]按键 (常用)
[Ctrl] + [d]屏幕『向下』移动半页
[Ctrl] + [u]屏幕『向上』移动半页
+光标移动到下一行的第一个非空格符
-光标移动到下一行的第一个非空格符
n<space>

n 表示『数字』,按下数字后再按空格键,光标会向右移动这一

行的 n 个字符。

0 或 功能键[Home]移动到这一行的最前面字符处 (常用)
$ 或 功能键[End]移动到这一行的最后面字符处(常用)
H光标移动到这个屏幕的最上方那一行的第一个字符
M光标移动到这个屏幕的中央那一行的第一个字符
L光标移动到这个屏幕的最下方那一行的第一个字符
G移动到这个档案的最后一行(常用)
nGn 为数字,移动到这个档案的第 n 行。(可配合 :set nu)
gg移动到这个档案的第一行,相当于 1G。(常用)
n<Enter>n 为数字,光标向下移动 n 行(常用)
搜寻与替换
/word向光标之下寻找一个内容为 word 的字符串。(常用)
?word向光标之上寻找一个内容为 word 的字符串。
n这个 n 是英文按键,代表『重复前一个搜寻的动作』与 / 或 ?相关。
N

这个 N 是英文按键,与 n 相反,为『反向』进行前一个搜寻动作。

:n1,n2s/word1/word2/g

n1 与 n2 为数字,在第 n1 与 n2 行之间寻找 word1 这个字符串,

并将该字符串替换为 word2(常用)

:1,$s/word1/word2/g

从第一行到最后一行寻找 word1 字符串,并将该字符串替换为 word2。

(常用)

:1,$s/word1/word2/gc

从第一行到最后一行寻找 word1 字符串,并将该字符串替换为 word2。

且在替换前显示提示字符给用户确认。(常用)

删除、复制与粘贴
x, X在一行字当中,x 为向后删除一个字符 (相当于 [del] 按键),X 为向前删除一个字符(相当于 [backspace] 亦即退格键) (常用)
nxn 为数字,连续向后删除 n 个字符。
dd删除游标所在的那一整行(常用)
nddn 为数字,删除光标所在的向下 n 行。 (常用)
d1G删除光标所在到第一行的所有数据
dG删除光标所在到最后一行的所有数据
d$删除游标所在处,到该行的最后一个字符
d0删除游标所在处,到该行的最前面一个字符
yy复制游标所在的那一行(常用)
nyyn 为数字,复制光标所在的向下 n 行。(常用)
y1G复制光标所在行到第一行的所有数据
yG复制光标所在行到最后一行的所有数据
y0复制光标所在的那个字符到该行行首的所有数据
y$复制光标所在的那个字符到该行行尾的所有数据
p, Pp 为将已复制的数据在光标下一行粘贴上,P 则为粘贴游标上一行。(常用)
J将光标所在行与下一行的数据合成一行(删除行尾的换行符)
c重复删除多个数据,例如向下删除 10 行为[ 10cj ],向右删除 5 个字符为[ 5ch ]
u撤销前一个动作。(常用)
[Ctrl]+r重做上一个被撤销的动作。(常用)
.这是小数点,是重复前一个动作的意思。

10.  一般模式切换到编辑模式的可用的按键说明:

进入插入或替换的编辑模式
i,I

进入插入模式(Insert mode):

i 为『从目前光标所在处插入』, I 为『在目前所在行的第一个非空格符处开始插入』。 (常用)

a, A

进入插入模式(Insert mode):

a 为『从目前光标所在的下一个字符处开始插入』, A 为『从光标所在行的最后一个字符处开

始插入』。(常用)

o, O

进入插入模式(Insert mode):

o 为『在目前光标所在的下一行处插入新的一行』,O 为在目前光标所在处的上一行插入新的

一行!(常用)

r, R

进入替换模式(Replace mode):

r 只会替换光标所在的那一个字符一次;R会一直替换光标所在的文字,直到按下 ESC 为止。

(常用)

[Esc]退出编辑模式,回到一般模式中(常用)

11.  一般模式切换到指令列模式可用的按键说明:

指令列的储存、离开等指令
:w将编辑的数据写入硬盘档案中(常用)
:w!若文件属性为『只读』时,强制写入该档案。
:q离开 vi (常用)
:q!若修改过档案,又不想储存,使用 ! 为强制离开不储存档案。
:wq储存后离开,若为 :wq! 则为强制储存后离开 (常用)
ZZ若档案没有更改,则不储存离开,若档案已经被更改过,则储存后离开
:e!恢复成档案的原始状态
:w [filename]将编辑的数据储存成另一个档案(类似另存新档)
:r [filename]

在编辑的数据中,读入另一个档案的数据。亦即将 『filename』 这个档案内容

加到游标所在行后面

:n1,n2 w [filename]将 n1 行到 n2 行的内容储存成 filename 这个档案。
:! command暂时离开 vi 到Linux命令行模式下执行 command 的显示结果。
:set nu显示行号,设定后,会在每一行的行首显示该行的行号
:set nonu与 set nu 相反,为取消行号

12.  当我们在 vim 的一般模式下按下 [ctrl]-z 的组合按键时,你的 vim 会被丢到后台去执行。

13.  当我们在使用 vim 编辑时, vim 会在被编辑的档案所在的目录下,再建立一个名为 .filename.swp 的档案。比如你对 man.config 做的改动就会被记录到 .man.config.swp 当中。如果你的系统因为某些原因断线了, 导致你编辑的档案还没有储存,当你再次用vim打开这个文件时,由于暂存文件存在的关系,因此 vim 会主动地判断你的这个档案可能有些问题,就会出现以下界面:


第十章  vim 程序编辑器
在上面的图示中 vim 提示两点主要的问题与解决方案:

    问题一:可能有其他人或程序同时在编辑这个档案。解决的方法则是:

        a)  找到另外那个程序或人员,请他将该 vim 的工作结束,然后你再继续处理。

        b)  如果你只是要看该档案的内容并不会有任何修改,那么可以选择打开成为只读(O)档案。

    问题二:在前一个 vim 的环境中,可能因为某些未知原因导致 vim 中断 (crashed),处理方法为:

        a)  如果你之前的 vim 处理动作尚未储存,此时你应该要按下『R』,亦即使用 (R)ecover 的项目, 此时 vim 会载入 .man.config.swp 的内容,让你自己来决定要不要储存。不过那个 .man.config.swp 并不会在你结束 vim 后自动删除,所以你离开 vim 后还得要自行删除 .man.config.swp 才能避免每次打开这个档案都出现这样的警告信息。

        b)  如果你确定这个暂存文件是没有用的,那么你可以直接按下『D』删除掉这个暂存文件。 此时 vim 会载入 man.config ,并且将旧的 .man.config.swp 删除后,建立这次会使用的新的 .man.config.swp。 

(E)dit anyway选项会用正常的方式打开你要编辑的档案, 并不会载入暂存文件的内容。不过很容易出现两个使用者互相改变对方的档案等问题。

14.  当我们在一般模式下按下 v 或者 V 或者 [Ctrl]+v 时, 这个时候光标移动过的地方就会开始反白,这三个按键癿意义分别是:

按键功能
v字符选择,会将光标经过的地方反白选择
V行选择,会将光标经过的行反白选择
[Ctrl]+v区块选择,可以用长方形的方式选择资料
y将反白的地方复制起来
d将反白的地方删除掉

15.  可以使用 vim 后面同时接好几个档案来同时打开它们,相关的按键有:

按键功能
:n编辑下一个档案
:N编辑上一个档案
:files列出目前这个 vim 打开的所有档案

vim 中使用『 :files 』察看一下编辑的档案会如下所示:

16.  在指令列模式输入『:sp {filename}』可以打开额外的一个窗口。那个 filename 可有可无, 如果想要在新窗口打开另一个档案,就加入档名,否则仅输入 :sp 时, 出现的则是同一个档案在两个窗口内。你可以利用『[ctrl]+w+↑』及『[ctrl]+w+↓』 在窗口间切换。多窗口情况下的按键功能如下:

按键功能
:sp [filename]

打开一个新窗口,如果有加 filename, 表示在新窗口打开一个新档案,

否则表示两个窗口为同一个档案内容(同步显示)。

[ctrl]+w+ j

[ctrl]+w+↓

按键的方法是:先按下 [ctrl] 不放, 再按下 w 后放开所有的按键,

然后再按下 j (或向下键),则光标可移动到下方的窗口。

[ctrl]+w+ k

[ctrl]+w+↑

按键的方法是:先按下 [ctrl] 不放, 再按下 w 后放开所有的按键,

然后再按下 k (或向上键),则光标可移动到上方的窗口。

[ctrl]+w+ q

结束离开当前窗口

17.  vim 会主动地将你曾经做过的行为记录下来,好让你下次可以轻松地作业。那个记录动作的档案就是: ~/.viminfo。如果我们搜寻一个档案内部的某个字符串,这个字符串会被反显,而下次我们再编辑这个档案时,该搜寻的字符串反显情况还是存在的。甚至于在编辑其他档案时, 如果其中也存在这个字符串,还是会主动反显。另外,当我们重复编辑同一个档案时,当第二次进入该档案时,光标就在上次离开的那一行上。

18.  vim 的环境设定参数有很多,可以在一般模式时输入『 :set all 』 来查阅。以下列出一些平时比较常用的一些简单的设定值:

按键功能

:set nu

:set nonu

设定与取消行号

:set hlsearch

:set nohlsearch

hlsearch 就是 high light search(高亮度搜寻)。

这个就是设定是否将搜寻到的字符串反显。默认值是 hlsearch

:set autoindent

:set noautoindent

是否自动缩排(就是当你按下 Enter 编辑新的一行时,

光标不会在行首,而是在与上一行的第一个非空格符处对齐)

:set backup

是否自动储存备份档。一般是 nobackup 的, 如果设定 backup ,

那么当你更改任何一个档案时,则源文件会被另存成一个档名

filename~ 的档案。

:set ruler

是否显示光标位置等住处在右下角的状态栏里。

:set showmode

是否要显示 --INSERT-- 之类的字眼在左下角的状态栏。

:set backspace=(012)

当 backspace 为 2 时,就是可以删除任意值;0 或 1 时,

仅可删除刚刚输入的字符, 而无法删除原本就已经存在的文字。

:set all

显示目前所有的环境参数设定值。

:set

显示与系统默认值不同的设定参数。

:syntax on

:syntax off

是否依据程序相关语法显示不同颜色。

:set bg=dark

:set bg=light

用以显示不同颜色色调,预设是『 light 』。如果你觉得注释字体深蓝色

很不容易看清, 那么这里可以设定为 dark。

:set laststatus=2

设定有两行状态栏 (一行状态+一行指令列) 

全局 vim 的设定值一般是放置在 /etc/vimrc 这个档案,你可以修改 ~/.vimrc 这个档案 (默认不存在),将你所希望的设定值写入。这个档案中的双引号 (") 是注释,写入设定值时不需要开头的冒号。

19.  vim 常用指令示意图:


第十章  vim 程序编辑器
 

20.  可以利用 cat -A 来观察以 DOS (Windows 系统) 建立的档案的特殊格式,DOS 使用的换行字符为 ^M$ ,我们称为 CRLF 两个符号。 而在 Linux 底下,则是仅有 LF ($) 这个换行符号。在 Linux 底下的指令在开始执行时,他的判断依据是 『Enter』,而 Linux 的 Enter 为 LF 符号,由于 DOS 的换行符号是 CRLF ,也就是多了一个 ^M 的符号出来,如果是一个 shell script 的程序档案,将可能造成『程序无法执行』的状态。我们可以通过以下指令来进行格式的转换:

# dos2unix [-kn] file [newfile] 
# unix2dos [-kn] file [newfile]

 -k 选项为保留该档案原本的 mtime 时间 (不更新档案上次内容经过修改的时间) ;-n 选项为保留原本的旧档,将转换后的内容输出到新档案。

21.  使用 iconv 这个指令来转换文件的编码:

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

选项说明如下:

选项功能
--list

列出 iconv 支持的语系数据

-f

from,后接原本的编码格式

-t

to ,即后面的新编码要是什么格式

-o file

保留原本的档案,使用 -o 新档名,可以建立新编码档案。

如果要将繁体中文的 utf8 转成简体中文的 utf8 编码时,可以这样做:

# iconv -f utf8 -t big5 vi.utf8 | \ > iconv -f big5 -t gb2312 | iconv -f gb2312 -t utf8 -o vi.gb.utf8

22.  常见文本编辑器比较:http://encyclopedia.thefreedictionary.com/List+of+text+editors

       维基百科的文本编辑器比较:http://en.wikipedia.org/wiki/Comparison_of_text_editors

       关于 vim 是什么的『中文』说明:http://www.vim.org/6k/features.zh.txt

       大家来学 vim (http://info.sayya.org/~edt1023/vim/)

       Linux Fedora 心得笔记: 繁体/简体中文的转换方法:http://blog.xuite.net/michaelr/linux/15650102

相关推荐