Well, there‘s two things to keep in mind (or maybe they are two aspects of one and the same thing; sorry, it’s late im my TZ and I might have had a beer or two):
- Syntaxes are exclusive – there can only ever be one that is active per file, and the active syntax defines what highlighting and symbolication you get.
- File extensions do not map one to one onto syntaxes. You can define other heuristics for Nova to detect when to apply a syntax besides extension names (notably, content detection, used to detect hashbang lines in shell scripts). These heuristics are weighed, and the “heaviest” one wins (no idea what happens when two heuristics result in the same weight; maybe Nova reverts to plain text, or maybe to the nearest builtin syntax?).
- Tooling depends on the active syntax, not directly on the file extension. For instance, my JXA (JavaScript for Automation) extension defines a
jxa
syntax that is automatically applied to.jxa
files, but needs to be manually applied to.js
files. When applied, all tooling for thejavascript
syntax is available, because that is what the JXA syntax declares as its parent (in theory; some extensions perform their own type / file extension checking and will sabotage this mechanism), as well as anything specifically defined to apply to thejxa
syntax (zilch as of now beyond what the extension itself provides).
… yeah, three items out of two. You know the old joke: “the two greatest gotchas in programming are naming things, cache invalidation, and off-by-one errors”.