在所有的Linux发行版上都会有的编辑器就是vi,而且很多软件默认也是是使用vi作为他们的编辑工具。vim是高级版的vi,vim不但可以用不同颜色显示文字内容,还能够进行诸如 shell脚本、C语言等程序编辑。

vi与vim

在Linux的系统中使用文本编辑器来编辑Linux参数配置文件是一件很重要的事情,至少应该要熟悉一种文本处理工具
Linux命令行模式下的文本编辑器:emacs、pico、nano、joe、vim

为什么要学vim

  • 所有的UNIX-like 系统都会内置vi文本编辑器,其他的文本编辑器则不一定会存在
  • 很多软件的编辑接口都会主动调用vi(例如crontab、visudo、edquota等命令)
  • vim具有程序编辑的能力,可以主动地以字体颜色辨别语法的正确性,方便程序设计
  • vim程序简单,编辑速度相当快速
    简单来说:
    vi是老式的文本编辑器,不过功能已经很齐全了,但是还是有可以进步的地方。
    vim里面加入了很多额外的功能,例如支持正则表达式的查找方式、多文本编辑、区块复制等,vim是一个程序开发工具而不只是文本处理软件,

vi的使用

vi共分3种模式,分别为一般命令模式、编辑模式与命令行模式
一般命令模式可与编辑模式及命令行模式切换,但编辑模式与命令行模式之间不可互相切换

  • 一般命令模式:以vi打开一个文件就直接进入一般命令模式(这是默认的模式,也简称为一般模式)。仅能删除和复制粘贴,不能做其他处理
  • 编辑模式:在一般模式种按下[a、A、i、I、o、O、r、R](除了元音字母e、E、u、U)中的任何一字母后进入编辑模式,按下[Esc]即可退出编辑模式
  • 命令行模式:在一般模式中按下[:、/、?]中的任何一个按钮,在底部操作栏提供退出选项

简易执行范例

使用[vi filename]进入一般命令模式

一般账号默认已经使用vim来替换vi,如果使用vi必须要使用绝对路径的方式来执行/bin/vi 才可以。vi后面一定要加文件名,不管该文件存在与否
image.png
打开空白文件
image.png
打开非空白文件

按下i 进入编辑模式,开始编辑文字

在一般模式中按下a、i、o等字符就可以进入编辑模式,键盘上除了[Esc]按键之外,其他的按键都可以视作为一般的输入按钮,可以进行任何的编辑

按下[Esc]键回到一般模式

按下[Esc]按键,

进入命令行模式,文件保存并退出vi环境

保存(wirte)并退出(quit)的命令很简单,输入[:wq]即可保存退出
当文件权限不够时可以使用[:wq!]即可,但是必须要用户的权限可以改变文件的权限才可以

按键说明

vi的三种模式只有一般命令模式可以与编辑、命令行模式切换,编辑模式与命令行模式之间并不能切换

一般命令模式(光标移动、复制粘贴、查找替换)以下命令若无[:]则均可以不需要输入[:]

