如何写出一个优雅的脚本
所谓优雅,指的是除了脚本本身的功能外,不影响别的不相关的地方,比如光标位置、item选中状态等等,或者说,在不得不改变以后,想办法恢复原状。也许是我在编写脚本时的一点洁癖,我觉得如果脚本运行完以后,光标跳到别的位置了,或者原来选中的一堆item被取消选中了,或者画面跳到了一个不知道什么位置,或者凭空多出来一个time selection,我都会觉得很恶心。
先说一个基础知识,可以通过reaper.PreventUIRefresh()
来屏蔽UI刷新,加快脚本运行速度
reaper.PreventUIRefresh(1)
代码
代码
reaper.PreventUIRefresh(-1)
保存和恢复数值,我通常用这样的办法来实现
local temp=getXXXXX() --保存某个会影响到的数值
代码
代码
代码
setXXXX(temp) --恢复某个被影响到的数值
下面举一些实际的例子
当脚本用到的算法无可避免要中途移动光标位置的话,可以这样处理:
local cur=reaper.GetCursorPosition()
代码
代码
reaper.SetEditCurPos(cur, 0, 0)
这样在脚本结束以后,光标将会回到原来的位置,看不出有移动过的痕迹
通常可以通过建立一个table,把已选中的item存起来,之后再恢复:
local its={} --储存已选中item
for i=0, reaper.CountSelectedMediaItems(0)-1 do
its[i+1]=reaper.GetSelectedMediaItem(0, i)
end
代码
代码
reaper.SelectAllMediaItems(0, 0) --取消选择所有已经选中的item
for k, v in pairs(its) do --恢复item的选中状态
reaper.SetMediaItemSelected(v, true)
end
如果脚本运行需要先画time selection,或者脚本运行过程中要临时画一个,脚本结束后都应该去掉它
reaper.GetSet_LoopTimeRange(true, true, left, right, false)
代码
代码
reaper.Main_OnCommand(40020, 0) -- 去掉time selection
要注意的是如果通过自带actionTime selection: Set time selection to items
来添加time selection,光标会强制跳到time selection的左端点,所以要注意用上述方法保存和恢复光标位置
这个不太好形容,比如我在脚本运行前,我的画面显示范围是0~100秒,脚本运行后跳到了100~200秒,这同样是需要修正的:
local left,right=reaper.GetSet_ArrangeView2(0, 0, 0, 0) --获取屏幕边缘位置
代码
代码
reaper.GetSet_ArrangeView2(0, 1, 0, 0, left, right) --恢复屏幕边缘位置
暂时就想到想到这些