学习 Linux 命令行,就像要成为一名造诣很深的钢琴家一样,它不是我们一下午就能学会的技能。这需要经历几年的勤苦练习。我们将介绍 vi(发音“vee eye”)文本编辑器,它是 Unix 传统中核心程序之一。 vi 因它难用的用户界面而有点声名狼藉,但是当我们看到一位大师坐在钢琴前开始演奏时,我们的确成了伟大艺术的见证人。虽然我们在这里不能成为 vi 大师,当我们学完后,我们会知道怎样在 vi 中玩“筷子”。

   为什么我们应该学习 vi ?

在现在这个图形编辑器和易于使用的基于文本编辑器的时代,比如说 nano,为什么我们还应该学习 vi 呢?下面有三个充分的理由:

vi 很多系统都预装。如果我们的系统没有图形界面,比方说一台远端服务器或者是一个 X 配置损坏了的本地系统,那么 vi 就成了我们的救星。虽然 nano 逐渐流行起来,但是它还没有普及。POSIX,这套 Unix 系统中程序兼容的标准,就要求系统要预装 vi。

vi 是轻量级且执行快速的编辑器。对于许多任务来说,启动 vi 比起在菜单中找到一个图形化文本编辑器,再等待编辑器数倍兆字节的数据加载而言,要容易的多。

另外,vi 是为了加快输入速度而设计的。我们将会看到,当一名熟练的 vi 用户在编辑文件时,他或她的手从不需要移开键盘。

   背景介绍

第一版 vi 是在1976由 Bill Joy 写成的,当时他是加州大学伯克利分校的学生,后来他共同创建了 Sun 微系统公司。vi 这个名字来源于单词“visual”,因为它打算在带有可移动光标的视频终端上编辑文本。在发明可视化编辑器之前,有一次只能操作一行文本的行编辑器。为了指定一个修改,我们告诉行编辑器到一个特殊行并且说明做什么修改,比方说添加或删除文本。视频终端(而不是基于打印机的终端,像电传打印机)的出现,可视化编辑成为可能。vi 实际上整合了一个强大的叫做 ex 行编辑器, 所以我们在用vi 时能运行行编辑命令。大多数 Linux 发行版不包含真正的 vi;而是自带一款高级替代版本,叫vim(它“vi improved”的简写)由 Bram Moolenaar 开发的。vim 相对于传统的 Unix vi 来说,取得了实质性进步。通常,vim 在 Linux 系统中是“vi”的符号链接(或别名)。在随后的讨论中,我们将会假定我们有一个叫做“vi”的程序,但它其实是 vim。

Vim 有三种模式类型:编辑模式;输入模式;末行模式。

   编辑模式:是Vim的默认模式,又叫做命令模式;

   输入模式:又叫做插入模式;

   末行模式:在命令模式下按下:(英文冒号)就进入了末行命令模式。末行命令模式可以输入单个或多个字符的命令,可用的命令非常多。

   vim编辑器的使用及格式

      vim [options] [/path/to/somefile]

模式转换:

编辑模式 --> 输入模式:

            i:实现在当前光标所在处字符前面转换为输入模式;

            a:实现在当前光标所在处字符后面转换为输入模式;

            o:实现在当前光标所在行的下方新建一个空白行并转换为输入模式;

            I:在当前光标所在行的行首转为输入模式;

            A:在当前光标所在行的行尾转为输入模式;

            O:在当前光标所在行的上方新建一行,并转为输入模式;

输入模式 --> 编辑模式:

           按下Esc键;

编辑模式 --> 末行模式:

           键入:(英文冒号)

末行模式 --> 编辑模式:

           Esc,Esc (连续按两次)

光标跳转:

   字符间跳转:

按键 移动光标
h
向左移动,同左箭头效果
l 向右移动,同右箭头效果
j 向下移动,同下箭头效果
k 向上移动,同上箭头效果

   字符间多字符跳转:

             # 可与上面字符组合使用,表示向某方向移动#个字符

按键 移动光标
#h 向左侧跳转#个字符
#l 向右侧跳转#个字符
#j 向下面跳转#个字符
#k 向上面跳转#个字符

              如:6h表示向左跳转6个字符;6表示向右跳转6个字符。

   单词间跳转:

