首页 > 解决方案 > 宏 Vim - 扩展多个 Verilog 总线

问题描述

我正在尝试实现宏来将 Verilog 总线扩展为Vim - 宏来扩展 verilog 总线,这对于一个变量来说确实很好用。

但是我遇到了问题,因为我想如下实现多总线

来源:

{test[13:10],thisistest[3:0],BUS[2:1]}

结果:

test[13]
test[12]
test[11]
test[10]
thisistest[3]
thisistest[2]
thisistest[1]
thisistest[0]
BUS[2]
BUS[1]

我试图做的:我做了类似的功能

fun! split()
    let line = getline('.')
    let result = []
    let list = split(line, ",")
    let length = len(list)

    for i in length
        call ExpandIt(list[length])
    endfor
endf


fun! ExpandIt()
    let pat = '^\(.*\)\[\(\d\+\):\(\d\+\)\]\s*$'
    let line = getline('.')
    let lnr = line('.')
    if line !~ pat
        return
    endif
    let exestr = substitute(line,pat,'range(\2,\3,-1)','g')
    let text = substitute(line,pat,'\1','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 split()<cr>

你能告诉我我该怎么做才能以正确的方式走吗?

标签: regexvimverilog

解决方案


基于您添加split()的函数中的明显错误(函数名称必须大写以避免E128,您将参数传递给ExpandIt(),但它不带任何参数,length不可通过 迭代:for),您似乎对 Vimscript 的理解有限,并且只是尝试通过蛮力尝试“使其工作”。因此,在 Stack Overflow 上提问很好,但请注意,仅仅依靠有帮助的陌生人为您解决问题是一种不平衡的方法,所以请利用这个问题和未来的问题来缓慢而稳定地了解 Vim,成为一名大师它自己!

通过进行以下修改,以下内容似乎可以满足您的要求:

  • 修复上面列出的明显错误
  • 收集resultList inSplit()是正确的想法,但是:call append()原始行的实际插入()和删除也必须移到那里,并且ExpandIt()必须返回结果
  • 同样,ExpandIt()需要传递提取的元素而不是直接获取当前行
  • 逗号分隔元素的split()行的 the 需要去掉周围的{and }; substitute()可以做到这一点。
fun! Split()
    let line = getline('.')
    let result = []

    for l in split(substitute(line, '[{}]', '', 'g'), ",")
        let result += ExpandIt(l)
    endfor

    let lnr = line('.')
    call append(lnr, result)
    exec lnr'.d'
endf

fun! ExpandIt(line)
    let pat = '^\(.*\)\[\(\d\+\):\(\d\+\)\]\s*$'
    if a:line !~ pat
        return
    endif
    let exestr = substitute(a:line,pat,'range(\2,\3,-1)','g')
    let text = substitute(a:line,pat,'\1','g')
    exec 'let range='.exestr
    let result = []
    for i in range
        call add(result, text.'['.i.']')
    endfor
    return result
endf

nnoremap <F6> :call Split()<cr>

推荐阅读