diff --git a/duplicate-shift.lua b/duplicate-shift.lua new file mode 100644 index 0000000..fccb456 --- /dev/null +++ b/duplicate-shift.lua @@ -0,0 +1,36 @@ +script_name="Duplicate and Shift" +script_description="old Aegisub's Ctrl+D function" +script_author="unanimated" +script_version="1.1" + +all_at_the_end=true -- if true, all new lines go after the end time of the last line. if false, each new line goes right after its original. + +function duplishift(subs, sel) + last=subs[sel[#sel]] + endtime=last.end_time + ms2fr=aegisub.frame_from_ms + fr2ms=aegisub.ms_from_frame + shiftframe=ms2fr(endtime) + newsel={} + for i=#sel,1,-1 do + line=subs[sel[i]] + l2=line + startfr=ms2fr(l2.start_time) + endfr=ms2fr(l2.end_time) + if all_at_the_end then + if line.end_time==endtime then line.end_time=fr2ms(shiftframe) subs[sel[i]]=line end + l2.start_time=fr2ms(shiftframe) + l2.end_time=fr2ms(shiftframe+1) + else + line.start_time=fr2ms(startfr) + line.end_time=fr2ms(endfr) subs[sel[i]]=line + l2.start_time=fr2ms(endfr) + l2.end_time=fr2ms(endfr+1) + end + subs.insert(sel[#sel]+1,l2) + table.insert(newsel,sel[#sel]+i) + end + return newsel +end + +aegisub.register_macro(script_name, script_description, duplishift) \ No newline at end of file diff --git a/kfsnap.lua b/kfsnap.lua new file mode 100644 index 0000000..77b9436 --- /dev/null +++ b/kfsnap.lua @@ -0,0 +1,76 @@ +-- This is a quick snap-to-keyframe script for timers who would like to have this hotkeyed for whatever reason. Works on selected lines. + +script_name="Snap" +script_description="Snaps to nearby keyframes" +script_author="unanimated" +script_version="1.1" + +-- SETTINGS + +kfsb=6 -- starts before +kfeb=10 -- ends before +kfsa=8 -- starts after +kfea=15 -- ends after + +-- END OF SETTINGS + +function keyframesnap(subs, sel) + keyframes=aegisub.keyframes() + ms2fr=aegisub.frame_from_ms + fr2ms=aegisub.ms_from_frame + + if subs[sel[1]].effect=="gui" then + gui={ + {x=0,y=0,width=1,height=1,class="label",label="Starts before "}, + {x=0,y=1,width=1,height=1,class="label",label="Ends before "}, + {x=0,y=2,width=1,height=1,class="label",label="Starts after "}, + {x=0,y=3,width=1,height=1,class="label",label="Ends after "}, + {x=1,y=0,width=1,height=1,class="floatedit",name="sb",value=6}, + {x=1,y=1,width=1,height=1,class="floatedit",name="eb",value=10}, + {x=1,y=2,width=1,height=1,class="floatedit",name="sa",value=8}, + {x=1,y=3,width=1,height=1,class="floatedit",name="ea",value=12}, + } + buttons={"OK","Cancel"} + pressed,res=aegisub.dialog.display(gui,buttons,{ok='OK',close='Cancel'}) + if pressed=="Cancel" then aegisub.cancel() end + kfsb=res.sb + kfeb=res.eb + kfsa=res.sa + kfea=res.ea + end + + for z, i in ipairs(sel) do + line=subs[i] + start=line.start_time + endt=line.end_time + startn=start + endtn=endt + startf=ms2fr(start) + endf=ms2fr(endt) + diff=250 + diffe=250 + startkf=keyframes[1] + endkf=keyframes[#keyframes] + + for k,kf in ipairs(keyframes) do + if kf>=startf-kfsa and kf<=startf+kfsb then + sdiff=math.abs(startf-kf) + if sdiff<=diff then diff=sdiff startkf=kf startn=fr2ms(startkf) end + end + if kf>=endf-kfea and kf<=endf+kfeb then + ediff=math.abs(endf-kf) + if ediff