Vim可以写增量行吗?即在每行A变成B,而1变成2


8

我想这样写:

A = mapping[0]
B = mapping[1]
C = mapping[2]
D = mapping[3]
E = mapping[4]
F = mapping[5]
G = mapping[6]
H = mapping[7]
I = mapping[8]
J = mapping[9]
K = mapping[10]
L = mapping[11]
M = mapping[12]
N = mapping[13]
O = mapping[14]
P = mapping[15]
Q = mapping[16]
R = mapping[17]
S = mapping[18]
T = mapping[19]
U = mapping[20]
V = mapping[21]
W = mapping[22]
X = mapping[23]
Y = mapping[24]
Z = mapping[25]

我最终使用了LibreCalc,将不同的部分放在不同的单元格中,添加字母和数字,合并结果,然后将很多内容粘贴回Vim。

我很欣赏我想写的是糟糕的代码。目前,我正在研究Python,并一直在努力避免自己查找信息,我知道该信息将在我所关注的课程的后面部分介绍(http://interactivepython.org/)。

我知道在vim中执行此操作的最快方法是键入类似

A = mapping[0] <ESC> hh <CTRL>+<V> BBh y $ o B <ESC> y 1] <CR>

我知道vim非常强大(我已经使用了几周,真的很喜欢它)。

可以用一些vim命令写我想要的东西吗?

Answers:


11

尽管可以使用脚本来完成,但是如果您使用的是Vim的最新版本(例如Arch Linux中的版本),则可以使用它g Ctrl-a来增加可视块。在您的情况下:

  1. 编写原始行: A = mapping[0] Esc
  2. 拉线,并在下面放25个副本: yy25p
  3. 视觉上选择包含0char 的列(使用进行块选择,使用Ctrl-v),0从第一行开始排除(因此您最终得到的列包含最后25个零),然后使用递增g Ctrl-a
  4. 对包含的列应用相同的方法A

:如注释所示,为了增加字母,需要添加alpha一个nrformats选项,例如:set nrformats+=alpha.my vimrc具有:set nrformats=hex,alpha,因此禁用八进制和二进制增量,我不使用)


yy不是为我工作。我从www.vimcheatsheet.com上打印的备忘单上可以看到,这是一个非常标准的命令。vim --version返回以下内容:pastebin.com/DcFxZh1S。我必须研究为什么它对我不起作用...(我已经在视觉命令和插入模式下尝试过)。同样,当我粘贴时,它们全部出现在同一行上。但是我已经尝试了g Ctrl-a,它确实满足了我的要求,谢谢:)
Duncan Betts 2016年

1
:verbose map y应该向您显示以您开始的映射y以及它们的设置位置。但是您必须yy在正常模式下使用。
VanLaser


1
什么版本的vim将递增ABCtrl-a行动?我的肯定没有,我在继续7.4 1-1202
科里·克莱因

4
@CoryKlein尝试输入:set nrformats+=alpha。它将值添加alpha到该选项,'nrformats'并且应允许Ctrl-a“递增”字母字符。如果您喜欢这种行为,可以将其添加到vimrc中。否则,您可以使用运算符+=将其添加到选项中,然后再使用运算符-=:set nrformats-=alpha)将其删除。
saginaw '16

6

我更喜欢@VanLaser使用的视觉增量解决方案(请参阅参考资料:h v_CTRL-A)。但是,我将展示这也可以通过宏来完成。

从...开始:

A = mapping[0]

将以下按键记录到您选择的宏中(例如q):

yyp:set nrformats+=alpha<cr><c-a>:set nrformats-=alpha<c-a>

这将复制该行,然后递增第一个字符(例如A),然后递增数字部分。运行此宏24次,您已完成操作,例如24@q

  • qq -开始记录到寄存器 q
  • yyp -复制行
  • :set nrformats+=alpha<cr>- 'nrformats没有alpha默认
  • <c-a>-现在alpha我们可以增加字母
  • :set nrformats-=alpha<cr>- alpha'nrformats'
  • <c-a> -增加下一个数字
  • q -停止录音
  • 24@q-在寄存器中重播宏q24次

有关更多帮助,请参见:

:h q
:h @
:h yy
:h p
:h 'nrformats'
:h :set
:h CTRL-A
:h v_CTRL-A

好人:) 25?
VanLaser

1
@VanLaser:1(首发)+ 1(录制宏)+ 24 = 26
彼得Rincker

4

已经提供了很好的答案,我不会想到会做的很好。我本来可以在一行上输入所有字母,然后用表达式替换(使用行号作为增量号)引入文本和换行符,例如

iABCDEFGHIJKLMNOPQRSTUVXYZ<Esc>:s/./\=submatch(0)." = mapping[".line('.')."]\n"/g

很酷 !(+1)
JJoao '16

2

在执行此类操作时,几乎总是选择使用:substituteover宏。特别是从一开始\=就可以评估替换表达式的能力,这使得它成为可能(请参阅参考资料:h sub-replace-special)。

一旦有空行(25i<Enter><Esc>),就可以使用命令

:1,26s/^/\=nr2char(line('.')+64) . ' = mapping[' . (line('.')-1) . ']'

使用'.'函数返回的当前行(参数)数字line()并使用nr2char()将十进制数转换为ASCII等效值(65 = A),生成必要的序列。必要的字符串使用.


1

您可以随时尝试使用操作系统...

:r ! perl -E 'for(A..Z){say "$_ = mapping[", ord($_)-64 ,"]"}'

1
Perl不在操作系统中。
dash-tom-bang
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.