VIM - 宏 - 简单使用

  1. 概述

    1. VIM 宏的基本操作
  2. 背景

    1. 之前退出, 查历史记录的时候, 偶然按错
    2. 某些动作, 不是单纯依靠 替换操作, 就做得出来的...
  3. 环境

    1. OS
      1. win10
    2. shell
      1. mintty-2.9.4

1. 宏

  1. 概述

    1. 什么是宏
    1. 百度百科

      宏就是一些命令组织在一起,作为一个单独命令完成一个特定任务
    2. 我的感觉

      1. 操作有序集合
        1. 一个宏通常含有多个 顺序关联的操作
      2. 小规模
        1. 操作的数量很小
      3. 使用场景通常受限
        1. office 宏
        2. wow 技能宏

2. 一些操作

  1. 概述
    1. 简单聊聊基本操作

1. 宏的查看

  1. 概述
    1. 查看当前宏的情况

1. 列表查看

  1. 操作

    # 查看
    :reg
    # 退出查看
    键盘上任意键即可
  2. reg

    1. 寄存器

      1. 可以理解位 vim 的剪贴板
      2. 但实际上, 它的功能还挺强大...
      3. 这个我后面再说吧
      1. 名称

        1. "a 开始, "z 结束都是宏
          1. 后文简称 宏a 到 宏z
            1. 这里不区分 大小写
            2. 最多只能有 26 个宏
        2. 其他的内容, 以后再讲
      2. 存在

        1. 已经录制的宏, 是可以在列表里查看到的
        2. 没有录制的宏, 是不会显示的
        3. 同一个用户下, 不同的 vim 窗口, 宏是可以共享的
          1. 存在 ~/.viminfo 里
          2. 不建议直接修改这个文件

2. 单独查看

  1. 命令

    : reg a
  2. 结果

    1. 如果存在, 则只显示 宏a
    2. 如果不存在, 则宏内容显示位空

2. 宏的录制

  1. 概述

    1. 宏的录制
      1. 当然最开始是没有宏的
      2. 所以查看不到的话, 自己录制一个就行了
  2. 准备

    1. 文本

      1
      2
      3
      4
      5
    2. 思路

      1. 给每一行的数值 +1
      2. 我想把这个宏, 录制到 宏a 里
    3. 操作

      1. 定位到 第一行 行首
      2. 使用 ctrl + a, 给数值 +1
      3. 将光标移到第二行行首
    4. 其他

      1. vim 处于 标准模式
  3. 录制步骤

    1. 定位到 第一行 行首

    2. 键盘依次输入

      # 成功后, 左下角会有状态变化
      # 显示 记录中/Recoding @a
      q
      a
    3. 使用 ctrl + a, 给数值 +1

    4. 将光标移到第二行行首

    5. 键盘输入

      # 右下角提示消逝, 录制结束
      q
  4. 查看

    1. 命令

      1. 用 :reg 查看
    2. 结果

      1. 能找到如下记录

        "a   ^Aj
  5. 疑问

    1. 问题1: 进入后, 按 q 退出, 那我要是需要按 q 了, 怎么办呢?

      1. 解答
        1. 标准模式下, q 只有 开始/结束 录制的功能
        2. 插入模式里, 输入 q 不会导致 录制退出
    2. 问题2: 26 个宏如果用完了, 还想再加怎么办

      1. 解答
        1. 26 个宏, 通常是够用的
        2. 如果还需要加, 只有覆盖之前用过的位置了
        3. 所以, 录制之前一定要先确定好, 不要让之前辛苦录制的宏, 被莫名其妙的覆盖了...
    3. 问题3: 这个录制能暂停吗?

      1. 我不知道...
    4. 问题4: 录制宏的时候, 可以使用别的宏吗?

      1. 解答
        1. 我试了试, 目前来看 VIM 并没有禁止这种 疑似套娃 的行为
          1. 或者说, 宏是可以相互调用的吧...
            1. 没试过自制死循环...
          2. 甚至可以专门定义一个宏, 来按顺序执行一个 或者 多个 其他宏

3. 宏的使用 - 简单

  1. 概述

    1. 宏的简单使用
  2. 目的

    1. 让第二行的数字, 也加上个1
      1. 当然是用宏操作, 而不是再来一次
  3. 确认

    1. reg 里宏, 就是我们想要的内容
  4. 操作

    1. 定位到 第二行 行首

    2. 依次输入

      @
      a
  5. 结果

    1. 第二行数字变成了 3
    2. 光标移动到了 第三行
  6. 疑问

    1. 问题1: 后面还有三个数, 我一个一下一下 @a 也不轻松啊
      1. 解答
        1. @@ 可以重复执行之前执行过的宏
        2. 可以有办法一次多行执行多次

