我有以下函数声明:
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更快地实现这一点。感谢。
答案 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-a
和a
)
将光标放在正常模式的线上,按"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