使用变量值的 Vim 普通命令

Joh*_*ohn 3 vim

我需要执行以下操作:

  • 将变量设置temp为某个值(比如 100)。
  • 去某个地方temp 为一系列行增加一个数字。
  • 更新temp为+100。
  • 重复

我首先使用 将值 100 设置为 temp let temp=100

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

不幸的是,当我在视觉上选择一系列行然后点击:将命令应用于所有选定的行时,这将不起作用。

除了一系列线之外,我如何才能实现相同的目标?

下面是一个例子:

1
2
3
4
5
Run Code Online (Sandbox Code Playgroud)

应该成为

101
102
103
104
105
Run Code Online (Sandbox Code Playgroud)

然后我将更新 templet temp=temp + 100并重复下一个块等等。

谢谢!

rom*_*inl 5

直接回答你的问题,:help :execute是什么阻碍了你,原因有两个:

  • :execute 不接受范围,
  • :execute 没有必要开始。

以下命令无需:execute:

:[range]normal! <C-r>=temp<CR><C-v><C-a><CR>
Run Code Online (Sandbox Code Playgroud)

分解:

  • [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>'
Run Code Online (Sandbox Code Playgroud)

分解:

  • :help :xnoremap 创建视觉模式映射。
  • :help <expr>使其成为表达式映射,其中在运行时评估实际 RHS 。
  • <key> 是你想按什么键。
  • temp . '<C-a>'是你的表达,它串接的电流值temp<C-a>获得100<C-a>200<C-a>等等。

用法:

  1. 设置temp为所需的值:

    :let temp = 100
    
    Run Code Online (Sandbox Code Playgroud)
  2. 选择几行:

    v<motion>
    
    Run Code Online (Sandbox Code Playgroud)
  3. 增加每一行的第一个数字:

    <key>
    
    Run Code Online (Sandbox Code Playgroud)
  4. 更改 的值temp

    :let temp += 100
    
    Run Code Online (Sandbox Code Playgroud)
  5. 移动到下一个块并选择一些行:

    <motion>
    v<motion>
    
    Run Code Online (Sandbox Code Playgroud)
  6. 增加每一行的第一个数字:

    <key>
    
    Run Code Online (Sandbox Code Playgroud)

但是,手动方式将是这样的:

v<motion>    " visually select the desired lines
100<C-a>     " increment the first number on each line by 100
Run Code Online (Sandbox Code Playgroud)

然后:

<motion>
v<motion>
200<C-a>     " increment the first number on each line by 200
Run Code Online (Sandbox Code Playgroud)

等等......所以我不确定:normal在这里引入变量等有什么好处。