Henry Henry
  • JavaScript
  • TypeScript
  • Vue
  • ElementUI
  • React
  • HTML
  • CSS
  • 技术文档
  • GitHub 技巧
  • Nodejs
  • Chrome
  • VSCode
  • Other
  • Mac
  • Windows
  • Linux
  • Vim
  • VSCode
  • Chrome
  • iTerm
  • Mac
  • Obsidian
  • lazygit
  • Vim 技巧
  • 分类
  • 标签
  • 归档
  • 网站
  • 资源
  • Vue 资源
GitHub (opens new window)

Henry

小学生中的前端大佬
  • JavaScript
  • TypeScript
  • Vue
  • ElementUI
  • React
  • HTML
  • CSS
  • 技术文档
  • GitHub 技巧
  • Nodejs
  • Chrome
  • VSCode
  • Other
  • Mac
  • Windows
  • Linux
  • Vim
  • VSCode
  • Chrome
  • iTerm
  • Mac
  • Obsidian
  • lazygit
  • Vim 技巧
  • 分类
  • 标签
  • 归档
  • 网站
  • 资源
  • Vue 资源
GitHub (opens new window)
  • 说明
  • Vim

  • VSCode

  • Chrome

  • iTerm

  • mac

  • Obsidian

  • lazygit

  • 学习双拼
  • Vim 技巧

    • Vim 技巧 - 说明
    • Vim 技巧 - 以退为进
    • Vim 技巧 - 点范式
    • Vim 技巧 - 把撤销单元切成块
    • Vim 技巧 - 构造可重复的修改
    • Vim 技巧 - 用次数做简单的算术运算
      • 简单加减
      • 数字的格式
      • 批量自增自减
      • vscode 插件 increment-and-decrement
    • Vim 技巧 - 能够重复,就别用次数
    • Vim 技巧 - 在插入模式中可即时更正错误
    • Vim 技巧 - 结识插入 - 普通模式
    • Vim 技巧 - 不离开插入模式,粘贴寄存器中的文本
    • Vim 技巧 - 重复执行面向行的可视命令
    • Vim 技巧 - 只要可能,最好用操作符命令,而不是可视命令
    • Vim 技巧 - 结识 Vim 的命令行模式
    • Vim 技巧 - 在一行或多个连续行上执行命令
    • Vim 技巧 - 使用‘:t’和‘:m’命令复制和移动行
    • Vim 技巧 - 在指定范围上执行普通模式命令
    • Vim 技巧 - 重复上次的 Ex 命令
    • Vim 技巧 - 把当前单词插入到命令行
    • Vim 技巧 - 回溯历史命令
    • Vim 技巧 - 运行 Shell 命令
    • Vim 技巧 - 将工作区切分成窗
    • Vim 技巧 - 区分实际行与屏幕行
    • Vim 技巧 - 通过查找进行移动
    • Vim 技巧 - 遍历改变列表
    • Vim 技巧 - 用无名寄存器实现删除、复制与粘贴操作
    • Vim 技巧 - 深入理解 Vim 寄存器
    • Vim 技巧 - 用寄存器中的内容替换高亮选区的文本
    • Vim 技巧 - 把寄存器的内容粘贴出来
    • Vim 技巧 - 宏的读取与执行
    • Vim 技巧 - 规范光标位置、直达目标以及中止宏
    • Vim 技巧 - 加次数回放宏
    • Vim 技巧 - 在连续的文本行上重复修改
    • Vim 技巧 - 给宏追加命令
    • Vim 技巧 - 编辑宏的内容
    • Vim 技巧 - 调整查找模式的大小写敏感性
    • Vim 技巧 - 查找使用 v 或 V 模式
    • Vim 技巧 - 界定单词的边界
    • Vim 技巧 - 转义问题字符
    • Vim 技巧 - 结识查找命令
    • Vim 技巧 - 在执行查找前预览第一处匹配
    • Vim 技巧 - 将光标偏移到查找匹配的结尾
    • Vim 技巧 - 利用查找历史,迭代完成复杂的模式
    • Vim 技巧 - 结识 substitute 命令
    • Vim 技巧 - 在文件范围内查找并替换每一处匹配
    • Vim 技巧 - 手动控制每一次替换操作
    • Vim 技巧 - 重用上次的查找模式
    • Vim 技巧 - 用寄存器的内容替换
    • Vim 技巧 - 重复上一次 substitute 命令
    • Vim 技巧 - 使用子匹配重排 CSV 文件的字段
    • Vim 技巧 - 自动补全整行文本
    • Vim 技巧 - 以 g 开头的命令
    • Vim 技巧 - 以 z 开头的命令
    • Vim 技巧-ctrl 命令
    • Vim 技巧
    • 每日一 Vim 笔记
  • 键盘侠
  • Vim 技巧
Henry
2022-08-31
目录

Vim 技巧 - 用次数做简单的算术运算

大多数普通模式命令可以在执行时指定次数,我们可以利用这个功能来做简单的算术运算。

