官网 http://www.vim.org/

一,vi与vim

1,为何要学vim?

a)所有的 Unix Like 系统都会内建 vi 文书编辑器,其他的文书编辑器则不一定会存在;

b)很多个别软件的编辑接口都会主动呼叫 vi (例如未来会谈到的 crontab, visudo, edquota 等指令);

c)vim 具有程序编辑的能力,可以主动的以字体颜色辨别语法的正确性,方便程序设计;

d)因为程序简单,编辑速度相当快速。

vim 视作 vi 的进阶版本,vim 可以用颜色或底线等方式来显示一些特殊的信息;

vim 会依据文件的扩展名或者是文件内的开头信息, 判断该文件的内容而自动的呼叫该程序的语法判断式,再以颜色来显示程序代码与一般信息;

vim 里面加入了很多额外的功能,例如支持正则表达式的搜寻架构、多文件编辑、区块复制等等


二, vi 的使用

vi 共分为三种模式,分别是『一般指令模式』、『编辑模式』与『指令列命令模式』

a)一般指令模式 (command mode)

以 vi 打开一个文件就直接进入一般指令模式了(这是默认的模式,也简称为一般模式)。在这个模

式中, 你可以使用『上下左右』按键来移动光标,你可以使用『删除字符』或『删除整列』来处

理文件内容, 也可以使用『复制、贴上』来处理你的文件数据

b)编辑模式 (insert mode)

在一般指令模式中可以进行删除、复制、贴上等等的动作,但是却无法编辑文件内容的! 要等到

你按下『i, I, o, O, a, A, r, R』等任何一个字母之后才会进入编辑模式。注意了!通常在 Linux

中,按下这些按键时,在画面的左下方会出现『 INSERT 或 REPLACE 』的字样,此时才可以进

行编辑。而如果要回到一般指令模式时, 则必须要按下『Esc』这个按键即可退出编辑模式

c)指令列命令模式 (command-line mode)

在一般模式当中,输入『 : / ? 』三个中的任何一个按钮,就可以将光标移动到最底下那一列。在

这个模式当中, 可以提供你『搜寻资料』的动作,而读取、存盘、大量取代字符、离开 vi 、显

示行号等等的动作则是在此模式中达成的!

注:一般指令模式可与编辑模式及指令列模式切换, 但编辑模式与指令列模式之间不可互相切换


1,简易执行范例

(1)使用『 vi filename 』进入一般指令模式

/bin/vim welcome.txt

打开后分为实际内容和状态信息行

(2)按下 i 进入编辑模式,开始编辑内容

a)在一般指令模式之中,只要按下 i, o, a 等字符就可以进入编辑模式

b)可以发现在左下角状态栏中会出现 –INSERT- 的字样,这个时候,键盘上除了 [Esc] 这个按键之外,其他的按键都可以视作为一般的输入按钮了

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

(4)进入指令列模式,保存文件并离开 vi 环境

保存 (write) 并离开 (quit) 的命令很简单,输入『:wq』即可保存退出! (按下 : 该光标就会移动到最底下一列去!


2,按键说明

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

a)移动光标的方法

h 或 向左箭头键(←)                光标向左移动一个字符

j 或 向下箭头键(↓)                    光标向下移动一个字符

k 或 向上箭头键(↑)                   光标向上移动一个字符

l 或 向右箭头键(→)                  光标向右移动一个字符

注:进行多次移动,例如向下移动 30 列,可以使用 "30j" 或 "30↓" 的组合按键

[Ctrl] + [f]                                    屏幕向下移动一页,相当于 [Page Down]按键 (常用)

[Ctrl] + [b]                                   屏幕向上移动一页,相当于 [Page Up] 按键 (常用)

[Ctrl] + [d]                                   屏幕向下移动半页

[Ctrl] + [u]                                   屏幕向上移动半页

+                                                  光标移动到非空格符的下一列

-                                                   光标移动到非空格符的上一列

n                                  n为数字,按下数字后再按空格键,光标会向右移动这一列的 n个字符

0或功能键[Home]                    移动到这一列的最前面字符处 (常用)

$ 或功能键[End]                       移动到这一列的最后面字符处(常用)

H                                                光标移动到这个屏幕的最上方那一列的第一个字符

M                                                光标移动到这个屏幕的中央那一列的第一个字符

L                                                 光标移动到这个屏幕的最下方那一列的第一个字符

G                                                移动到这个文件的最后一列(常用)

nG                                              n 为数字。移动到文件的第 n 列。例如 20G 则会移动到文件的第 20 列(可配合 :set nu)

gg                                               移动到这个文件的第一列! (常用)

n                                   n 为数字。光标向下移动 n 列(常用)

b)查找与替换

/word                                         向光标之下寻找一个名称为 word 的字符串

?word                                        向光标之上寻找一个字符串名称为 word 的字符串。

n                                                重复前一个搜寻的动作。

N                                                与 n 刚好相反,为『反向』进行前一个搜寻动作

