第九章 vim程序编辑器

发布时间 2023-07-31 11:13:09作者: Evan-whc

第九章 vim程序编辑器

vi与vim

为何要学vim

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

9.2 vi的使用

  基本上vi共分为三种模式,分别是“一般指令模式”、“编辑模式”与“命令行命令模式”。这三种模式的作用分别是:

  • 一般指令模式(command mode)
    以vi打开一个文件就直接进入一般指令模式了(这是默认的模式,也简称为一般模式)。在这个模式中,你可以使用“上下左右”按键来移动光标,你可以使用“删除字符”或“删除整列”来处理文件内容,也可以使用“复制、贴上”来处理你的文件数据。
  • 编辑模式(insert mode)
    在一般指令模式中可以删除、复制、粘贴等等的运作,但是却无法编辑文件内容!要等到你按下“i,I,o,O,a,A,r,R”等任何一个字母之后才会进入编辑模式。注意了!通常在Linuxk,按下这些按键时,在画面的右下方会出现“INSERT或REPLACE”的字样,此时才可以进行编辑。而如果要回到一般指令模式时,则必须按下“Esc”这个按键即可退出编辑模式。
  • 命令行模式(command-line mode)
    在一般模式中,输入“??”三个中的任何一个按钮,就可以将光标移动到最下面那一列。在这个模式当中,可以提供你“搜寻数据”的运作,而读取、存盘、大量取代字符、离开vi、显示行号等等的运作则是在此模式中达成的!

  一般模式可与编辑模式及命令行界面切换,但编辑模式与命令行界面之间不可互相切换喔!

9.2.2 按键说明

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

    移动光标的方法
    h或向左方向键 光标向左移动一个字符
    j或向下方向键 光标向下移动一个字符
    k或向上方向键 光标向上移动一个字符
    l或向右方向键 光标向右移动一个字符
    如果想要多次移动的话, 例如向下移动30列,可以使用“30j”或“30+下箭头”的组合键,亦即加上想要进行的次数(数字)后,按下运作即可!
    Ctrl+f 屏幕向下移动一页,相当于[PageDown]
    Ctrl+b 屏幕“向上”移动一页,相当于[PageUp]
    Ctrl+d 屏幕向下移动半页
    Ctrl+u 屏幕向上移动半页
    + 光标移动到非空白字符的下一列
    - 屏幕移动到非空白字符的上一列
    n <space> 光标向右移动这一列的n个字符
    0或Home按键 这是数字0,移动到这一旬的最前面字符处
    $或End按键 移动到这一列的最后面字符
    H 光标移动到此屏幕的最上方的那一列的第一个字符
    M 光标移动到此屏幕的中央
    L 光标移动到此屏幕的最下方
    G 移动到这个文件的最后一列
    nG n为数字。移到到这个文件的第n列。例如20G则会移动到这个文件的第20列(可配合:set nu)
    gg 移到到这个文件的第一列,相当于1G
    n<Enter> n为数字。光标向下移动n列(常用)
    搜寻与取代
    /word 向光标之下寻找一个名称为word的字串。
    ?word 向光标之上寻找一个名称为word的字串
    n 这个是n是英文字符。代表重复前一个搜寻的运作
    N 这个N是英文字符。与n刚好相反,为“反向”进行前一个搜寻运作。
    :n1,n2s/word/word2/g n1与n2为数字。在第n1与n2列之间寻找word这个字串,并将该字串取代为word2!
    :1,$s/word1/word2/g 从第一列到最后一列寻找word1字串,并将该字串取代为word2!
    :1,$s/word1/word2/g 从第一列到最后一列寻找word1字串,并将该字串取代为word2!且在取代前显示提示字符给使用者确认(confirm)是否需要取代
    删除、复制与贴上
    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 重做前一个运作。
    . 重复前一个运作的意思
  • 第二部分:编辑模式可用的按钮说明

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

    命令行界面的储存、离开等指令
    :w 将编辑的数据写入硬盘文件中
    :w! 若文件属性为“只读”时,强制写入该文件。不过,到底能不能写入,还是跟你对该文件的文件权限有关啊!
    q: 离开vi
    :q! 若曾修改过文件,又不想储存,使用!为强制离开不储存盘案
    :wq 储存后离开,若为:wq!则为强制储存后离开
    ZZ 若文件没有更动,则不储存离开,若文件已经更动过,则储存后离开!
    :w [filename] 将编辑的数据存成另一个文件
    :r [filename] 在编辑的数据中,读入另一个文件的数据。亦即将“filename”这个文件内容加到光标所在列后面
    :n1,n2 w [filename] 将n1到n2的内容储存成filename这个文件
    :!command 暂时离开vi到命令行界面下执行command的显示结果!
    vim环境的变更
    :set nu 显示行号,设置之后,会在每一列的字首显示该列的行号
    :set nonu 取消行号

