如何在Vim的可视块模式下使用正常模式CTRL-A数字递增?

8

我有一个表格:

0 | 3
1 | 4
2 | 5

在正常模式下,我可以将光标移到数字 0 上,按下 CTRL-A,它就会变成 1。
我希望在可视块模式下也有类似的功能(在该模式下,CTRL-A 不会增加选择),以便在第二列上使用它,并获得如下结果:
0 | 4
1 | 5
2 | 6

没有宏/插件/定义功能,是否有可能实现这一点?

到目前为止,最好的简单解决方法是定义一个宏,计算列数,并将其重复正确次数,但我一直在想:为什么没有可视块的 CTRL-A

我的初始示例是:

a | 3
b | 4
c | 5

对于表格中数字行的第一个数字,@hawk和@romainl给出的答案很好::norm! ^A,它扩展为:'<,'>norm! ^A。有没有一种方法可以处理一般情况?


请看我的编辑,这是一个更通用的解决方案。 - romainl
数字可以在光标处或光标右侧(在同一行)出现。这些是 Vim 的默认设置。 - hawk
你试过我提出的解决方案了吗? - romainl
@romainl 谢谢,这个方法很有效,并且让我学到了一些关于 Vim 正则表达式的新知识 =) - Ciro Santilli OurBigBook.com
看我的编辑,有一个更好的解决方案。 - romainl
3个回答

11

这是在8版中新增的功能。请查看::help new-items-8

编辑:已更改上述帮助命令。

:help new-items-8的结果。

Visual mode commands:
v_CTRL-A        CTRL-A          add N to number in highlighted text
v_CTRL-X        CTRL-X          subtract N from number in highlighted text
v_g_CTRL-A      g CTRL-A        add N to number in highlighted text
v_g_CTRL-X      g CTRL-X        subtract N from number in highlighted text

1
你能否添加一个链接到提交/发布说明来完善答案?我已经测试过了,它确实有效。 - Ciro Santilli OurBigBook.com
修改了我的回答 - Ankit Jain

8

我怀疑这里没有人能够准确地告诉你为什么在可视块模式下没有 <C-a>

我们能做的最好的事情就是帮助你找到实现目标的高效方法。

像 DrChip 的 VisIncr 或 Tim Pope 的 speeddating 这样的插件专门设计来解决这个“缺失”的功能。

如果您的需求相对简单,就像您的例子一样,一个简单的 :norm <C-v><C-a> 可能已经足够了。也许还需要映射...

xnoremap <C-a> :normal! ^A

^A 可以通过 <C-v><C-a> 获取。)
(编辑)
(存在一种更通用的方法,但不太方便使用手指:)
:'<,'>s/\%V\d\+/\=submatch(0) + 1/g

你当然可以将其映射并使其更智能一些:
xnoremap <C-a> :<C-u>let vcount = v:count ? v:count : 1 <bar> '<,'>s/\%V\d\+/\=submatch(0) + vcount <cr>gv

并给它一个朋友:

xnoremap <C-x> :<C-u>let vcount = v:count ? v:count : 1 <bar> '<,'>s/\%V\d\+/\=submatch(0) - vcount <cr>gv

使用这些映射,您可以在保留可视块或8<C-a>/12<C-x>的情况下执行<C-a><C-a><C-a><C-x><C-x><C-x>

你可以使用 v:count1 替代 v:count ? v:count : 1,以便在没有计数时获得 1。 - Yous
据我所知,在 Vim 7.4 中,Visual 模式下的 ctrl-a 是可用的。 - contrebis
@contrebis,是的,没错。 - romainl

2
你可以在选中的文本块上运行普通命令,例如:normal! ^A,然后按回车键。

这种修复只对数字列的第一行起作用,但我希望有一种更通用的解决方案,因此我更新了问题来反映这一点。 - Ciro Santilli OurBigBook.com

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接