有时我需要写下整个字母表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插入首字母aY25p拉出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粘贴前半部分