18

有时我需要写下整个字母表abcd…z,我讨厌在 Vim 的插入模式下一个字母一个字母地输入。是否有任何方法可以更有效地做到这一点?

我知道该ga命令为我提供光标所在字符的 ascii 代码……但不知道如何将它与我的标准解决方案混合以键入从 1 到(例如)5000 的数字:a1ESCqqyyp^Aq4998@q……</p >

4

6 回答 6

30

使用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
于 2013-08-07T17:32:16.630 回答
14

如果你的 shell 做了大括号扩展,这是一个非常优雅的解决方案:

:r !printf '\%s' {a..z}

:read!将外部命令的输出读入当前缓冲区。printf在这种情况下,它会在 shell扩展{a..z}后读取 shell 的输出。

于 2013-08-07T18:13:12.477 回答
7

这个命令怎么样:

:put =join(map(range(char2nr('a'),char2nr('z')),'nr2char(v:val)'),'')

a收集从到范围内字符的 ASCII 值z,然后将它们映射到nr2char()函数上,并将结果插入到当前缓冲区中:put =

当你省略封闭的join(…时,,'')你会得到一个单独的行中的字符。

于 2013-08-07T17:28:12.087 回答
3

首先,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
于 2018-07-22T09:23:19.160 回答
1

我在解决http://www.vimgolf.com/challenges/5ebe8a63d8085e000c2f5bd5时找到了一个更短的解决方案(您不需要事先更改 nrformats)

iabcdefghijklm<Esc>yiwg??P

意思是:

  • iabcdefghijklm<Esc>插入字母表的前半部分
  • yiw复制它
  • g??ROT13 编码(移位 13 个字母)得到后半部分
  • P粘贴前半部分
于 2020-05-15T14:07:29.813 回答
0

你可以尝试使用Vim 缩写或像UltiSnips这样成熟的片段管理器插件。设置可能需要一些时间,并且您必须再次键入该字母表才能将其定义为缩写词或片段,但之后您就可以插入字母表或任何其他常见的文本块更容易。

于 2013-08-09T16:41:00.157 回答