zoukankan      html  css  js  c++  java
  • vi 编辑器的用法(2013最新整理)

    提到vi,就不得不提一下UNIX下另一功能强大的编辑器 - Emacs 。好多人喜欢拿Emacs和vi来比较,但笔者认为,Emacs 和 vi 没有可比性。vi的轻量级特性,使得它成为系统管理方面的首选工具;而Emacs的功能强大的特性,使得它成为系统开发方面的首选工具。如果用Emacs 来做系统管理,它庞大的体积和对于系统资源的耗费(相对于vi),势必会影响系统管理的效率;然而,如果用vi来搞软件开发,它有些面向于开发的功能方面 的不完备,也势必会影响开发的灵活性。在这里,我们的目标是建立和管理一台服务器,所以,我们选择使用vi编辑器来完成服务器的配置工作。


    由于本站所有服务器设置相关的修改工作,都是通过vi来完成的,所以准备通过本站介绍的各种方法构建服务器的话,请务必掌握vi的使用方法。否则将很难顺利的进行。如果您使用其它编辑器(比如Emacs)可以在安装过程中或通过yum命令在线安装。

    用法

      习惯于Microsoft Windows下GUI方式编辑器的朋友,刚刚接触vi肯定会有“排斥反应”的,这一点只能奉劝稍安毋躁……当你习惯于vi之后,你会发现它既精确又有秩序,而且重要的是它对于要编辑的对象极富针对性。



      上图为在CUI下输入“vi”命令后,vi被启动的状态。

      或者输入一个已存在的文件的路径,来打开一个已经存在的文本文件。(这里以用root用户登录系统,后输入“vi /etc/X11/xorg.conf”为例。)



      上图为用vi打开/etc/X11/xorg.conf后的状态。光标位于左上第一个字符下滑线的位置。

      vi和其他编辑器最不一样的地方莫过于它把编辑、处理等等的操作分离开来,形成性质不同的3种操作模式,他们分别为“命令模式”、“插入模式”、“ex模式”。

      在Windows下通常使用的记事本等等的编辑器在打开文件的时候,光标已经在处于输入等待的状态,也就是说,我们打开文件时就可以对文件进行编辑。 比如,我们要输入新的文本,或者复制一段文本,所有操作的前提,只要编辑器是被打开的状态,操作就是可能的。

       但在vi下,为了增强对将要处理的文本的针对性,文本输入、复制等等不同的操作,是被分离开来的,比如文本输入的模式叫做“插入模式”,在插入模式 下,我们可以用和Windows下一样的操作方法来对文本进行输入、编辑等等的操作,但是复制等等非编辑的操作,在插入模式下不能够完成,而需要切换到相 应的模式下用相应的命令来完成。

    在这里,还是首先对重要的vi的模式进行说明。

    ★ vi的模式(命令模式、插入模式、ex模式)

    1)命令模式:

      在我们刚刚通过vi新建或打开一个已经存在的文件时,首先默认被读取的模式就是“命令模式”,命令模式的特征就是,在编辑器窗口左下角的位置上没有任何的提示标语。



       在这个模式下,如果不通过相应的命令,我们无法输入新的文本到这个文件中。这里建议新接触刚刚接触vi的朋友在用vi打开一个文件时不要处于心切而乱 按键盘试图输入一些文本到文件中,因为命令模式所谓的“命令”,并不是我们在命令行提时下输入的过程诸如“ls -> 回车”等等形式的命令。确切说vi命令模式下的命令,只是计算机键盘上的某个按键或某些按键的组合,当我们在命令模式下敲下键盘一个按键的时候,相应命令 就已经被执行。


       在这里,首先介绍移动光标的命令。通常光标的移动可以通过键盘右边的方向键,但是由于每次移动光标,手都要大幅度的移动到键盘右边,这样使用vi是体现不出效率的,所以建议使用vi固有的命令(键)来控制光标的移动。

      光标的移动命令如下所示:

      向右移动 --> l
      向左移动 --> h
      向下移动 --> j
      向上移动 --> k
      如上所示,例如要向右移动光标8个字符的距离,只要在键盘上敲 l 键8次即可;向下移动3行的距离,只要在键盘上敲 j 键3次即可……也就是说,在vi命令模式中通过这几个键(命令)来控制光标的移动。

      其次就是文本删除的命令。在Windows下大多数编辑器在删除文本时只要连续按[Backspace]键即可。但由于在vi中,插入模式和命令模式是分离开来的,所以在命令模式下需要通过命令(按键)来删除文本,而不是直接按[Backspace]键。

      文本删除的命令如下所示:

      删除光标所在位置的字符 --> x
      删除光标所在的行 --> dd(敲 d 两次)
      如上所示,例如要删除从光标位置起向右的3个字符,只要在键盘上敲 x 键3次即可;要删除光标所在的行,只要敲 dd (连续敲d键两次),光标所在行的所有字符以及行将会被删除。

      再次,当编辑完了一个文档,想要保存后退出的时候的命令为“ZZ”(大写、连续敲2次)。

      保存并退出文档:

      保存当前修改并退出 --> ZZ

      另外,vi还有一些编辑性质的命令,一并总结如下

      具有编辑性质的有用的命令:

      撤销上一步操作 --> u
      移动光标到行首 --> 0 (数字0)
      移动光标到行末 --> $
      移动光标到当前页最顶行 --> H
      移动光标到当前页最底行 --> L
      向前翻一页(Page Up) --> Ctrl + f
      向后翻一页(Page Down) --> Ctrl + b
       还有在服务器配置中使用vi时,频繁用到的就是vi的搜索功能。在vi命令行的状态下,键入“/”(斜 线)后,vi底部出现“/”,并处于输入等待状态,这时候输入要查找的文字或文字列,然后按回车就可以找到相应的文字或文字列。当有多个对象存在时,敲 “n”(小写)键为查找下一个目标,敲“N”为查找上一个目标。

    vi是所有LUNIX系统都会提供的屏幕编辑器,它提供了一个视窗设备,通 过它可以编辑文件。当然,对UNIX系统略有所知的人,或多或少都觉得vi超级难用,但vi是最基本的编辑器,学好了vi,以后在UNIX世界里必将畅行 无阻、游刃有余,因为其他几种文本处理器并非UNIX标准配备。若其它的Linux机器里没有安装joe或pico,如果不会使用vi,那可能就真的没辄 了。
     
    vi编辑器有3种模式:命令模式输入模式末行模式。掌握这三种模式十分重要:
     
    命令模式:vi启动后默认进入的是命令模式,从这个模式使用命令可以切换到另外两种模式,同时无论在任何模式下只要按一下[Esc]键都可以返回命令模式。在命令模式中输入字母i或o或a,就可以进入vi的输入模式编辑文件。
     
    输入模式:在这个模式中我们可以编辑、修改、输入等编辑工作,在编辑器最后一行显示一个“--INSERT--”标志着vi进入了输入模式。当我们完成修改输入等操作的时候我们需要保存文件,这时我们需要先返回命令模式,在进入末行模式保存。
     
    末行模式:在命令模式输入“:”即可进入该模式,在末行模式中有好多好用的命令。
     
    下面介绍vi常用的命令操作
     
    进入输入模式命令
     
    i               在光标 左侧输入正文[常用]
    a              在光标 右侧输入正文[常用]
    o              小写字符o, 在光标所在行的 下一行增添新行
    O              大写字符O, 在光标所在行的 上一行增添新行
    I               在光标 所在行的开头输入正文
    A              在光标 所在行的末尾输入正文
    上面介绍了几种切换到插入模式的简单方法。另外还有一些命令,它们允许在进入插入模式之前首先删去一段
    正文,从而实现正文的替换。这些命令包括:
    s                 用输入的正文替换光标所指向的字符[常用]
    ns              用输入的正文替换光标右侧n 个字符
    cw              用输入的正文替换光标右侧的字  [常用]
    ncw            用输入的正文替换光标右侧的n 个字
    cb              用输入的正文替换光标左侧的字  [常用]
    ncb            用输入的正文替换光标左侧的 n 个字
    cd              用输入的正文替换光标的所在行[常用]
    ncd            用输入的正文替换光标下面的n 行
    c$              用输入的正文替换从光标开始到本行末尾的所有字符[常用]
    c0              用输入的正文替换从本行开头到光标的所有字符[常用]
     
    r            取代光标所在处的字符, 比如c3 表示将光标所在处的字符替换为字符3 [常用] 
     
    R           取代字符直至按【ESC】为止
     
    按【Esc】键或组合键【ctrl】+[ 退出输入模式
     
    末行模式
     
    w              保存文件  [常用]
     
    w file       将当前文件的内容保存到file文件
     
    wq           保存文件并退出vi编辑器[常用]
     
    wq file    将 当前文件的内容写入file 文件,并保持原有文件的内容不变,然后退出vi编辑器(假如当前文件内容有变动但未执行保存操作,那么执行该命令后不会退出vi编辑器)
     
    r file        读取file 文件的内容,插入当前光标所在行的后面
    e file        关闭当前文件,并打开新文件file (如果当前文件内容有变动但未保存,则该命令不会被执行)[常用]
    f file        将当前文件重命名为file [常用]
    f               打印当前文件名称和状态,如文件的行数、光标所在的行号等
     
    q              退出vi编辑器(如果当前文件有改动,则无法退出) [常用]
     
    q!             强制退出vi编辑器(不保存修改)[常用]
     
    #              将光标移到第#行[常用]
     
    PS:  关于行号使用的一些技巧:
     
    一般用数值来指定绝对行号;字符“.”表示光标所在行的行号;字符“$”表示文件最后一行的行号,例如:
     
    .+5                  将光标从当前行往下移动5 行
     
    $                     将光标移到文件的最后一行
     
    1                     将光标移到文件的第一行
     
    23w file         将文件的第23行写入file文件
     
    3,5w file       将第3 行至第5 行写入file 文件
    1,.w file        将第1 行至当前行写入file 文件
    .,$w file        将当前行至最后一行写入file 文件
    .,.+5w file    从当前行开始将6 行内容写入file 文件
    1,$w file      将所有内容写入file 文件,相当于:w file 命令
     
    移动光标的操作
     
    【Home】          光标到行首
    【End】              光标到行尾
    【Page Up】       向上翻页
     
    【Page Down】  向下翻页
     
    【Delect】          删除光标位置的字符
    【Ctrl】+ f          向前移动一页
     
    【Ctrl】+ b        向后移动一页
     
      h            光标向左移动一个字符   [常用] 
      j            光标向下移动一个字符   [常用] 
      k           光标向上移动一个字符   [常用] 
      l            光标向右移动一个字符   [常用] 
      数字0    把光标移到行尾  [ 常用] 
      $           把光标移到行首  [ 常用]  
      G           把光标移到文件的末尾  [ 常用] 
      gg          把光标移到文件的开头   [ 常用] 
      w           把光标移到下一个单词的开头  [ 常用] 
      e           把光标移到当前或下一个单词的字尾  [ 常用] 
      b           把光标移到当前或下一个单词的开头  [ 常用] 
      ^           把光标移到该行的第一个非空白字符(tab,space)   [ 常用] 
      :#         把光标移到该行的第#个位置,例如:3, :10   [ 常用] 
      )            光标移到句尾
      (            光标移到句首 
      注: 句子用半角句号后加一个空格(. )分割
      }           光标移到段落结尾
      {           光标移到段落开头
      注: 段落以空行分割
      nG        将光标定位到第n行的开头  [ 常用]
     
      n+        将光标下移n行  
     
     n-          将光标上移n行
     
     n$          将光标下移n行,并置于行尾
     
     H           将光标置于当前屏幕的顶行
     
     M          将光标置于当前屏幕的中间行
     
     L            将光标置于屏幕的最后行 
     
     ~            改变当前字符的大小写   [ 常用]
     
     >>          把当前行往右移动8个字符(相当于【tab】键)    [ 常用]
     
     <<          把当前行往左移动8个字符(相当于【Shift】+【tab】) [ 常用]
     
    nz:        将第n行滚至屏幕顶部,不指定n时将当前行滚至屏幕顶部。
     
    撤销操作
     
    u            命令撤销最近一次的操作,可以使用多次来恢复原有的操作   [ 常用]
    U           撤销所有操作
    .             可以恢复对使用u命令的操作      [ 常用]
     
    复制/删除/粘贴操作

    x           删除光标处的单个字符,并把删除后的字符放到缓存区( 实际上删除相当于剪切 )   [ 常用]
    nx         删除三个字符。 例如, 3x删除光标处向右的三个字符  
    "bnx     把删除的字符放到缓存区b
     
    dw        删除当前字符到单词尾(包括空格)的所有字符   [ 常用]
     
    dd        删除光标所在行  [常用]     [ 常用]
    ndd      删除n行。 例如, 3dd从当前行开始向下删除三行文本  [ 常用]
     
    "bndd   把删除的内容放到缓存区b
     
        PS: 如果要删除第m至第n行的内容,可以在末行模式中输入m,nd。比如3,5d表示删除第3~5行  [ 常用]
     
    yy        复制当前光标所在行的内容到vi缓冲区     [ 常用]
    nyy      复制n行。例如:5yy就是从当前光标所处的行向下复制5行,把复制的内容放到vi缓存区  [常用]
    "bnyy   将复制的内容放到缓存区b . 比如,b3yy 将三行数据存入缓存区b    [ 常用]
     
        PS: 如果要复制第m行到第n行之间的内容,可以在末行模式中输入m,ny例如:3,5y复制第三行到第五行内容到缓存区  [ 常用]
     
    yw       复制当前光标所在位置到单词尾字符 (不包括空格) 的内容到vi缓存区,相当于复制一个单词  [常用] 
    nyw     复制n个单词例如:2yw就是复制两个单词 
    "bnyw  例如, 复制n个单词到缓存区b
     
    y$        复制光标所在位置到行尾内容到缓存区   
    y^        复制光标所在位置到行首内容到缓存区    
    p          小写p, 将缓存区的内容粘贴到当前行的下方(与yy配合)  ,或插入到当前光标的下一个位置(与dw, x, y$ , y^ 配合)[常用]
     
    P          大写P,与小写p的作用类似,但粘贴都方向相反
     
    查找与替换

            vi的查找与替换功能要再末行模式下完成。
     
    /关键字                                               自上而下查找,比如/work,表示从当前光标处往下查找关键字为work的内容[ 常用]
     
    ?关键字                                              自下而上查找 , 比如/work,表示从当前光标处往上查找关键字为work的内容  [ 常用]
     
    PS: 当找到匹配项时,光标会定位在关键词都字符开头。要继续查找下一个匹配项,只需敲入字符n; 要往回查找,敲入N. 可以输入2n往下查找下下一个匹配项
     
    s/old_string/new_string               用new_string替换光标所在行中首次出现的old_string
     
    s/old_string/new_string/g           用new_string替换光标所在行中的所有old_string
     
    m,ns/old_string/new_string/g   用new_string替换第m行至第n行的所有old_string [ 常用]
     
    %s/old_string/new_string/g      用new_string替换所有的old_string   [ 常用]
     
    /pattern_address/s/old_string/new_string/g    从当前光标处往下查找与pattern_address匹配的行,然后在该行上用new_string替换掉所有的old_string(实际上,这个命 令是由/pattern_address 和/s/old_string/new_string/g组合而成)
     
    g/pattern_address/s/old_string/new_string/g    找出所有与pattern_address匹配的行, 并用new_string替换掉每一行所有的old_string( 注意: 前后两个g的含义是不一样的,前面的g表示对整个文本搜索与pattern_address匹配的行, 后面的g表示针对每一个与pattern_address匹配的行都用new_string替换掉old_string)
     
         如果pattern_address和old_string一样,可以简写为g/pattern_address/s//new_string
     
         可以在所有的命令尾加一个c命令,强制每个替换需要用户进行确认,例如:s/old/new/c 或s/old/new/gc   [ 常用] 
     
    PS: 查找的一些技巧
     
    /str/w file                                              正向搜索,并将第一个包含字符串str 的行写入file 文件
    /str1/,/str2/w file                              正向搜索,并将包含字符串str1 的行至包含字符串str2 的行写入file 文件
     
    恢复文件
    vi在编辑某一个文件时,会生成一个临时文件,这个文件以. 开头并以.swp结尾。正常退出该文件自动删除,如果意外退出例如忽然断电,该文件不会删除,我们在下次编辑时可以选择一下命令处理:
     
    O        只读打开,不改变文件内容
    E         继续编辑文件,不恢复.swp文件保存的内容
    R        将恢复上次编辑以后未保存文件内容
    Q        退出vi
    D        删除.swp文件
     
    或者使用vi -r 文件名来恢复未保存的内容
  • 相关阅读:
    8.10
    今日头条笔试题 1~n的每个数,按字典序排完序后,第m个数是什么?
    Gym 100500B Conference Room(最小表示法,哈希)
    CodeForces 438D The Child and Sequence(线段树)
    UVALIVE 6905 Two Yachts(最小费用最大流)
    Gym Conference Room (最小表示法,哈希)
    hdu 2389 Rain on your Parade(二分图HK算法)
    Codeforces Fox And Dinner(最大流)
    zoj 3367 Counterfeit Money(dp)
    ZOJ3370. Radio Waves(2-sat)
  • 原文地址:https://www.cnblogs.com/linuxnotes/p/3137656.html
Copyright © 2011-2022 走看看