有时我需要写下整个字母表abcd…z
,我讨厌在 Vim 的插入模式下一个字母一个字母地输入。是否有任何方法可以更有效地做到这一点?
我知道该ga
命令为我提供光标所在字符的 ascii 代码……但不知道如何将它与我的标准解决方案混合以键入从 1 到(例如)5000 的数字:a1ESCqqyyp^Aq4998@q
……</p >
使用set nrformats+=alpha
:
ia<Esc>qqylp<C-a>q24@q
一步步:
ia<Esc> " Start with 'a'
qqylp<C-a>q " @q will duplicate the last character and increment it
24@q " Append c..z
如果你的 shell 做了大括号扩展,这是一个非常优雅的解决方案:
:r !printf '\%s' {a..z}
:read!
将外部命令的输出读入当前缓冲区。printf
在这种情况下,它会在 shell扩展{a..z}
后读取 shell 的输出。
这个命令怎么样:
:put =join(map(range(char2nr('a'),char2nr('z')),'nr2char(v:val)'),'')
a
收集从到范围内字符的 ASCII 值z
,然后将它们映射到nr2char()
函数上,并将结果插入到当前缓冲区中:put =
。
当你省略封闭的join(
…时,,'')
你会得到一个单独的行中的字符。
看
:h nr2char()
,:h char2nr()
,:h :put
,range()
,map()
和join()
朋友。list-functions
首先,set nrformats+=alpha
。
然后:
ia<ESC>Y25p<CTRL-V>}g<CTRL-A>k26gJ
意思是:
ia
插入首字母a
Y25p
拉出a
并在 25 行上复制它<CTRL-V>
进入视觉块模式}
转到当前段落末尾的最后一个字符g<CTRL-A>
逐渐增加每个字母字符(参见help v_g_CTRL-A
)k
上一行26gJ
在不插入或删除任何空格的情况下加入 26 行这导致:
abcdefghijklmnopqrstuvwxyz
我在解决http://www.vimgolf.com/challenges/5ebe8a63d8085e000c2f5bd5时找到了一个更短的解决方案(您不需要事先更改 nrformats)
iabcdefghijklm<Esc>yiwg??P
意思是:
iabcdefghijklm<Esc>
插入字母表的前半部分yiw
复制它g??
ROT13 编码(移位 13 个字母)得到后半部分P
粘贴前半部分