Vim - 扩展verilog总线的宏
Vim - Macro to expand verilog bus
我似乎无法创建执行以下操作的 vim 宏:
来源:
this_is_a_bus[10:0]
another_bus[2:0]
所需目的地:
this_is_a_bus[10]
this_is_a_bus[9]
this_is_a_bus[8]
this_is_a_bus[7]
this_is_a_bus[6]
this_is_a_bus[5]
this_is_a_bus[4]
this_is_a_bus[3]
this_is_a_bus[2]
this_is_a_bus[1]
this_is_a_bus[0]
another_bus[2]
another_bus[1]
another_bus[0]
我尝试做的事情:
我可以搜索 \d\+:\d\+
并将光标放在第一个数字上,然后用 yw
将其复制到内存中。但是我似乎无法告诉 vim 根据寄存器中的数字运行粘贴命令。
我是不是用错了方法?创建这样的东西的建议方法是什么?
我会使用宏来完成这个任务。从以下行开始:
this_is_a_bus[10]
然后录制宏:
qqyyp<c-x>q
然后通过@q
播放宏。更好的是我们可以给它一个计数,9@q
.
宏的解释
q{reg}
开始录制宏并将宏保存到寄存器中,{reg}
。例如qq
yy
复制整行
p
将新复制的行粘贴到当前行下方(光标在新行上)
<c-x>
将从当前光标位置开始递减它找到的第一个数字
q
录制宏时按q
会结束录制
@{reg}
将在 {reg}
中播放一个宏。例如@q
到播放寄存器q
[count]@{reg}
: @
可以计算宏播放 [count]
次。例如9@q
@@
将重播上次使用的 @{reg}
命令。可选 @@
也可以计数
如需更多帮助,请参阅:
:h q
:h @
:h @@
:h ctrl-x
这里有一个功能,可以单键自动展开。 (<F6>
在这种情况下)
fun! ExpandIt()
let pat = '^\([^][]\+\)\[\(\d\+\):\(\d\+\)\]\s*'
let line = getline('.')
let lnr = line('.')
if line !~ pat
return
endif
let exestr = substitute(line,pat,'range(,,-1)','g')
let text = substitute(line,pat,'','g')
exec 'let range='.exestr
let result = []
for i in range
call add(result, text.'['.i.']')
endfor
call append(lnr, result)
exec lnr'.d'
endf
nnoremap <F6> :call ExpandIt()<cr>
- 获取此文件,或将其放入您的 vimrc。
- 最后一行创建一个映射,它允许您在该行上按
<F6>
进行扩展
- 如果该行不是
xxxx[number:number]
格式,则不会发生任何事情
- 我没有检查错误大小写,例如
xxx[1:10]
或 xxx[000:000]
我做了一点测试,看起来像:
我似乎无法创建执行以下操作的 vim 宏:
来源:
this_is_a_bus[10:0]
another_bus[2:0]
所需目的地:
this_is_a_bus[10]
this_is_a_bus[9]
this_is_a_bus[8]
this_is_a_bus[7]
this_is_a_bus[6]
this_is_a_bus[5]
this_is_a_bus[4]
this_is_a_bus[3]
this_is_a_bus[2]
this_is_a_bus[1]
this_is_a_bus[0]
another_bus[2]
another_bus[1]
another_bus[0]
我尝试做的事情:
我可以搜索 \d\+:\d\+
并将光标放在第一个数字上,然后用 yw
将其复制到内存中。但是我似乎无法告诉 vim 根据寄存器中的数字运行粘贴命令。
我是不是用错了方法?创建这样的东西的建议方法是什么?
我会使用宏来完成这个任务。从以下行开始:
this_is_a_bus[10]
然后录制宏:
qqyyp<c-x>q
然后通过@q
播放宏。更好的是我们可以给它一个计数,9@q
.
宏的解释
q{reg}
开始录制宏并将宏保存到寄存器中,{reg}
。例如qq
yy
复制整行p
将新复制的行粘贴到当前行下方(光标在新行上)<c-x>
将从当前光标位置开始递减它找到的第一个数字q
录制宏时按q
会结束录制@{reg}
将在{reg}
中播放一个宏。例如@q
到播放寄存器q
[count]@{reg}
:@
可以计算宏播放[count]
次。例如9@q
@@
将重播上次使用的@{reg}
命令。可选@@
也可以计数
如需更多帮助,请参阅:
:h q
:h @
:h @@
:h ctrl-x
这里有一个功能,可以单键自动展开。 (<F6>
在这种情况下)
fun! ExpandIt()
let pat = '^\([^][]\+\)\[\(\d\+\):\(\d\+\)\]\s*'
let line = getline('.')
let lnr = line('.')
if line !~ pat
return
endif
let exestr = substitute(line,pat,'range(,,-1)','g')
let text = substitute(line,pat,'','g')
exec 'let range='.exestr
let result = []
for i in range
call add(result, text.'['.i.']')
endfor
call append(lnr, result)
exec lnr'.d'
endf
nnoremap <F6> :call ExpandIt()<cr>
- 获取此文件,或将其放入您的 vimrc。
- 最后一行创建一个映射,它允许您在该行上按
<F6>
进行扩展 - 如果该行不是
xxxx[number:number]
格式,则不会发生任何事情 - 我没有检查错误大小写,例如
xxx[1:10]
或xxx[000:000]
我做了一点测试,看起来像: