想法子记忆Vi/Vim常用操作及指令


本笔记有特殊目录,点击开启:

在Linux系统中编辑文本总是离不开一位老帮手——Vi。而因为其诞生的年代有些久远,有些操作在现在看来可能有点“反直觉”。

于是我决定写这样一篇小笔记,记录一下我记忆Vi的这些这些 常用 操作和指令的方法(主要靠的是英语和图示了)。

当然,正如“好记性不如烂笔头”所言,多实践才是熟练掌握技能的王道。

002-2022-04-02

关于Vi/Vim名词本身

  • Vi代表的可能是Visual Instrument(可视工具)Visual Interface(可视界面)亦或就是Visual(可视化的)单词本身。

  • Vim倒是很明显,代表的是Vi IMproved(Vi改进版)

编辑器模式

Vi而言:

  1. 命令模式 (Command mode) ,刚进入Vi编辑器时的默认模式。在此模式下能输入Vi的合法指令(通常是一些字符)来进行操作。

  2. 插入(输入)模式 (Insert mode) ,顾名思义,是直截了当地编辑文本的模式。

  3. 末行(底线)模式 (Last-line mode) ,也是接受指令的一种模式,更偏向于文件的管理。
    之所以叫 “末行” 是因为指令的输入在窗口最下方:

    lastLineMode-2022-04-07

VimVi的增强版,因此Vim完全可以兼容Vi的操作,不过它的模式名可能略有差别:

  1. 正常模式 (Normal mode) ,是启动Vim后的默认模式。

  2. 插入模式 (Insert mode) ,这个和Vi的一致。

  3. 命令(行)模式 (Command-line mode),类似Vi的末行模式。

  4. 可视模式 (Visual mode) ,和普通模式类似,不同的是可以高光选择文字的一部分进行命令操作

    包括上述几种模式,Vim总共有12种模式(这个说法来自Wikipedia)。但最常用的还是上面这四种,一般情况下够用了。

    015-2022-04-06

模式切换

展开阅读