:n1,n2s/word1/word2/g         在第 n1 与 n2 列之间寻找 word1 这个字符串,并将该字符串取代为 word2

:1,$s/word1/word2/g              从第一列到最后一列寻找 word1 字符串,并将该字符串取代为 word2 !(常用)

:1,$s/word1/word2/gc           在取代前显示提示字符给用户确认 (confirm) 是否需要取代!(常用)

c)删除、复制与粘贴

x, X         x 为向后删除一个字符 (相当于 [del] 按键), X 为向前删除一个字符(相当于 [backspace] 亦即是退格键) (常用)

nx           n 为数字,连续向后删除 n 个字符。

dd           删除游标所在的那一整列(常用)

ndd         n 为数字。删除光标所在的向下 n 列 (常用)

d1G        删除光标所在到第一列的所有数据

dG          删除光标所在到最后一列的所有数据

d$           删除游标所在处,到该列的最后一个字符

d0           那个是数字的 0 ,删除游标所在处,到该列的最前面一个字符

yy            复制游标所在的那一列(常用)

nyy          n 为数字。复制光标所在的向下 n 列(常用)

y1G        复制光标所在列到第一列的所有数据

yG          复制光标所在列到最后一列的所有数据

y0           复制光标所在的那个字符到该列行首的所有数据

y$           复制光标所在的那个字符到该列行尾的所有数据

p, P         p 为将已复制的数据在光标下一列贴上,P 则为贴在游标上一列!(常用)

J              将光标所在列与下一列的数据结合成同一列

c              重复删除多个数据,例如向下删除 10 列,[ 10cj ]

u              复原前一个动作。(常用)

[Ctrl]+r    重做上一个动作。(常用)

.               重复前一个动作的意思 (常用)

(2)第二部份:一般指令模式切换到编辑模式的可用的按钮说明

a)进入插入或替换的编辑模式

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]       退出编辑模式,回到一般指令模式中(常用)

(3)第三部份:一般指令模式切换到指令列模式的可用按钮说明

a)指令列模式的保存、离开等指令

:w           将编辑的数据写入硬盘文件中(常用)

:w!          若文件属性为『只读』时,强制写入该文件。

:q            离开 vi (常用)

:q!           为强制离开不储存文件。

:wq         保存后离开,若为 :wq! 则为强制储存后离开 (常用)

ZZ           若文件没有更动,则不保存离开,若文件已经被更动过,则保存后离开!

:w [filename]     将编辑的数据储存成另一个文件(类似另存新文件)

:r [filename]       在编辑的数据中,读入另一个文件的数据。亦即将 『filename』 这个文件内容加到游标所在列后面

:n1,n2 w [filename]             将 n1 到 n2 的内容储存成 filename 这个文件。

:! command                           暂时离开 vi 到指令列模式下执行 command 的显示结果!

b)vim 环境的变更

:set nu                显示行号,设定之后,会在每一列的前缀显示该列的行号

:set nonu           与 set nu 相反,为取消行号!


3,一个案例练习

http://linux.vbird.org/linux_basic/0310vi/man_db.conf

忽略


4,vim  的暂存档、救援回复与开启时的警告讯息

在使用 vim 编辑时, vim 会在与被编辑的文件的目录下,再建立一个名为 .filename.swp 的文件;

vim提示两点主要的问题与解决方案:

问题一 :可能有其他人或程序同时在编辑这个文件

解决方法:

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

b)如果你只是要看该文件的内容并不会有任何修改编辑的行为,那么可以选择开启成为只读(O)文件,

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

解决方法:

a)如果你之前的 vim 处理动作没有保存,此时你应该要按下『R』,亦即使用 (R)ecover 的项目, 此

时 vim 会载入 .man_db.conf.swp 的内容,那个 .man_db.conf.swp 并不会在你结束 vim 后自动删除,

所以你离开 vim 后还得要删除 .man_db.conf.swp 才能避免每次打开这个文件都会出现这样的警告!

b)如果你确定这个暂存盘是没有用的,那么你可以直接按下『D』删除掉这个暂存盘,亦即 (D)elete it

这个项目即可。 此时 vim 会载入 man_db.conf ,并且将旧的 .man_db.conf.swp 删除后,建立这

次会使用的新的 .man_db.conf.swp !

暂存盘警告讯息的画面中,有出现六个可用按钮,各按钮的说明如下:

a)[O]pen Read-Only:打开此文件成为只读文件

b)(E)dit anyway:还是用正常的方式打开你要编辑的那个文件, 并不会载入暂存盘的内容,容易出现冲突。

c) (R)ecover:就是加载暂存盘的内容,用在你要救回之前未保存的内容。 需要手动自行删除那个暂存档!

d) (D)elete it:删除暂存文件

e)(Q)uit:按下 q 就离开 vim ,不会进行任何动作回到命令提示字符。

f) (A)bort:忽略这个编辑行为,感觉上与 quit 非常类似! 也会回到命令提示字符!


三,vim  的额外功能

1,区块选择(Visual Block)

区块选择的按键意义

v                字符选择,会将光标经过的地方反白选择!

