VI: Visual Interface,文本编辑器

文本: ASCII, Unicode

vi是一个功能强大的全屏幕文本编辑工具,一直以来都作为类UNIX操作系统的默认文本编辑器,vim(ViImproved)是vi编辑器的增强版本。在vi的基础上扩展了很多实用的功能,但是习惯上也将vim称作vi


文本编辑种类

    行编辑器: sed

    全屏编辑器:nano, vi

 

其他编辑器

    gedit 一个简单的图形编辑器

    gvim  一个vim编辑器的图形版本

 

vi相关工具

    vipw

    vipr

 

一、vim编辑器的工作模式

1、模式介绍

命令模式(Command Mode):启动vi编辑器后默认进入命令模式。该模式中主要完成如光标移动、字符串查找、以及删除、复制、粘贴文件内容等相关操作。

插入模式(Insert Mode):该模式中主要的操作就是录入文件内容,可以对文本文件正文进行修改或者添加新的内容。处于输入模式时,vi编辑器的最后一行会出现“——INSERT——“的状态提示信息。

末行模式(Last Line Mode):该模式中可以设置vi编辑环境、保存文件、退出编辑器,以及对文件内容进行查找、替换等操作。处于末行模式时,vi编辑器的最后一行会出现冒号”:“提示符。

vim文本编辑器详解_第1张图片

2、模式切换

命令模式              aio    AIO            插入模式

插入模式              Esc        命令模式

命令模式                     末行模式

末行模式              Esc        命令模式  按两次Esc可快速返回到命令模式

 

二、vim打开保存文件

1、打开单个文件

vim [选项] 文件名

直接使用vim会打开一个有提示信息的空文档,保存退出时需要在末行模式下使用w选项先保存,再退出文件。

使用vim可以使用如下选项打开文件:

    +# : 打开文件后,直接让光标处于第#行的行首

    +/PATTERN : 打开文件后,直接让光标处于第一个被PATTERN匹配到的行的行首

    vim + file :直接打开file,光标在最后一行

    vim –b file :二进制方式打开文件

    vim –d file1 file2… :比较多个文件,多窗口打开

    vim -m file : 只读方式打开文件

     

    单文件窗口分割:

    Ctrl+w,s: split, 水平分割

    Ctrl+w,v: vertical, 垂直分割

    ctrl+w,q:取消相邻窗口

    ctrl+w,o:取消全部窗口

    : wqall 退出

 

2、打开多个文件

vim 选项file1  file2 ... vim同时打开多个文件

-o:横向打开多个文件

-O:纵向打开多个文件

ctrl+w+方向箭头  多个文件之间切换

    :next 下一个

    :prev 前一个

    :first 第一个

    :last 最后一个

    :wall 保存所有

    :qall 退出所有

    :wqall

 

3、编辑二进制文件

    以二进制方式打开文件

        vim –b binaryfile

        扩展命令模式下,利用xxd命令转换为可读的十六进制

        :%!xxd

        :%!xxd –r        转换回二进制

    编辑二进制文件

        ~]# xxd /tmp/profile

 

4、保存文件

当编辑一个文件时,如果该文件存在,文件被打开并显示文件内容;如果该文件不存在,当编辑后第一次存盘时创建它。

退出编辑器。需要退出vi编辑器时,可以执行“:q”命令。若文件内容已经修改保存,仅使用“:q”命令将无法成功退出,这时需要使用“:q!”命令强行退出(不保存即退出)。

末行模式:(输入”:”进入末行模式)

:w   保存文件,当文件已经存在时,使用此命令

:w new_filename  将文件另存为

:!    强行操作

:w!   强行保存文件

:q    退出

:q!    强行退出

:wq  :x   保存退出

:x!

命令行模式:(Esc)

    ZZ   保存退出  

    ZQ:不保存退出

 

三、命令模式中的操作命令

1、输入模式切换

在命令模式中,使用aio等按键可以快速切换至输入模式,同时确定插入点的方式和位置,以便录入文件内容。需要返回命令模式时,按Esc键即可。

常见的几个模式切换键及其作用如下:

a:在当前光标位置之后插入文内容

A:在光标所在行的末尾(行尾)插入内容

i:在当前光标位置之前插入内容

I:在光标所在行的开头(行首)插入内容

o:在光标所在行的后面插入一个新行(小写字母o)

O:在光标所在行的前面插入一个新行(大写字母O)

 

