我一路向上(或者向下,如果你愿意的话(达到了《记住FizzBuzz吗?在VimGolf,但我很难解释解决方案:
33o<CR> Fizz<CR><C-H><Esc><C-V>A4k<C-H>.@.<C-U>Buzz<Esc>@.<C-V>GI0<Esc>gvg<C-A>ZZ
我了解
添加带有"Fizz"–
33o<CR> Fizz<CR><C-H><Esc>
–加上前面行号的末尾–<C-V>GI0<Esc>gvg<C-A>ZZ
但我不了解
中间部分;嗡嗡声";添加行,即
<C-V>A4k<C-H>.@.<C-U>Buzz<Esc>@.
。4k<C-H>
将光标移动到正确的位置,最后一个@.
执行.
寄存器的内容,但这是我所能理解的。
有人能解释一下这里使用的Vim魔法吗?🧙♂️
第一部分:
33o<CR> Fizz<CR><C-H><Esc>
将Fizz
放在每一行3的倍数上,解决了FizzBuzz的第一个要求。它完成了33次迭代:
- 跳过空行
- 将CCD_ 9置于下一行
- 打开空线
- 离开插入模式
在第1行之后添加了33个3行的块,因此总共有100行,光标留在第100行。
参见:help o
。
第二部分:
<C-V>A4k<C-H>.@.<C-U>Buzz<Esc>
本质上创建了一个递归宏,将Buzz
附加到5的倍数行中,有助于解决FizzBuzz的第二和第三个需求。
详细信息:
<C-v>A
开始插入第2列,与第1部分的Fizz
s对齐- 插入CCD_ 14
- 执行CCD_ 15以删除CCD_
- 插入CCD_ 17
- 执行CCD_ 18以删除在当前行上插入的所有内容
- 插入CCD_ 19
- 使用CCD_ 20离开插入模式
仅仅在一行中插入Buzz
需要做很多工作,但这部分实际上有三个目的:
- 将CCD_ 22附加到当前行(顺便说一下
- 将其记录为可使用
.
重复的一次编辑 - 将所有这些作为递归宏记录在寄存器CCD_ 24中
寄存器.
中的宏为:
- CCD_ 26向上移动4行
- CCD_ 27将光标向后移动一个字符
.
重复上一次编辑,所以将Buzz
附加到当前行(如果有Fizz
,则得到FizzBuzz
,如果没有,则获得Buzz
(- CCD_ 33在寄存器CCD_
参见:help v_b_A
、:help i_ctrl-u
、:help .
、help ".
、:help @
。
第三部分:
@.
回放上面描述的递归宏,使其上行4行,然后上行4行等等,从而解决FizzBuzz
的第二和第三个要求。
第四部分:
<C-V>GI0<Esc>
在每一行的开头插入一个CCD_ 41。
参见:help v_b_I
。
第五部分:
gvg<C-A>
重新选择最后一个视觉块,然后按顺序递增每个CCD_。
参见:help gv
和:help v_g_ctrl-a
。
第六部分:
ZZ
写入文件并退出Vim。
参见:help ZZ
。