V               列选择,会将光标经过的列反白选择!

[Ctrl]+v     区块选择,可以用长方形的方式选择资料

y                将反白的地方复制起来

d               将反白的地方删除掉

p               将刚刚复制的区块,在游标所在处贴上!


2,多文件编辑

多文件编辑的按键

:n         编辑下一个文件

:N        编辑上一个文件

:files    列出目前这个 vim 的开启的所有文件


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 啊!


4,vim  的挑字补全功能

组合按钮                             补齐的内容

[ctrl]+x -> [ctrl]+n                通过目前正在编辑的这个『文件的内容文字』作为关键词,予以补齐

[ctrl]+x -> [ctrl]+f                 以当前目录内的『文件名』作为关键词,予以补齐

[ctrl]+x -> [ctrl]+o                以扩展名作为语法补充,以 vim 内建的关键词,予以补齐


5, vim  环境设定与记录: ~/.vimrc, ~/.viminfo

vim 的环境设定参数

:set nu   :set nonu                            设定与取消行号!

:set hlsearch    :set nohlsearch      hlsearch 就是 high light search(高亮度搜寻)。 这个就是设定是否将搜寻的字符串

                                                            反白的设定值。默认值是 hlsearch

:set autoindent  :set noautoindent      是否自动缩排?autoindent 就是自动缩排。

:set backup                                        是否自动储存备份档?一般是 nobackup 的

:set ruler                                            右下角的一些状态栏说明 ,ruler 是显示或不显示该设定值!

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

:set backspace=(012)                    一般来说, 如果我们按下 i 进入编辑模式后,可以利用退格键 (backspace) 来删除任

                                                          意字符的。 但是,某些 distribution 则不许如此。此时,我们就可以透过 backspace

                                                          来设定啰~ 当 backspace 为 2 时,就是可以删除任意值;0 或 1 时,仅可删除刚刚

                                                          输入的字符, 而无法删除原本就已经存在的文字了!

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

:set                                                     显示与系统默认值不同的设定参数, 一般来说就是你有自行变动过的设定参数啦!

:syntax on  :syntax off                    是否依据程序相关语法显示不同颜色

:set bg=dark  :set bg=light             可用以显示不同的颜×××调,预设是『 light 』


6,vim 常用指令示意图


四,其他 vim  使用注意事项

1,中文编码的问题

a)Linux 系统默认支持的语系数据: /etc/locale.conf ;

b)终端界面 (bash) 的语系: LANG, LC_ALL;

c)文件原本的编码;

d)开启终端机的软件,例如在 GNOME 底下的窗口接口。


2,DOS  与 Linux 的换行字符

 dos2unix [-kn] file [newfile]

 unix2dos [-kn] file [newfile]

选项与参数:

-k :保留该文件原本的 mtime 时间格式 (不更新文件上次内容经过修订的时间)

-n :保留原本的旧档,将转换后的内容输出到新文件,如: dos2unix -n old new


3,语系编码转换

 iconv  --list

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

选项与参数:

--list :列出 iconv 支持的语系数据

-f :from ,亦即来源之意,后接原本的编码格式;

-t :to ,亦即后来的新编码要是什么格式;

-o file:如果要保留原本的文件,那么使用 -o 新档名,可以建立新编码文件。


五,重点回顾

1,Linux 底下的配置文件多为文本文件,故使用 vim 即可进行设定编辑;

2, vim 可视为程序编辑器,可用以编辑 shell script, 配置文件等,避免打错字;

3,vi 为所有 unix like 的操作系统都会存在的编辑器,且执行速度快速;

4,vi 有三种模式,一般指令模式可变换到编辑与指令列模式,但编辑模式与指令列模式不能互换;

5,常用的按键有 i, [Esc], :wq 等;

6,vi 的画面大略可分为两部份,(1)上半部的本文与(2)最后一行的状态+指令列模式;

7,数字是有意义的,用来说明重复进行几次动作的意思,如 5yy 为复制 5 列之意;

8,光标的移动中,大写的 G 经常使用,尤其是 1G, G 移动到文章的头/尾功能!

9,vi 的取代功能也很棒! :n1,n2s/old/new/g 要特别注意学习起来;

10,小数点『 . 』为重复进行前一次动作,也是经常使用的按键功能!

11,进入编辑模式几乎只要记住: i, o, R 三个按钮即可!尤其是新增一列的 o 与取代的 R

12,vim 会主动的建立 swap 暂存档,所以不要随意断线!

13,如果在文章内有对齐的区块,可以使用 [ctrl]-v 进行复制/贴上/删除的行为

14,使用 :sp 功能可以分区窗口

15,若使用 vim 来撰写网页,若需要 CSS 元素数据,可透过 [crtl]+x, [crtl]+o 这两个连续组合按键来取得关键词

16,vim 的环境设定可以写入在 ~/.vimrc 文件中;

17,可以使用 iconv 进行文件语系编码的转换

18,使用 dos2unix 及 unix2dos 可以变更文件每一列的行尾断行字符。