【问题标题】:How to use Vim's normal mode CTRL-A number increment in visual block mode?如何使用 Vim 的普通模式 CTRL-可视块模式下的数字增量?
【发布时间】:2018-04-03 20:16:22
【问题描述】:

我有一张桌子:

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。有没有办法处理一般情况?

【问题讨论】:

  • 查看我的编辑以获得更通用的解决方案。
  • 数字可以在光标处,也可以在光标右侧(在同一行)。这些是 Vim 的默认设置。
  • 您尝试过我提出的解决方案吗?
  • @romainl 谢谢,这对我有用并教会了我关于 Vim 正则表达式的新知识 =)
  • 查看我的编辑以获得更好的解决方案。

标签: vim


【解决方案1】:

这是在版本 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

【讨论】:

  • 您可以添加提交/发布说明的链接以完成答案吗?我已经测试过了,它确实有效。
  • 编辑了我的答案
【解决方案2】:

我怀疑这里的任何人都能够准确地告诉你为什么视觉块模式没有<C-a>

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

DrChip 的 VisIncr 或 Tim Pope 的 speeddating 等插件专门用于解决“缺失的功能”。

如果您的需求相对简单,例如您的示例,一个简单的:norm <C-v><C-a> 就足够了。也许有一个映射......

xnoremap <C-a> :normal! ^A

^A 是通过&lt;C-v&gt;&lt;C-a&gt; 获得的。)

(编辑)

存在一种更通用的方法,但对手指不太友好:

:'<,'>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&lt;C-a&gt;/12&lt;C-x&gt; 的同时执行 &lt;C-a&gt;&lt;C-a&gt;&lt;C-a&gt;&lt;C-x&gt;&lt;C-x&gt;&lt;C-x&gt;

(结束)

【讨论】:

  • 不使用计数时,可以使用v:count1代替v:count ? v:count : 1得到1。
  • 据我所知,可视模式下的 ctrl-a 在 vi​​m 7.4 中。
  • @contrebis,是的。
【解决方案3】:

您可以在视觉选择的块上运行普通命令。例如:normal! ^A 然后回车

【讨论】:

  • 此修复仅在数字是列的第一个数字行时才有效,但我希望有一个更通用的解决方案,因此我更新了问题以反映这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-06
  • 2011-11-03
  • 1970-01-01
  • 2020-05-28
  • 2012-05-21
  • 1970-01-01
相关资源
最近更新 更多