Aegisub Lua自动化脚本循环不重复无法批量合并字幕行问题求助
错误原因
- 你在
while循环内写了return lines_to_delete,函数只要执行到这一步就会直接终止,所以每次运行脚本只会完成一次拼接就退出,这是循环无法自动执行的核心原因 - 外层的
for i=1,#subs是取脚本启动时的行总数作为循环上限,但你中途删除行会让字幕行数动态减少,继续按初始上限遍历会出现索引越界问题 - 没有声明变量为局部变量,容易引发全局变量污染的未知问题
- 原代码中作者名变量拼写错误,
scipt_author应为script_author
修正后完整代码
script_name="Concatenate lines" script_author="andrew salazar" script_description="Concatenates Lines under 55 characters" script_version = "1.1" include("utils.lua") include("karaskel.lua") function main_func(subs, sel, act) local i = 1 while i <= #subs do local l = subs[i] -- 非对话行直接跳过 if l.class ~= "dialogue" then i = i + 1 goto continue end -- 循环拼接直到长度达标或者到最后一行 while string.len(l.text) < 55 and i < #subs do local l_next = subs[i+1] -- 只拼接对话行,遇到非对话行就停止当前拼接 if l_next.class ~= "dialogue" then break end l.text = l.text .. " " .. l_next.text l.end_time = l_next.end_time subs[i] = l subs.delete(i+1) -- 重新获取当前行保证长度判断准确 l = subs[i] end i = i + 1 ::continue:: end -- 返回处理后所有对话行的索引,适配Aegisub宏的返回规则 local new_sel = {} for j=1,#subs do if subs[j].class == "dialogue" then table.insert(new_sel, j) end end return new_sel end aegisub.register_macro(script_name, script_description, main_func)
修改说明
- 移除了循环内部的
return语句,所有行处理完成后才统一返回 - 把外层固定次数的
for循环改为动态判断长度的while循环,适配删除行后的行数变化 - 增加了行类型判断,避免把样式、元数据行拼入对话
- 所有变量增加
local声明,避免全局变量污染 - 每次拼接后重新读取当前行内容,保证长度判断逻辑正确
内容的提问来源于stack exchange,提问作者andrew salazar
相关产品推荐
相关产品推荐

