一、vi的使用

1. vi的三种模式

  • 一般指令模式(command mode)

  • 编辑模式(insert mode)

  • 命令行命令模式(command-line mode)

2. 一般指令模式:光标移动

h或左方向键:光标向左移动一个字符;j或下方向键:光标向下移动一个字符;k或上方向键:光标向上移动一个字符;l或右方向键:光标向右移动一个字符;[number][hjkl]:向某方向移动number列;[Ctrl]+[f]:屏幕向下移动一页;[Page Down][Ctrl]+[b]:屏幕向上移动一页;[page Up][Ctrl]+[d]:屏幕向下移动半页;[Ctrl]+[u]:屏幕向上移动半页;+:光标移动到非空白字符的下一列;-:光标移动到非空白字符的上一列;n:光标向右移动n个字符;0或[Home]:移动到这一列的最前面字符处;$或[End]:移动到这一列的最后面字符处;H:光标移动到这个屏幕的最上方那一列的第一个字符;M:光标移动到这个屏幕的中央那一列的第一个字符;L:光标移动到这个屏幕的最下方那一列的第一个字符;G:移动到这个文件的最后一列(常用);nG:n为数,移动到这个文件的第n列;gg:移动到这个文件的第一列,相当于1G;n:n为数字,光标向下移动n列。

3. 一般指令模式:搜寻与取代

/word:向光标之下寻找一个名称为word的字串;?word:向光标之上寻找一个字串名称为word的字串;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,且在取代前显示提示字符给使用者确(confirm)是否需要取代。

4. 一般指令模式:删除、复制与贴上

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:重做上一个动作;.:这就是小数点,意思是重复前一个动作的意思。

5. 进入插入或取代的编辑模式

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

6. 命令行界面的储存、离开等指令

:w:将编辑的数据写入硬盘文件中;:w!:若文件属性为“只读”时,强制写入该文件。不过,到底能不能写入,还是跟你对该文件的文件权限有关;:q:离开vi;:q!:若曾修改过文件,又不想储存,使用!为强制离开不储存盘案;:wq:储存后离开,若为:wq!则为强制储存后离开;ZZ:若文件没有更动,则不储存离开,若文件已经被更动过,则储存后离开;:w[filename]:将编辑的数据储存成另一个文件;:r[filename]:在编辑的数据中,读入另一个文件的数据;:n1,n2 w [filename]:将n1到n2的内容储存成filename这个文件;:!command:暂时离开vi到命令行界面下执行 command 的显示结果;

7. vim环境的变更

:set nu:显示行号,设置之后,会在每一列的字首显示该列的行号;:set nonu:与set nu相反,为取消行号;

二、vim的额外功能

1. 区块选择

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. 挑字补全功能

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

5. 环境设置与记录

:set nu:set nonu:就是设置与取消行号;:set hlsearch:set nohlsearch:hlsearch就是high light search(高亮度搜寻)。这个就是设置是否将搜寻的字串反白的设置值。默认值是hlsearch;:set autoindent:set noautoindent:是否自动缩排。autoindent就是自动缩排。: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”;

三、vim注意事项

1. 中文编码问题

  • Linux系统默认支持的语系数据(/etc/locate.conf);

  • 终端接口(bash)的语系(LANG、LC_ALL);

  • 文件原本的编码;

  • 打开终端机的软件;

2. DOS与Linux断行字符

3. 语系编码转换

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