复制索引递增的代码块

  • 本文关键字:代码 索引 复制 vim
  • 更新时间 :
  • 英文 :


我有以下函数声明:

函数 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-aa)

当光标在正常模式下的行上时,按"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

相关内容

最新更新