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;
                }
            }
        }
        private static void St2()
        {
            var shouldBeIgnoredInBuildScripts = new List <string>();

            foreach (var path in RoFile.Ls(EditorEnv.assetsPath))
            {
                if (RoFile.IsDir(path))
                {
                    if (RoFile.Basename(path).IsMatch("(Editor|Script|Standard Assets)"))
                    {
                        continue;
                    }

                    var fs = RoFile.FF(path);
                    fs.Each((path2) =>
                    {
                        if (path2.IsMatch("\\.cs$") && !RoFile.Read(path2).IsMatch("#if UNITY_EDITOR"))
                        {
                            shouldBeIgnoredInBuildScripts.Add(path2);
                        }
                    });
                }
            }

            if (shouldBeIgnoredInBuildScripts.Count > 0)
            {
                throw new SystemException(
                          "following code should be marked #if UNITY_EDITOR to only run in unity editor not unity build" +
                          "\n" + shouldBeIgnoredInBuildScripts.Join("\n"));
            }
        }
        private static AssetDeleteResult OnWillDeleteAsset(string assetPath, RemoveAssetOptions options)
        {
            var trashD        = RoFile.Join(EditorEnv.pj, "Trash");
            var bakPath       = RoFile.Join(trashD, $"{RoTime.now.Strftime("yyyyMMddHHmmss")}/{assetPath}");
            var assetFullPath = RoFile.Join(EditorEnv.pj, assetPath);

            if (assetFullPath.IsMatch("InitTestScene\\d+\\.unity"))
            {
                return(AssetDeleteResult.DidNotDelete);
            }

            try
            {
                if (RoFile.IsDir(assetFullPath))
                {
                    RoFile.D2D(assetFullPath, bakPath);
                }
                else
                {
                    RoFile.Cp(assetFullPath, bakPath);
                }

                var msg = $"bak {assetPath} to {bakPath} and del it";
                Shell.Notify(msg);
                Debug.Log(msg);
                return(AssetDeleteResult.DidNotDelete);
            }

            catch (Exception e)
            {
                Shell.NotifyWarn(e.Message);
                throw e;
            }


            // didnotdelete means it hasn't delete file, it should delete it
        }
        public static void St()
        {
            Thr(() =>
            {
                var editorScriptsDir = RoFile.Join(EditorEnv.assetsPath, "EditorScript/Ro");
                if (RoFile.IsDir(editorScriptsDir))
                {
                    var shouldMarkIf_UNITY_EDITOR_scripts = new List <string>();
                    RoFile.FF(editorScriptsDir).Each((path) =>
                    {
                        if (path.IsMatch("\\.cs$") && !RoFile.Read(path).IsMatch("#if\\s+UNITY_EDITOR"))
                        {
                            Notify($"wrap with #if UNITY_EDITOR, script: {path}");
                            RoFile.Write(path, $"#if UNITY_EDITOR\n{RoFile.Read(path)}\n#endif");
                        }
                    });
                }

//                var shouldMarkStr = shouldMarkIf_UNITY_EDITOR_scripts.Map((script) => { return $"    {script}"; })
//                    .Join("\n");
//                throw new SystemException(
//                    $"following scripts should mark #if UNITY_EDITOR\n{shouldMarkStr}");
            });
        }