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]

我做了一点测试,看起来像: