我有以下函数声明:
函数 F1(S) 真正的F1,S f1 = 1/s 结束
我想复制相同的块,但功能名称增加,即f1, f2, f3, ...
为了得到这个:
函数 F1(S) 真正的F1,S f1 = 1/s 结束 函数 F2(S) 真正的F2,S f2 = 1/s 结束 函数 F3(S) 真正的F3,S f3 = 1/s 结束
我目前的方法是以可视模式复制块,粘贴几次,然后手动重命名函数。我想知道如何使用 Vim 更快地实现这一目标。谢谢。
您可以随时使用录音(请参阅:h recording
)。假设函数前后有一个空行,中间没有空行
// empty line here, cursor here
function f1(s)
real f1,s
f1 = 1/s
end
// empty line here
将光标放在上面的空行上,将记录到您喜欢的任何寄存器。在这里我使用的是寄存器c
.按qc然后按y}}Pjw*Ne^Ane^Ane^A{
并退出并q
。
解释
y}
- 拉下一段}
- 下移一段P
- 放在此行上方j
- 移动一行完成w
- 移至下一个单词*
- 在光标下搜索单词(这是这里的函数名称)N
- 向后搜索(我们用*
移动以将模式放入寄存器)e
- 转到词尾^A
-按 Ctrl a增加数字n
- 转到下一个匹配/向前搜索(这是函数名称)e
- 转到词尾^A
- 增加数量n
- 转到下一场比赛/向前搜索e
- 转到词尾^A
- 增加数量{
- 向上移动一段(与开头的相对位置相同,但在插入的函数 f2 处)
现在,您可以使用@c
复制函数并增加所有数字。前缀为您想要的计数,例如5@c
将复制函数 5 次并调整编号。
如果您不想记住字符串y}}Pjw*Ne^Ane^Ane^A{
可以将其粘贴到 vim 缓冲区中。不过,您必须在拉动之前更换^A
。删除^A
,在插入模式下按Ctrl va。(如果您在屏幕会话中,则必须按Ctrlaa,这是CTRL-a
和a
)
当光标在正常模式下的行上时,按"cY
将其拉入寄存器 c。
然后你可以用@c
重播它。
这样,您还可以修改它或将其拉到另一个寄存器。
在.vimrc
中使用let @c=y}}Pjw*Ne^Ane^Ane^A{
,使其始终加载以在启动 vim 时注册c
。
我想出了解决方案。它可能看起来很复杂,但事实并非如此,因为您只需将此功能复制到剪贴板并使用以下命令加载该函数:
:@+
在具有附加功能的功能下方
fun! CopyAndIncrease()
try
let l:old_copy = getreg('0')
normal yip
let @0 = substitute(@0,'d+','=submatch(0) + 1','g')
exec "normal }O<Esc>p"
finally
call setreg('0', l:old_copy)
endtry
endfun
command! -nargs=0 CopyIncrease silent call CopyAndIncrease() | exec "normal <Esc>"
let mapleader = ','
nnoremap <Leader>c :CopyIncrease<CR>
现在按,c
现在您可以使用函数中定义的键绑定和命令。
函数的解释:
let l:old_copy = getreg('0') -> save copy register
normal yip -> copy block
let @0 ... increase numbers on copy register
exec "normal }O<Esc>p" -> paste increased block