Vim 复制索引递增的代码块

Vim 复制索引递增的代码块,vim,Vim,我有以下功能声明: function f1(s) real f1,s f1 = 1/s end 我目前的方法是以可视模式复制块,粘贴几次,然后手动重命名函数。我想知道如何使用Vim更快地实现这一点。谢谢。您可以随时使用录音(请参见:h录音)。假设函数前后都有一个空行,而函数之间没有空行 // empty line here, cursor here function f1(s) real f1,s f1 = 1/s end // empty line here 将光标放在上面的空行上,对任意寄

我有以下功能声明:

function f1(s) real f1,s f1 = 1/s end
我目前的方法是以可视模式复制块,粘贴几次,然后手动重命名函数。我想知道如何使用Vim更快地实现这一点。谢谢。

您可以随时使用录音(请参见
:h录音
)。假设函数前后都有一个空行,而函数之间没有空行

// empty line here, cursor here
function f1(s)
real f1,s
f1 = 1/s
end
// empty line here
将光标放在上面的空行上,对任意寄存器进行录制。这里我使用的是register
c
。按qc,然后按Pjw*Ne^Ane^Ane^A{,然后按q退出

解释

// empty line here, cursor here
function f1(s)
real f1,s
f1 = 1/s
end
// empty line here
  • y}
    -猛拉下一段
  • }
    -向下移动一段
  • P
    -放在这一行上面
  • j
    -移动一行完成
  • w
    -移动到下一个单词
  • *
    -在光标下搜索单词(这里是函数名)
  • N
    -向后搜索(我们使用
    *
    将模式移到寄存器中)
  • e
    -转到单词末尾
  • ^A
    -按住A键可增加数字
  • n
    -转到下一个匹配/向前搜索(这是函数名)
  • e
    -转到单词末尾
  • ^A
    -增加数字
  • n
    -转到下一个匹配/向前搜索
  • e
    -转到单词末尾
  • ^A
    -增加数字
  • {
    -向上移动一段(与开头相同的相对位置,但在插入的函数f2处)
现在,您可以使用
@c
复制函数并增加所有数字。使用所需的计数作为前缀,例如
5@c
将复制功能5次并调整编号

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

在正常模式下,当光标位于测线上时,按“cY”键,将其拉入寄存器c

然后你可以用
@c
重播它

通过这种方式,您还可以修改它或将其拖动到另一个寄存器


在你的
.vimrc
中使用
let@c=y}}Pjw*Ne^Ane^Ane^A{
,让它在启动vim时总是加载注册
c

你总是可以使用录音(请参见
:h录音
)。假设你的函数前后都有一个空行并且中间没有空行

// 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
退出

解释

// empty line here, cursor here
function f1(s)
real f1,s
f1 = 1/s
end
// empty line here
  • y}
    -猛拉下一段
  • }
    -向下移动一段
  • P
    -放在这一行上面
  • j
    -移动一行完成
  • w
    -移动到下一个单词
  • *
    -在光标下搜索单词(这里是函数名)
  • N
    -向后搜索(我们使用
    *
    将模式移到寄存器中)
  • e
    -转到单词末尾
  • ^A
    -按住A键可增加数字
  • n
    -转到下一个匹配/向前搜索(这是函数名)
  • e
    -转到单词末尾
  • ^A
    -增加数字
  • n
    -转到下一个匹配/向前搜索
  • e
    -转到单词末尾
  • ^A
    -增加数字
  • {
    -向上移动一段(与开头相同的相对位置,但在插入的函数f2处)
现在,您可以使用
@c
复制函数并增加所有数字。使用所需的计数作为前缀,例如
5@c
将复制功能5次并调整编号

如果您不想记住字符串
y}Pjw*Ne^Ane^Ane^A{
,可以将其粘贴到vim缓冲区中。您必须在拖动之前替换
^A
。删除
^A
,并在插入模式下按Ctrl-va。(如果您在屏幕会话中,则必须按Ctrl-aa,这是
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>

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

:@+
下面是具有附加功能的函数

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>