使用增加的索引复制代码块

时间:2018-01-26 18:11:45

标签: vim

我有以下函数声明:

function f1(s)
real f1,s
f1 = 1/s
end

我想复制相同的块,但增加了函数名称,即f1, f2, f3, ...,以便得到这个:

function f1(s)
real f1,s
f1 = 1/s
end

function f2(s)
real f2,s
f2 = 1/s
end

function f3(s)
real f3,s
f3 = 1/s
end

我目前的方法是以可视模式复制块,粘贴几次,然后手动重命名这些功能。我想知道如何使用Vim更快地实现这一点。感谢。

2 个答案:

答案 0 :(得分:2)

您始终可以使用宏。假设您在函数之前和之后都有一个空行,并且

之间没有空行
// 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(这是a更低)以增加数量
  • n - 转到下一个匹配/向前搜索(这是函数名称)
  • e - 转到结尾
  • ^A - 增加号码
  • n - 转到下一场比赛/向前搜索
  • e - 转到结尾
  • ^A - 增加号码
  • { - 向上移动一个段落(与开头相同的相对位置,但在插入的函数f2处)

现在您可以使用@c复制该功能并增加所有数字。带有您想要的计数的前缀,例如5@c将复制该功能5次并调整编号。

如果您不想记住字符串y}}Pjw*Ne^Ane^Ane^A{,可以将其粘贴到vim缓冲区中。但是,你必须在yanking之前替换^A。删除^A,在插入模式下按^v^a。 (如果您在屏幕会话中,则必须按^a a,这是CTRL-aa

将光标放在正常模式的线上,按"cY将其放入寄存器c中。

然后您可以使用@c重播。

这样你也可以修改它或将它拉到另一个寄存器。

let @c=y}}Pjw*Ne^Ane^Ane^A{中使用.vimrc,以便在启动vim时始终加载注册c

答案 1 :(得分:0)

我找到了解决方案。它可能看起来很复杂但不会,因为您只需将此函数复制到剪贴板并使用以下命令加载函数:

:@+

带有附加功能的功能

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