Vim 正常模式命令使用变量值

3

我需要完成以下操作:

  • 将变量temp设为某个值(比如100)。
  • 前往某处,为temp范围内的行数中的数字增加temp的值。
  • temp更新为+100。
  • 重复执行。

我首先使用let temp=100将值100赋给了temp。

然后我想出了以下可应用于一行的ex命令::execute "normal! ". temp. "^A" 这将使用temp并增加当前行的数字temp

不幸的是,当我选择一系列行并按:将命令应用于所有选定的行时,这种方法就失效了。

那么我该如何在一系列行上实现相同的效果呢?

以下是一个示例:

1
2
3
4
5

Should become

101
102
103
104
105

然后我将更新let temp=temp + 100,并重复进行下一块,以此类推。

谢谢!


在这种情况下,你可以在可视块模式下简单地添加 10。但我猜你也有大于9的数字吧? - mkrieger1
是的,它们每组有100个,而且至少有25个这样的组。 - Phrixus
@John,在这个情况下,你可能会发现我的答案很有趣,但是总的来说。 - Enlico
3个回答

5
回答你的问题,:help :execute 之所以阻止你是因为两个原因:
  • :execute 不接受范围参数,
  • :execute 不是必需的。
以下命令不需要使用 :execute 就可以完成任务:
:[range]normal! <C-r>=temp<CR><C-v><C-a><CR>

分解:

  • [range]指的是在可视选择后使用'<,'>
  • :help :normal在普通模式下执行给定的宏。
  • :help c_ctrl-r在命令行中插入给定寄存器的内容。
  • :help "=是表达式寄存器,返回一个评估后的表达式。
  • temp是要评估的表达式,所以<C-r>=temp<CR>会插入变量temp的内容。
  • <C-v><C-a>插入一个文本字符^A
  • <CR>执行命令。

但这需要输入很多内容,因此在这种情况下更适合使用简单的映射:

xnoremap <expr> <key> temp . '<C-a>'

说明:

  • :help :xnoremap创建一个可视模式映射。
  • :help <expr>使其成为表达式映射,在运行时评估实际的RHS。
  • <key>是您想要按下的按键。
  • temp . '<C-a>'是您的表达式,它将当前temp值与<C-a>连接起来以获得100<C-a>200<C-a>等。

用法:

  1. Set temp to the desired value:

    :let temp = 100
    
  2. Select some lines:

    v<motion>
    
  3. Increment the first number of each line:

    <key>
    
  4. Change the value of temp:

    :let temp += 100
    
  5. Move to next block and select some lines:

    <motion>
    v<motion>
    
  6. Increment the first number of each line:

    <key>
    
然而,手动方式将会像这样进行:
v<motion>    " visually select the desired lines
100<C-a>     " increment the first number on each line by 100

然后:
<motion>
v<motion>
200<C-a>     " increment the first number on each line by 200

等等,所以我不确定在这里引入变量、:normal等的好处是什么。


2
我刚刚找到了一个解决方法,如果没有更好的方法的话。
我录制了一个宏 b 来运行 execute "normal! " . temp . "^A" 命令在当前行上。然后录制另一个宏 a,它将去选择感兴趣的组中的所有行,并运行 :'<,'>norm @b 命令来应用该操作于每一行,然后在结束宏 @a 之前,我还设置了 let temp=temp+100

0

我认为我们可以使用全局命令来完成这项工作,它接受范围。

:'<,'>g/./execute "normal! ". temp. "^A"

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