9.4 其他vim使用注意事项

9.4.1 中文编码的问题

  很多朋友常常哀嚎,说他们的vim里面怎么无法显示正常的中文啊?其实这很可能是因为编码的问题!因为中文编码有big5与utf8两种,如果你的文件是使用big5编码制作的,但在vim的终端接口中你使用的是万国码(utf8),由于编码的不同,你的中文文件内容当然就是一堆乱码了!怎么办?这时你得要考虑许多东西啦!有这些:

  1. 你的Linux系统默认支持的语系数据:这与/etc/locale.conf有关;
  2. 你的终端接口(bash)的语系;这与LANG,LC_ALL这几个变量有关;
  3. 你的文件原本编码;
  4. 打开终端机的软件,例如在GNOME下面的窗口接口

  事实上最重要的是上头的第三与第四点,只要这两点的编码一致,你就能正确的看到与编辑你的中文文件。否则就会看到一堆乱码啦!
  在Linux本机前的tty1~tty6原本默认就不支持中文编码,所以不用考虑这个问题!因为你一定会看到乱码!呵呵!现在鸟哥假设俺的文件内编码是big5时,而且我的环境是使用Linux的GNOME,启动的终端接口为GNOME-terminal软件,那鸟哥通常是这样来修正语系编码的行为:

LANG=zh_TW.big5
export LC_ALL=zh_TW.big5

  然后在终端接口工具列的“终端机--设置字符编码--中文(正体)(big5)”项目点选一下,如果一切都没有问题了,再用vim去打开那个big5编码的文件,就没有问题了!

9.4.2 DOS与Linux的断行字符

  我们在第六章里面谈到cat这个指令时,曾经提到过DOS与Linux断行字符的不同。而我们也可以利用cat -A来观察以DOS(Windows)创建的文件的特殊格式,也可以发现在DOS使用的断行字符为^M$,我们称为CR与LF两个符号。而在Linux下面,则是仅有LF($)这个断行符号。这个断行符号对于Linux的影响很大喔!为什么呢?
  我们说过,在Linux下面的指令在开始执行时,他的判断依据是“Enter”,而Linux的Enter为LF符号,不过,由于DOS的断行符号是CRLF,也就是多了一个^M的符号出来,在这样的情况下,如果是一个shellscript的程序文件,呵呵~将可能造成“程序无法执行”的状态~因为他会误判程序所下达的指令内容啊!这很伤脑筋吧!
  那怎么办啊?很简单啊,将格式转换成为Linux即可啊!
  不过,由于我们要操作的指令默认并没有安装,鸟哥也无法预期你有没有网络,因此假设你没有网络的状况下,请拿出你的原版光盘,放到光驱里头去,然后使用下面的方式来安装我们所需要的这个软件喔!

su -
mount /dev/sr0 /mnt
rmp -ivh /mnt/Packages/dos2unix-*
umount /mnt
exit
dos2unix [-kn] file [newfile]
unix2dos [-kn] file [newfile]
选项与参数:
-k: 保留该文件原本的mtime时间格式(不更新文件上次内容经过修订的时间)
-n: 保留原本的旧文件,将转换后的内容输出到新文件,如dos2unix -n old new

  因为断行字符以及DOS与Linux操作系统下面的一些字符的定义不同,因此,不建议你在Windows系统当中将文件编辑好之后,才上传到Linux系统,会容易发生错误问题。而且,如果你在不同的系统之间复制一些纯文本时,千万记得要使用unix2dos或dos2unix来转换一下断行格式啊!

9.4.3 语系编码转换

  很多朋友都会有的问题,就是想要将语系编码进行转换啦!举例来说,想要将big5编码转换成utf8。这个时候怎么办?难不成要每个文件打开转存成utf8吗?不需要这样做啦!使用iconv这个指令即可!鸟哥将之前章节做的vi章节做成big5编码的文件,你可以照下面的链接来下载先:

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编码时,那就得费些工夫了!举例来说,如果要将刚刚那个vi.utf8转成简体的utf8时,可以这样做:
iconv -f utf8 -t big5 vi.utf8 | iconv -f big5 -t gb2312 | iconv -f gb2312 -t utf8 -o vi.gb.utf8