4. 宏的使用 - 进阶

  1. 概述
    1. 宏的一些 进阶用法
      1. 其实这些进阶, 也没进多少, 先凑合用吧

1. 多次执行

  1. 概述

    1. 尝试多次执行同一个宏
  2. 目的

    1. 将 3 到 5 行的数字都加一
  3. 操作

    1. 光标定位到 第三行

    2. 依次输入内容

      # 用 @@ 也是可以的
      3
      @
      a
  4. 结果

    1. 宏执行了 3 次
    2. 后面的三行, 都加了1
  5. 问题

    1. 问题1: 这种手操, 感觉也是有局限性的
      1. 解答
        1. 我也是这么觉得
        2. 但是 VIM 肯定不会让你失望的

2. EX 命令行: normal

  1. 概述

    1. EX 命令行执行操作的示例
  2. 操作1: 指定单行

    1. 命令

      # 假设我们想让 当前行 执行这个宏
      : normal @a
      # 假设我们想让 第4行 执行这个宏
      :4 normal @a
      # 结果我就略了
    2. 解释

      1. normal
        1. 在 EX 命令行关键字
        2. normal 后面的内容, 会被翻译为 标准模式 下的 指令
  3. 操作2: 多行执行

    1. 命令

      # 我想让 1 到 4 行执行这个宏
      : 1,4 normal @a
      # 结果我就略了
  4. 操作3: 匹配执行

    1. 命令

      # 假设想要匹配某个 4 执行宏
      # ex 的全局匹配, 本来应该先讲的, 以后补上
      # 匹配到后, 光标会自动停在 4 的前面
      # 感觉这个是一个很实用的操作了
      : g/4/ normal @a

3. v 模式 与 EX 命令

  1. 概述

    1. v 模式下的 EX 命令
  2. 操作1: v 模式下执行

    1. 操作
      1. 进入 v 模式

      2. 选定多行

      3. 进入 EX 命令行

      4. 命令

        # ‘<,‘> 是 v 模式下自带的, 没有问题
        ‘<,‘> normal @a
        # 结果我就略了

4. 问题

  1. 问题1: 宏可以编辑吗
    1. 解答
      1. 可以的

5. 宏的追加

  1. 概述

    1. 宏的追加
  2. 命令

    # 对 宏a 追加
    q + A
    # 没错, 是 大写的A
    # 输入追加操作
    # q 退出
  3. 问题

    1. 问题1: 这种编辑, 感觉还是有局限性
      1. 解答
        1. 确实, 只能通过 标准模式 下的操作, 来执行
        2. 如果中间或者前面出现了问题, 又得重来
        3. 办法还是有的

6. 宏的导入导出

  1. 概述

    1. 宏的 导入 和 导出
  2. 准备

    1. 建议把光标移动到文件的最低端
    2. 新建一个空行
    3. 光标停留在空行, 并切回 标准模式

1. reg

  1. 概述

    1. 本质是 剪贴板 的操作
    2. 推荐这种
  2. 导出

    # 导出 宏a
    "ap
  3. 导入

    # 光标放在行首
    "ay$

2. EX 命令

  1. 概述

    1. 使用 ex 命令行
  2. 导出

    # 导出 宏a
    # 注意留意光标位置, 会额外生成一个 空行
    put a
  3. 导入

    # 有个坑, 就是 ctrl 直接复制过去, 会变成 ^, 无法生效
    # 手动按会生效, 但是感觉这没啥意义...
    let @a="<宏内容>"
    # 但是如果这条路走通了, 就可以利用 vimrc 了

3. 后续

  1. EX 命令里的 reg

    1. 这玩意我之前没用过...
  2. 通过 vimrc 可以将我们常用的宏, 导入到 vim 中

    1. 一上来就能直接用了...
      1. 当然那个 Ctrl 的转义, 我至今没搞明白
    2. 想想就带感, 但是我觉得自己还得努力找找...

ps

  1. ref

    1. 百度百科 - 宏
    2. VIM中的寄存器简介
      1. reg 的简介, 有空看看
    3. vim 录制宏,自动循环执行组合操作
    4. vim 教程网
      1. 一个 vim 的教程网
        1. 我从知乎上找进去的
        2. 好像是个妹子独立维护
          1. vimtutor
          2. 不愧是北航的学生, 学渣给跪了...
    5. Vim寄存器与宏常用命令汇总
      1. 讲得不错
      2. 原文不在了, 只有贴转载了...
  2. 后续

    1. :reg

      1. 一个强大的剪贴板
    2. :normal

      1. 这么看来的话, EX 命令行应该是可以做 vim 里几乎所有的很多操作了
        1. 这么说的话, 脚本化这个东西, 应该会带来很大的便利
    3. map/nmap

      1. 这是什么玩意

vim

相关推荐