regex - 宏 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>
你能告诉我我该怎么做才能以正确的方式走吗?
解决方案
基于您添加split()
的函数中的明显错误(函数名称必须大写以避免E128
,您将参数传递给ExpandIt()
,但它不带任何参数,length
不可通过 迭代:for
),您似乎对 Vimscript 的理解有限,并且只是尝试通过蛮力尝试“使其工作”。因此,在 Stack Overflow 上提问很好,但请注意,仅仅依靠有帮助的陌生人为您解决问题是一种不平衡的方法,所以请利用这个问题和未来的问题来缓慢而稳定地了解 Vim,成为一名大师它自己!
通过进行以下修改,以下内容似乎可以满足您的要求:
- 修复上面列出的明显错误
- 收集
result
List 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>
推荐阅读
- time - while (true) 循环的时间复杂度是多少?
- python - 无法在 localhost 上执行简单的 python 脚本
- racket - 匹配球拍中的多个条件
- groovy - 在 Map 中访问 Set 中的值
- c++ - C++ 待办事项列表重复输入。如何避免这种情况?
- amp-html - 如何使用 timeUpdate 事件的时间值来触发 AMP 动画?
- android - 将 GCM 升级到 FCM 服务器报告 MismatchSenderId 错误
- java - 无法停止服务 - 空对象引用错误 - Android
- linq - Linq - 根据先前数据过滤行
- c# - 无效的服务器响应 UWP 横幅广告错误