很多普通模式命令都可以带一个次数前缀,这样 Vim 就会尝试把该命令执行指定的次数,而不是只执行一次

# 简单加减

<C-a> 和 <C-x> 命令分别对数字执行加和减操作。在不带次数执行时,它们会逐个加减,但如果带一个次数前缀,那么就可以用它们加减任意整数。例如,如果我们把光标移到字符 5 上,执行 10<C-a> 就会把它变成 15。

但是如果光标不在数字上会发生什么?文档里说,<C-a> 命令会“把当前光标之上或之后的数值加上 [count]”。因此,如果光标不在数字上,那么 <C-a> 命令将在当前行正向查找一个数字,如果找到了,它就径直跳到那里。我们可以利用这一点简化操作。

下面是一段 CSS 片段:

我们要复制最后一行并且对其做两个小改动,即用“news”替换单词“blog”,以及把“0px”改为“-180px”。我们可以运行 yyp 来复制此行,然后用 cw 来修改第一个单词。但我们该怎么处理那个数值呢?

一种做法是用 f0 跳到此数字,然后进入插入模式手动修改它的值,即 i-18<Esc>。不过,运行 180<C-x> 则要快得多。由于我们的光标不在要操作的数字上,所以该命令会正向跳到所找到的第一个数字上,从而省去了手动移光标的步骤。让我们看看整个操作过程

在本例中,我们只复制了一行并做出改动。但是,假设你要复制 10 份,并对后续数字依次减 180。如果要切换到插入模式去修改每个数字,我们每次都得输入不同的内容(-180,然后 -360,以此类推)。但是如果用 180<C-x> 命令的话,对后续行也可以采用相同的操作过程。我们甚至还可以把这组按键操作录制成一个宏,然后根据需要执行多次。

# 数字的格式

007 的后面是什么?不,这不是詹姆斯·邦德的恶作剧,我是在问:如果对 007 加 1,你觉得会得到什么结果。

如果你的答案是 008,那么当你尝试对任意以 0 开头的数字使用 <C-a> 命令时,也许会感到诧异。像在某些编程语言中的约定一样,Vim 把以 0 开头的数字解释为八进制值,而不是十进制。在八进制体系中,007 + 001 = 010,看起来像是十进制中的 10,但实际上它是八进制中的 8,糊涂了吗?

如果你经常使用八进制,Vim 的缺省行为或许会适合你。如果不是这样,那么你可能想把下面这行加入你的 vimrc 里:

set nrformats=
1

这会让 Vim 把所有数字都当成十进制,不管它们是不是以 0 开头的。

而 VSCodeVim 目前还不支持此设置,详见:<C-a> increment does not work at 07 · Issue #6693 · VSCodeVim/Vim (opens new window)

# 批量自增自减

假如要生成如下的字符,该怎么办呢?

index: 1
index: 2
...
index: 10
1
2
3
4

我们可以这样做:

先生成一个基础模板:

index: 0
1

然后使用 yy9p 复制粘贴 9 次

index: 0
index: 0
index: 0
index: 0
index: 0
index: 0
index: 0
index: 0
index: 0
index: 0
1
2
3
4
5
6
7
8
9
10

然后将光标放在首行的 0 上,使用 <C-v> 进入 visual block model, 使用 9j 选中到第十行,最后使用 g<C-a> 完成自增

index: 1
index: 2
index: 3
index: 4
index: 5
index: 6
index: 7
index: 8
index: 9
index: 10
1
2
3
4
5
6
7
8
9
10

自减类似

# vscode 插件 increment-and-decrement

使用 Incrementor - Visual Studio Marketplace (opens new window) 这个插件可以实现类似的功能

数字增减就不说了,这个扩展还增加了 enums 枚举,比如 true 和 false 互转,let 和 const 互转等,也可以自定义

但转换以后,默认进入选择模式了,我们需要再按一下 <Esc>

所以我们需要在插件执行完转换后再调用一下 <Esc>

// increment-and-decrement
{
  "before": ["<Leader>", "a"],
  "commands": [
    "incrementor.incrementByOne",
    {
      "command": "vim.remap",
      "args": {
        "after": ["<Esc>"]
      }
    }
  ]
},
{
  "before": ["<Leader>", "x"],
  "commands": [
    "incrementor.decrementByOne",
    {
      "command": "vim.remap",
      "args": {
        "after": ["<Esc>"]
      }
    }
  ]
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
编辑 (opens new window)
#Vim
上次更新: 5/27/2023, 1:02:05 PM
Vim 技巧 - 构造可重复的修改
Vim 技巧 - 能够重复,就别用次数

← Vim 技巧 - 构造可重复的修改 Vim 技巧 - 能够重复,就别用次数→

最近更新
01
version 1.15
07-01
02
version 1.14
06-27
03
version 1.13
06-27
更多文章>
Theme by Vdoing | Copyright © 2017-2023 HenryTSZ | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式