2.、移动光标

字符间跳转

直接使用键盘的四个方向键完成相应的光标移动。

h: 将光标向左移动一格

l: 将光标向右移动一格

j: 将光标向下移动一格

k: 将光标向上移动一格

    #COMMAND:跳转由#指定的个数的字符

 

单词间跳转

    w:下一个单词的词首

    e:当前或下一单词的词尾

    b:当前或前一个单词的词首

    #COMMAND:由#指定一次跳转的单词数

    Ctrl+COMMAND:以连续字符算一个单词

 

当前页跳转

    H:将光标移动到该屏幕的页首

    M:将光标移动到该屏幕的中间行首

    L: 将光标移动到该屏幕的最后一行行首

 

行首行尾跳转

    ^: 跳转至行首的第一个非空白字符(相对行首)

    0或 home键: 数字0,将光标移动到该行的行首(绝对行首)

    $ 或 end键: 将光标移动到该行的行末(绝对行尾)

    其中home和end键同样适用于vi的输入模式

 

行间移动

    #G:#为数值,跳转至由#指定行的行首

    G:将光标移动到文章的最后一行

    1G 或 gg: 将光标移动到文章的第一行

Enter:移至下行行首

 

句间移动,以“.”为分隔符

    ):下一句

    (:上一句 

 

段落间移动

    }:下一段

    {:上一段

     

翻页操作

    Ctrl+F 或 page down: 向文件尾部翻一屏

    Ctrl+B 或 page up: 向文件首部翻一屏

    Ctrl+D: 向文件尾部翻半屏

Ctrl+U:向文件首部翻半屏

其中PageDownPageUp键同样适用于vi的输入模式

 

删除操作

x del键:删除光标处的单个字符

    #x: #为数值,删除光标处后面的#个字符(包含光标处字符)

X:   删除当前光标前的单个字符

dd: 删除当前光标所在行

#dd#为数值,删除从光标处开始后面#行内容

d^: 删除当前光标之前到行首的所有字符

d$: 删除当前光标处到行尾的所有字符

         dCOMMAND:命令可为hljk,分别表示删除光标前后单个字符、上下一行内容

         d后面结合方向键可以删除当前光标处前一字符、后一字符、上两行、下两行

   d0: 删除到行首

   dw: 删除整个单词,如光标不在词首,则删除从当前到词尾

   de: 光标后面的单词,如光标不在词首,则删除从当前到词尾

   db: 删除光标前面的单词,如光标不在词尾,则删除从当前到词首

D:从当前光标位置一直删除到行尾

2d6  从第二行开始删除,一共删除6行

 

替换命令(r, replace)

    r: 替换光标所在处的单个字符

    R: 切换成REPLACE模式,连续替换后面字符,按Esc结束

    xp: 交换光标所在处的字符及其后面字符的位置(x删除,p粘贴)

    ~: 转换大小写

    gU 变大写

    gu 变小写

 

复制、剪切、粘贴

Y    复制光标所在行整行内容

yy   复制光标所在行整行的内容

#yy  复制从光标处开始的#行内容

#yw  例如:2yw就是复制两个单词

    y$   复制光标所在处到行尾的内容

    y0   复制光标前一个字符到行首的内容(绝对,包括制表符)

    y^   复制光标前一个字符到行首的内容(相对)

    ye   从当前位置拷贝到本单词的最后一个字符

    yw   复制当前光标所在位置到单词尾字符的内容,相当于复制一个单词

100ic [ESC]  在当前位置向后粘贴“ c” 100次

p   粘贴到光标位置处之后

P   粘贴到光标位置处之前

:3,5y 复制第三行到第五行内容

 

撤销操作

u 用于取消最近一次的操作,多次重复按u键恢复已进行的多步操作

#u:撤销之前多次更改

U: 取消对当前行所做的所有编辑

Ctrl+R  可以恢复对使用u命令的操作

    .  重复前一个操作

    n. 重复前一个操作n次

 

其他命令

    CTRL+s  锁定

    Ctrl+q  解锁

 

四、命末行模式中的操作命令

 

    :r filename  读文件内容到当前文件中(当前行的下面)

    :r!command   将执行命令的结果写入到文件中

    :!command    不退出vim执行命令

    :set nu       number,显示行号

    :set nonu     nonumber,取消显示行号

    :set autoindent     缩进每一行,使之与前一行相同。常用于程序的编写。

    :set noautoindent   取消缩进

    :set number         在编辑文件时显示行号

    :set nonumber       取消行号显示

    :set ruler          在屏幕底部显示光标所在的行、列位置

    :set noruler        不显示光标所在的行、列位置

    :n1,n2 co n3        将从n1开始到n2为止的所有内容复制到n3后面

    :n1,n2 m n3         将从n1开始到n2为止的所有内容移动到n3后面

    :n1,n2 d            删除从n1开始到n2为止的所有内容

    :n                  直接输入要移动到的行号即可实现跳行

    :/str/              从当前光标开始往后移动到有 str 的地方

    :?str?              从当前光标开始往前移动到有 str 的地方

    :setsm              showmatch,成对匹配

    :setnosm           取消成对匹配

    :setai             启用自动缩进

    :setnoai           禁用自动缩进

    :set hlsearch      启用高亮搜索

    :set nohlsearch    取消高亮搜索

        :syntax on         启用语法高亮

    :syntax off        禁用语法高亮

    :set ic            启用忽略字符的大小写

    :set noic          不忽略字符的大小写

 

五、可视化模式

允许选择的文本块

    v 面向字符

    V 面向行

    ctrl-v 面向块

可视化键可用于与移动键结合使用:

    w, ) , },箭头等

