You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 20:54:03