6161 ).lstrip ()
6262
6363
64- def check (desired_state ):
64+ def check (desired_state , on_demand = False ):
6565 if desired_state :
66- enable ()
66+ enable (on_demand )
6767 else :
6868 disable ()
6969
7070
7171def disable ():
7272 log ("Disabling aliases" )
7373
74+ real_syntaxes = get_real_syntaxes ()
75+
7476 def delete_alias_files (syntaxes ):
75- base_syntaxes = None
7677 for syntax in syntaxes :
77- if HAS_FIND_SYNTAX :
78- base_syntaxes = sublime .find_syntax_by_scope (
79- syntax .get ("base" , "text.plain" )
80- )
81- if base_syntaxes :
82- delete_alias_file (syntax , base_syntaxes [0 ].path )
83- else :
84- delete_alias_file (syntax , "Plain text.tmLanguage" )
78+ delete_alias_file (
79+ syntax ,
80+ real_syntaxes .get (
81+ syntax .get ("base" , "text.plain" ),
82+ "Packages/Text/Plain text.tmLanguage" ,
83+ ),
84+ )
8585
8686 for file_type in icons_json_content ().values ():
8787 delete_alias_files (file_type .get ("aliases" , []))
8888 delete_alias_files (file_type .get ("syntaxes" , []))
8989
90- shutil .rmtree (path .overlay_aliases_path (), ignore_errors = True )
91- shutil .rmtree (path .overlay_cache_path (), ignore_errors = True )
90+ def remove ():
91+ shutil .rmtree (path .overlay_aliases_path (), ignore_errors = True )
92+ shutil .rmtree (path .overlay_cache_path (), ignore_errors = True )
9293
94+ sublime .set_timeout_async (remove )
9395
94- def enable ():
95- if HAS_FIND_SYNTAX :
96- # Built a dict of { scope: syntax } from visible/real syntaxes.
97- # Note: Existing aliases in the overlay are hidden and thus excluded
98- # by default. Also ignore possible aliases or special purpose
99- # syntaxes from 3rd-party packages.
100- real_syntaxes = {
101- s .scope : s .path for s in sublime .list_syntaxes () if not s .hidden
102- }
103- else :
104- real_syntaxes = {}
96+
97+ def enable (on_demand = False ):
98+ real_syntaxes = get_real_syntaxes ()
99+ syntax_names = real_syntaxes .keys ()
100+ try :
101+ if on_demand and enable .syntax_names == syntax_names :
102+ return
103+ except Exception :
104+ pass
105+ enable .syntax_names = syntax_names
105106
106107 def real_syntax_for (selector ):
107108 for scope in selector .split ("," ):
@@ -145,7 +146,7 @@ def create_alias_file(alias):
145146 else :
146147 out .write (EMPTY_TEMPLATE .format (name , scope , exts , base ))
147148 except FileExistsError :
148- pass
149+ dump ( "■ {}.sublime-syntax" . format ( name ))
149150 except Exception as error :
150151 dump ("+ {}.sublime-syntax | {}" .format (name , error ))
151152 else :
@@ -156,6 +157,7 @@ def delete_alias_file(alias, real_syntax):
156157 alias_name = alias ["name" ] + ".sublime-syntax"
157158 alias_path = path .overlay_aliases_path (alias_name )
158159 if not os .path .exists (alias_path ):
160+ dump ("□ " + alias_name )
159161 return
160162
161163 # reassign real syntax to any open view, which uses the alias
@@ -166,10 +168,25 @@ def delete_alias_file(alias, real_syntax):
166168 if syntax and syntax == alias_resource :
167169 view .assign_syntax (real_syntax )
168170
169- # actually delete the alias syntax
170- try :
171- os .remove (alias_path )
172- except Exception as error :
173- dump ("- {} | {}" .format (alias_name , error ))
174- else :
175- dump ("- {}" .format (alias_name ))
171+ # delete the alias syntax asynchronously, after ST applied real syntax
172+ def remove ():
173+ try :
174+ os .remove (alias_path )
175+ except Exception as error :
176+ dump ("- {} | {}" .format (alias_name , error ))
177+ else :
178+ dump ("- {}" .format (alias_name ))
179+
180+ sublime .set_timeout_async (remove )
181+
182+
183+ def get_real_syntaxes ():
184+ # Built a dict of { scope: syntax } from visible/real syntaxes.
185+ # Note: Existing aliases in the overlay are hidden and thus excluded
186+ # by default. Also ignore possible aliases or special purpose
187+ # syntaxes from 3rd-party packages.
188+ return (
189+ {s .scope : s .path for s in sublime .list_syntaxes () if not s .hidden }
190+ if HAS_FIND_SYNTAX
191+ else {}
192+ )
0 commit comments