我需要执行以下操作:
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
并重复下一个块等等。
谢谢!
直接回答你的问题,: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>
等等。用法:
设置temp
为所需的值:
:let temp = 100
Run Code Online (Sandbox Code Playgroud)
选择几行:
v<motion>
Run Code Online (Sandbox Code Playgroud)
增加每一行的第一个数字:
<key>
Run Code Online (Sandbox Code Playgroud)
更改 的值temp
:
:let temp += 100
Run Code Online (Sandbox Code Playgroud)
移动到下一个块并选择一些行:
<motion>
v<motion>
Run Code Online (Sandbox Code Playgroud)
增加每一行的第一个数字:
<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
在这里引入变量等有什么好处。