Vi的三种模式而言,要在其间互相切换,需要借默认模式——命令模式作为一个中转(对于Vim来说就是正常模式)。

  • 命令模式

    “剪切一行”这一节中也提到了。

  • 上面这些按键指令都是在命令模式/正常模式下输入的,通过在指令前附加数字,能重复这个指令的操作:

    模式切换

  • 基本光标移动(上下左右)

    缩进操作后,标记的位置仍然在文本的相应位置,无需担心。

    末行模式/命令行模式下可以查看标记信息::marks

  • 翻页

    单词尾部的部分,

    y^ 能复制光标所在位置到行首第一个非空白符的单词部分,

    再者 y↓yj 能实现同2yy一样的功能:复制光标所在行以及下一行

    甚至 y( 都是可以的,复制光标所在位置光标所在句开头

    也就是说 y{, y}, yk ,yl ,y$ ,yg^, y`a 等等其实都是可以的!
    另外还可以复制多行,比如3ygj


    模式切换这一节里面写了

    ??记忆方法dd 中的 d记为delete [v]删除
    cc中的c记为change[v]改变,亦可记成Chi 吃
    S可以记成Shift [v]转移,剪切就像是在转移文本的位置,亦可记成Shan 删

  • 剪切多行

    多行复制了,肯定是会剪切多行的。

    2dd 剪切光标所在行下面一行,共2
    6dd 剪切光标所在行下面5行,共6
    3cc 剪切光标所在行及下面2行,并进入插入模式
    3S 同上??

  • 剪切一个字符

    切换到插入模式服务!

    arrogantCandD-2022-04-11

    djd↓ 的效果就等同于2dd
    cjc↓ 的效果就等同于2cc,会进入插入模式
    5x 能剪切光标右边的5个字符
    5s 能剪切光标右边5个字符且进入插入模式
    3cgj 能剪切从当前光标3屏幕可见行后的相应位置部分
    dw 剪切从当前光标位置下一个单词前的部分
    cw 在进行上面的操作??后,会进入插入模式
    d^ 剪切从当前光标位置本行头部一个不是空白符的字符的部分
    c^ 在进行上面的操作??后,会进入插入模式
    d`a 剪切从当前光标位置到a标记位置的部分

    3dgj-2022-04-11

    ??演示了一下 3dgj 。从光标所在位置 开始,到执行了3gj之后的光标位置为止作为选区,进行剪切。也就是这一部分:

                                  语人曰:“此当有大手
    笔事。”俄而帝崩,哀册说议皆淘所草。释义用来赞誉写作才
    能极高,并用来称颂着名的作家和作品、故事东晋的文士王玖
    从小才思敏捷,胆量很大,散文和诗
    

    :reg[isters]

  • 缩进

    nrformats配置一节。

  • 字母大小写切换

    双引号指定寄存器一起记。

    ? 直接使用 :registers:reg 时会展示所有的寄存器 ??

    registers-2022-04-18

    也可以在后面指定要查询的寄存器名,这些名称可以用空格分开,也可以连在一起写:

    ? 比如 :reg[isters] a b c:reg[isters] abc ,可以筛选查询a,b,c寄存器 ??

    specifyRegisters-2022-04-18

    关于寄存器更多用法这里就不多赘述了~

    009-2022-04-18

  • :marks 查看标记信息

    自定义跳转标记一起记。

    ? 直接使用 :marks 能查询到所有现有的标记

    和:registers一样,在后接查询的标记名,能筛选结果:

    ? 比如 :marks a b c:marks abc ,可以筛选查询a,b,c标记

  • :set 设置项

    快捷减增数字。不过呢,Vim怎么识别增减的类型呢? 这就涉及到下面这个配置项了:

    • :set nrformats:set nf

      能识别的增减类型。这里的octal,hex 则代表会尝试识别八进制十六进制以及十进制的数字。(十进制是默认支持的)

    • 使用 +=-= 进行配置

      自定义跳转标记) 上述符号±相对行数 比如'a+2就代表a标记所在行的下面第二行;.-1 就代表光标所在行的上面一行 上述符号1,上述符号2 代表从上述符号1代表的行到上述符号2代表的行。比如.,$代表从光标所在行到最后一行。 % 代表从第一行到最后一行(整个文本),和1,$相同 '<,'>可视模式下输入 : 进入末行模式/命令行模式会自动填充,代表**可视模式下选定的范围

      replaceInTheRange-2022-04-22

      ?? 示例:.,+3 代表从光标所在行到光标所在行的下面第三行作为范围进行替换

    • 搜索模式

      搜索模式

      ?? 值得一提的是这里可以留空。如果留空的话默认使用上一次搜索的匹配。

      比如我先搜索了/\,然后我想替换全文的/\pepper,在替换时可以这样写::%s//pepper/g(省略了搜索模式)。

    • 替换模式

      搜索模式中提到过在模式中加入 \c 能忽略大小写进行搜索,而这里替换也是用的搜索模式,
      因此在这里就算不用修饰符i,转而在搜索模式中加入\c也是完全可以的。

      replaceIgnoreCase-2022-04-22

      ?? 不使用修饰符而是在搜索模式中使用了\c


      numerateMatches-2022-04-22

      ?? 使用 n 修饰符,并不会实际替换文本,而是显示匹配的数量


      confirmReplace-2022-04-22

      ?? 使用 c 修饰符,在替换前让用户确认

      其中提示输入的 (y/n/a/q/l/^E/^Y) 中,分别代表:

      输入指令 说明 记忆
      y 确认替换当前光标所在匹配 yes [v]确认
      n 不替换当前匹配 no [v]不
      a 确认替换所有匹配 all [v]所有
      q 不进行替换并退出 quit [v]退出
      l 替换当前匹配并退出 instead [adv]顶替

      (另还有Ctrl+ECtrl+Y,是光标移动指令)

    • 除了这些,搜索替换可能还有一些其他的用法尚未提到,另外还有:g这种末行指令。这里就主要记录一下基础的用法啦~

      exhausted-2022-04-22

      简单多窗口编辑

      一个文件一个文件地打开编辑老累了,幸运的是,Vim支持多窗口编辑。

      • 打开新窗口

        :q 退出

      可视模式

      前面的笔记有几个地方涉及到了可视模式

      • 模式切换->可视模式

      • 基本搜索替换->作用范围

      可视模式下的操作可谓是简化版的命令模式/正常模式了,显而易见,“简化”的就是“选择文本”的操作了。


      在高光选择了文本后可以进行以下操作:

      • 拷剪粘三件套

        行连接指令几乎是一样了。

        • J 将所选文本对应的行连接成一行,用空格间隔Join

          spaceJoinedRow-2022-04-23

        • gJ 将所选文本对应的行连接成一行,没有间隔

          directlyJoinedRow-2022-04-23

      • 执行末行模式/命令行模式指令

        基本搜索替换->作用范围

      • 代码缩进

        大小写转换指令是很类似的:

        • u 将所选文本转换为小写

        • U 将所选文本转换为大写UPPERCASE

        • ~ 将所选文本中的大写小写分别转换为小写大写

        caseSwitchInVisualMode-2022-04-23

        ?? 演示了一下使用~进行大小写转换

      可视模式还有很多用法,这里就不再写更多了(再写更多就成语法手册了喂!)

      In the end

      回过头来...我又写了这么长一篇笔记...稍后我会完善一下目录功能以增加阅读体验。

      这篇笔记虽然写得多,但是涉及的内容实际上还是比较浅层的,毕竟这篇笔记主要目的是为了记忆常用方法。也就是说,Vi/Vim的使用技巧远不止这么一点,更多高级的操作还需日常多加使用才能更加熟练!

      因个人能力极其有限,可能文章中会出现部分错误。如果有写错的地方,也请大家多指教!

      最后...感谢你读到这里,再会~

      bye-2022-04-23