突出显示的文字可以被删除,复制,变更,过滤,搜索/替换等

 

六、扩展模式:地址定界

    :start_pos,end_pos

    #:    具体第#行,例如2表示第2行;

    #,#:  从左侧#表示行起始,到右侧#表示行结尾

    #,+#: 从左侧#表示的行起始,加上右侧#表示的行数

    :2,+3 表示2到5行

    .:    当前行

    $:    最后一行

    .,$-1 当前行到倒数第二行

    %:   全文, 相当于1,$

    /pat1/,/pat2/

    从第一次被pat1模式匹配到的行开始,一直到第一次被pat2匹配到的行结束

    #,/pat/

    /pat/,$

    使用方式:后跟一个编辑命令

    w file: 将范围内的行另存至指定文件中

    r file:在指定位置插入指定文件中的所有内容

 

七、搜索查找替换

查找

    /PATTERN:从当前光标所在处向文件尾部查找

    ?PATTERN:从当前光标所在处向文件首部查找

    n:与命令同方向,查找下一个

    N:与命令反方向,查找下一个

 

s: 在扩展模式下完成查找替换操作

    格式: s/要查找的内容/替换为的内容/修饰符

    要查找的内容:可使用模式

    替换为的内容:不能使用模式,但可以使用\1,\2, ...

    等后向引用符号;还可以使用“ &”引用前面查找时查找到的整个内容

    修饰符:

    i: 忽略大小写

    g: 全局替换;默认情况下,每一行只替换第一次出现

    gc:全局替换,每次替换前询问

    查找替换中的分隔符/可替换为其它字符,例如

    s@/etc@/var@g

    s#/boot#/#i

 

示例:

    :s/old/new       new替换行中首次出现的old

    : s/old/new/g    new替换行中所有出现的old

    :3,9 s/old/new/g new替换从第3行到第9行中出现的old

    :% s/old/new/g   new替换整篇中出现的old

    :s/old/new/gc    替换关键词之前替换

 

八、vim的寄存器

有26个命名寄存器和1个无命名寄存器,常存放不同的剪贴版内容,可以不同会话间共享。

用a, b,…,z表示,用“寄存器表示,放在数字和命令之间

如: 3"tyy 表示复制3行到t寄存器中;"tp 表示将t寄存器内容粘贴

未指定,将使用无命名寄存器

有10个数字寄存器,用0, 1, …, 9表示, 0存放最近复制内容, 1存放最近删除内容。当新的文本变更和删除时, 1转存到2, 2转存到3,以此类推。数字寄存器不能在不同会话间共享。

 

九、定制vim的工作特性

当使用vim打开文件时可以输入set COMMAND设置vim的工作特性,这些都是临时生效的,关闭文件后设置的特性都失效了,要想永久生效可以把命令写入到文件中。

 

配置文件:永久有效

全局: /etc/vimrc

个人: ~/.vimrc     同时存在,个人配置生效

 

十、了解更多

    vi/vim内置帮助

    :help set

    :help

    :help topic

    ~]$vimtutor