w 跳转至后一个单词的词首
e 跳至当前或下一个单词词尾
b 跳至当前或前一个单词词首

   句子间跳转:

)
跳转至下一句
( 跳转至上一句

   段落间跳转:

}
跳转至下一段
{ 跳转至前一段

   行间跳转:

1G, gg 跳转至行首 注:1G中1表示数字1
G 跳转至行尾
#G 跳转至#行 注: #号表示数字序号

   行内跳转:

^ 跳转至行首的第一个非空白字符
$ 绝对行尾
0 绝对行首 注: 0为数字0

   打开文件

       格式: vim [options] /path/to/file

             vim +# /path/to/file

             如: vim +8 /etc/init.d/functions 表示打开指定文件并跳转至第#行

   打开多个文件:

       格式: vim [options] /path/to/file /path/to/file

             如: vim /etc/init.d/functions /etc/fstab 表示打开指定多个文件

            注: 输入前需转换至末行模式:

next 跳转至下一个打开文件
prev 跳转至上一个打开文件
first 跳转至第一个打开文件
last 跳转至最后一个打开文件
-O 垂直分割窗口
-o 水平分割窗口

         如: vim -O /etc/init.d/functions /etc/fstab 垂直分割窗口

Vim文本编辑器_第1张图片

   关闭文件:

       注: 输入前需转换至末行模式:

w
保存
q 退出
!
强制
wq 保存退出
q! 强制退出
x 保存退出

       在编辑模式下:

ZZ 保存退出
wall 保存所有
qall 退出所有
wqall
保存退出所有

编辑命令

删除命令: d

x
删除单个字符
#x
删除光标所在处后面#个字符
dw
删除单词至下个单词词首
de
删除光标所在处的后的一个单词
db
删除光标所在处的前的一个单词
d^
删除光标所在处至行首的内容
d$
删除光标所在处至行尾的内容
dd
删除光标所在行
#dd
删除光标所在行及向下#行

在末行模式下使用d命令
            末行模式支持范围指定、地址定界

                   格式: 起始地址,结束地址

$ 最后一行
. 当前光标所在行
% 全文

      如: 1,7d 表示删除第1至7行
          1,$ 表示第1行至最后一行

在地址定界时还支持相对表达法

      如: 1,+6 表示从第1行开始往下6行,即包括第1行在内共7行
          1,$-2 表示从第1行开始至第倒数3行
          .,+3  表示从当前行开始往下3行,即包括第1行在内共4行

编辑操作可撤销:(在未保存之前)

         vim默认会最近50次的操作,u命令可逐一撤消此前的编辑操作

u
逐一撤消此前的编辑操作 注:需在编辑模式下使用
Ctrl+r
撤消此前的撤消 与u选项相反

粘贴操作: p

删除的是整行 删除的不是整行
p
p:小写 在当前光标所在行的下方粘贴
p
p:小写 在当前光标所在处字符的后方粘贴
P
P:大写 在当前光标所在行的上方粘贴 P
P:大写 在当前光标所在处字符的前方粘贴

复制操作: y

yy
复制当前光标所在行
#yy
复制当前光标所在向下#行
y^
复制当前光标处至行首
y$
复制当前光标处至行尾
复制的是整行 复制的不是整行
p
p:小写 在当前光标所在行的下方粘贴 p
p:小写 在当前光标所在处字符的后方粘贴
P
P:大写 在当前光标所在行的上方粘贴 P
P:大写 在当前光标所在处字符的前方粘贴

文本搜索:

   文件搜索查找支持正则表达式匹配

   如:/\ 字母d后有两个字母后跟n的单词

/keyword 从当前光标所在处向文件尾部查找
?keyword: 从当前光标所在处向文件首部查找
n
下一个,跟查找命令相同的方向
N
前一个,跟查找命令相反的方向

翻屏快捷键:

Ctrl+f 向文件尾部翻一屏
Ctrl+b 向文件首部翻一屏
Ctrl+d 向文件尾部翻半屏
Ctrl+u 向文件首部翻半屏


另外一种编辑命令

c
编辑,转换至输入模式
cc
删除所在行内容并且转换为输入模式
#cc
删除#行内容并转换为输入模式
c^
删除至行首的第一个非空白字符处并转换为输入模式
c$
删除所在行内容到行尾并转换为输入模式
c0
删除至行首并转换为输入模式

vim可视化模式
     visual模式

          v:选中光标划过的字符

          V:选中光标划过的行,整行选取

          按两下“Esc”键回到编辑模式

同一文档窗口分割:
         Ctrl+w 再按s水平分割文件
         Ctrl+w 再按v垂直分割文件

         Ctrl+w 再按箭头选择文件

窗口属性定义:

      set nu    :显示行号

      set nonu  :取消显示行号

      set ai    :自动缩进

      set noai  :取消自动缩进

      set ic    :不区分字符大小写

      set noic  :取消不区分字符大小写

      set sm    :显示匹配的括号

      set nosm  :取消显示匹配的括号

      syntax on :语法着色

      syntax off     :取消语法着色

      set nohlsearch :取消高亮显示

vim的配置文件:
        全局:/etc/vimrc  
只有管理员有权限修改配置,
修改后对所有用户有效

        个人:~/.vimrc 此文件实际不存在,自己创建即可。修改后只对当前用户有效

        由于shell只对当前用户有效,重启后将无效。所以需要修改配置文件

全局查找和替代

   末行模式下:

           地址定界s/查找模式/替换成的内容/gi

           地址定界s@查找模式@替换成的内容@gi

               例:某个文档"/dev/null"替换为"/tmp/a.txt"

                  %s/\/dev\/null/\/tmp\/a.txt/g

                  %s@/dev/null@/tmp/a.txt@g

   我们把这个命令分解为几个单独的部分,看一下每部分的含义

条目 含义
:
冒号字符运行一个 ex 命令
%
指定要操作的行数。% 是一个快捷方式,表示从第一行到最后一行。或者用 1,$ 来代替,意思是 “ 从第一行到文件的最后一行。” 如果省略了文本行的范围,那么操作只对当前行生效。
s
指定操作。在这种情况下是,替换(查找与替代
/Line/line 查找类型与替代文本
g
这是“全局”的意思,意味着对文本行中所有匹配的字符串执行查找和替换操作。如果省略 g,则 只替换每个文本行中第一个匹配的字符串。