private static void St2()
        {
            var hasLibCSharpFileMakeCompileSlow = false;

            foreach (var p in RoFile.Ls(EditorScript.Ro.EditorEnv.assetsPath))
            {
                var isLibDir = RoFile.IsDir(p) && !RoFile.Basename(p)
                               .IsMatch(@"^(Script|PostProcessing|Scripts|Editor|EditorScript|Draft|Test|Plugins|Standard Assets)$");
                if (isLibDir)
                {
                    foreach (var p2 in RoFile.FF(p))
                    {
                        if (p2.IsMatch("\\.cs$"))
                        {
                            hasLibCSharpFileMakeCompileSlow = true;
                            var rootDir = RoFile.Rel(p2, EditorEnv.assetsPath).Match("[^/]+").ToString();
                            Shell.NotifyWarn(
                                $"In *Assets/{rootDir}*, it has lib c# file in Assets not *Assets/Standard Assets* to make compile slow, run *mad compile time optimizer* or maunally moving all lib c# files to *Assets/Standard Assets* to improve it");
                            break;
                        }
                    }
                }

                if (hasLibCSharpFileMakeCompileSlow)
                {
                    break;
                }
            }
        }
 static Replay()
 {
     if (EditorUtil.GetCurrentScene().path == RoFile.Rel(EditorEnv.roTestScenePath, EditorEnv.pj))
     {
         // in some case, replay still doesn't work since it's interrupted by unity editor auto refresh, since i often use RoTestScene.unity, so after refresh, start play
         StartPlay();
     }
 }
        public static void OpenDir(string absPath)
        {
            var assetPath = $"Assets/{RoFile.Rel(absPath, Application.dataPath)}";
            var asset     = AssetDatabase.LoadMainAssetAtPath(assetPath);
            var pt        = Type.GetType("UnityEditor.ProjectBrowser,UnityEditor");
            var ins       = pt.GetField("s_LastInteractEditorScript.RojectBrowser", BindingFlags.Static | BindingFlags.Public)
                            .GetValue(null);
            var showDirMeth = pt.GetMethod("ShowFolderContents", BindingFlags.NonPublic | BindingFlags.Instance);

            showDirMeth.Invoke(ins, new object[] { asset.GetInstanceID(), true });
        }
        public static void OpenFile(string absPath)
        {
            if (!Regex.IsMatch(absPath, @"Assets"))
            {
                throw new Exception($"{Kernel.GetCurMethName()} only support assets path");
            }

            var assetPath = $"Assets/{RoFile.Rel(absPath, Application.dataPath)}";
            var asset     = AssetDatabase.LoadMainAssetAtPath(assetPath);

            OpenObject(asset);
        }
        public static void OpenAssetInIDE(string assetPath)
        {
            var assetPath2 = RoFile.Rel(assetPath, EditorEnv.pj);

            AssetDatabase.OpenAsset(AssetDatabase.LoadAssetAtPath <TextAsset>(assetPath2));
        }