【问题标题】:Macro Vim - expand multiple Verilog Bus宏 Vim - 扩展多个 Verilog 总线
【发布时间】:2019-11-19 14:56:13
【问题描述】:

我正在尝试实现宏以将 Verilog 总线扩展为 Vim - Macro to expand verilog bus,这对于一个变量来说确实很有效。

但我遇到了问题,因为我想实现如下所示的多个总线

来源:

{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>

您能告诉我我应该怎么做才能走正确的路吗?

【问题讨论】:

    标签: regex vim verilog


    【解决方案1】:

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

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

    • 修复上面列出的明显错误
    • Split() 中收集result 列表是正确的想法,但实际插入(:call append())和删除原始行也必须移到那里,ExpandIt() 必须返回结果
    • 同样,ExpandIt() 需要传递提取的元素,而不是直接获取当前行
    • 将行的split()换成逗号分隔的元素需要去掉周围的{}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>
    

    【讨论】:

    • 感谢完美工作。顺便说一句,如果我想让它增加,例如 test[10],test[11],test[12].. 我应该修改哪一个?我尝试做的是:更改范围(\2,\3,+1)或 for range in i... 但都有错误。
    • 如果你想让它向上计数而不是向下计数,range(\2, \3, 1) 应该这样做(还有多余的+)。当然,[X:Y] 也必须是 X &lt; Y
    猜你喜欢
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-13
    • 2019-09-23
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    相关资源
    最近更新 更多