移动光标的方法:

  • 上下左右箭头:上下左右移动一个字符
  • hjkl:对应逆时针左下右上移动一个字符
    image.png
    如上图下移20行即 [:20j]
  • [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行

查找与替换(以下均非常常用)

  • [/word]:向光标下寻找第一个名为word的字符串
  • [?word]:向光标上寻找第一个名为word的字符串
  • [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,且在替换前显示提示字符给用户确认(comfirm)是否需要替换

删除、复制与粘贴

  • [x]:相当于[del]
  • [X]:相当于[Backspace]
  • [nx]:n为数字,连续向后删除n个字符
  • [dd]:删除(截切)光标所在的那一整行
  • [ndd]:n为数字,删除(剪切)光标所在的向下n行
  • [d1G]:删除(剪切)光标所在到第一行的所有数据
  • [dG]:
  • [d$]:
  • [d0]:
  • [yy]:复制光标所在的那一行
  • [nyy]:n为数字,复制光标所在的向下n行
  • [y1G]:
  • [yG]:
  • [y0]:
  • [y$]:
  • [p、P]:p为将已复制的数据在光标下一行粘贴,P为光标上一行粘贴
  • J:
  • c:
  • u:恢复前一个操作
  • [Ctrl+r]:重做上一个操作
    上述的2个快捷键一个是恢复,一个是重做一次,这两个按键式非常常用的按键,很重要
  • .:.为小数点,重复前一个操作的意思。如果想要重复删除、粘贴等操作按下小数点[.]即可

编辑模式的可用按键(均常用)

  • [i、I]:进入插入模式(Insert mode),i为从目前光标所在处插入,I为在目前所在行的第一个非空格符处开始插入
  • [a、A]:进入插入模式,a为光标所在的下一个字符处插入,A为从光标所在行的最后一个字符处插入
  • [o、O]:进入插入模式,o为光标所在的下一行处插入新的一行,O为在目标光标所在处的商议后插入新的一行
  • [r、R]:进入替换模式(Replace mode),r只会替换光标所在的那一个字符;R会一直替换光标所在的文字,直到按下Esc为止
  • [Esc]:退出编辑模式,回到一般命令模式中

命令行模式可用按键

  • :w:将编辑的数据写入硬盘文件中(常用)
  • :w!:若文件为只读时,强制写入该文件,但能否写入还取决于用户的权限
  • :q:退出vi(常用)
  • :q!:若曾经修改过文件,又不想保存,使用!为强制退出不保存
    [!]在vi中,常常具有强制的意思
  • :wq:保存后退出,若为:wq!则为强制保存后退出(常用)
  • :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中,[数字]是很有意义的,数字通常代表重复做几次的意思,也有可能是代表去到第几个什么什么的意思
    常用的命令只有一半,通常vi的命令除了上述“常用”之外,其他不用背,可把常用的做壁纸辅助记忆

案例练习

vim的缓存、恢复与打开时的警告信息

当我们使用vim编辑时,vim会在被编辑的文件目录下,再建立一个名为.filename.swp的文件。如果编辑的文件没有保存,可以用.filename.swp的恢复功能
image.png
按下[Ctrl+z]则vim会在后台执行
image.png
kill模拟将系统的vim工作删除的情况,由于vim的工作被不正常中断,导致缓存的.filename.swp文件无法借由正常流程来结束,所以缓存就不会消失,而继续保留下来

image.png
再次vi编辑时,会提示如上问题

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

Linux时多人多任务的环境,为避免多人同时编辑同一个文件,会有该警告
解决方法:

  • 让其他人编辑的vim工作结束,然后再由自己处理
  • 如果只是查看而不修改可按[o]进入只读模式[open read only]

问题二:在前一个vim环境中,因为某些未知原因导致vim中断

  • 按下R将未保存的缓存文件加载进来,让自己决定是否保存,但之前的.filename.swp缓存文件还会继续存在,退出vim后还必须要手动删除缓存文件,不然还会出现警告
  • 按下D会清除旧的.filename.swp缓存文件,并重新建立新的.filename.swp文件

所有可用按键

  • [O]:打开文件为只读
  • [E]:正常打开要编辑的文件,并不会加载缓存内容,会出现多个用户相互改变对方文件的问题
  • [R]:加载缓存内容
  • [D]:删除缓存内容
  • [Q]:退出vim
  • [A]:忽略编辑操作,类似Q

vim的额外功能

为什么要用vim?因为vim具有颜色显示的功能,并且还支持许多的程序语法,当使用vim编辑程序时,vim可帮助进行[程序排错(debug)]的功能。
image.png
上图可见:

  • root的vi不为vim
  • 一般用户的vi即为vim
    image.png

可视区块 (Visual Block)

vi操作可以有行为单位的操作,但是可以有区块(以列为操作单位)范围

可视区块按键

  • v:字符选择,会将光标经过的地方反白选择
  • V:行选择,会将光标经过的行反白选择
  • [Ctrl+v]:可视区块,可以用矩形的方式选择数据
  • y:将反白的地方复制起来
  • d:将反白的地方删除掉
  • p:将刚刚复制的区块,在光标所在处粘贴
    image.png
    选择上述复制
    image.png
    在上图光标处粘贴

多文件编辑

多文件同时编辑,我们可以使用vim后面同时接好几个文件来同时打开

多文件编辑按键

  • :n:编辑下一个文件
  • :N:编辑上一个文件
  • :files:列出目前这个vim开启的所有文件
    总结:利用多文本编辑的功能,可以快速地将需要的数据复制到正确的文件内,当然,这个功能也可以利用窗口界面来达到

多窗口功能

多文本编辑的不足:

  • 当文件非常大时,来回切换上下页很麻烦
  • 想要同时对照看多个文件时
    划分窗口并放入文件:
    在命令行模式输入[:sp]。这个filename可有可无,如果想要在新窗口启动另一个文件,就加入文件名,否则仅输入:sp时,出现的则是同一个文件在两个窗口
    image.png
    同时多窗口打开同一个文件

多窗口情况下的按键功能

  • :sp [filename]:打开一个新窗口,如果有filename,表示在新窗口创建一个新文件,否则表示两个窗口为同一个文件内容(同步显示)
  • [Ctrl+w+j、Ctrl+w+向下箭头]:先按下Ctrl不放,按下w,放开按键,按下j或向下箭头,则光标可移动到下方的窗口
  • [Ctrl+w+k、Ctrl+w+向上箭头]:光标移动到上方窗口
  • [Ctrl+w+q]:关闭文件窗口3中方法,1.切入到相关闭的窗口输入[:q]退出,2.[:close] 关闭所在的窗口,3.[Ctrl+w+q]关闭所在窗口

vim的关键字补全功能

在语法校验方面,vim使用颜色提示
关键字补全方面也有快捷键补齐

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

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

vim会主动地将曾经做过的操作记录下来,方便与下次操作编辑记录,该记录操作的文件为:~/.viminfo
image.png
Linux发行版本对vim的默认环境都不太相同,但这个都可以自行设置,在一般命令模式下[:set all]来查看

vim的环境设置参数

:

总结:还可以通过配置文件来直接规定我们习惯的vim操作环境。整体vim的设置值一般是放置在/etc/vimrc 这个文件中,不过不建议修改,而是修改个人目录的~/.vimrc 这个文件(默认不存在,自行手动建立),将你所希望的设置值写入
image.png

  • vimrc 内容如下
    image.png
    image.png

vim常用命令示意图

其他vim使用注意事项

中文编码问题

由于编码不同,中文内容可能会为一堆乱码,需考虑

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

DOS与Linux的换行符

在Linux下面的命令在开始执行时,判断依据是[回车],而Linux的回车为LF($)符号,DOS的换行符为CRLF(M$),多了M,如果是一个shell脚本的程序文件,可能会造成程序无法运行的状态,因为会误判程序所执行的命令内容。必须要将格式转换为Linux。
转换:

  • dos2unix [-kn] file [newfile]:
  • unxi2dos [-kn] file [newfile]:

语系编码转换

iconv 命令


这个家伙很懒,啥也没有留下😋