Extending language definitions (for code highlighting) in notepad++

MrGlass picture MrGlass · Dec 20, 2011 · Viewed 39.9k times · Source

I've been doing development in TWIG lately. It is an html templating language that is very simple and robust.

I've set notepad++ to automatically treat .twig files as html. This is ok, but I don't get any syntax highlighting on my twig functions.

The twig syntax is incredibly simple (by design) and would be easy to add to notepad++. The problem is, everything I find on this subject is either about creating a new language definition (and I do not want to reinvent the html definition), or modifying the color for existing syntax bits in a language.

Is there any way to copy a language definition and then modify it in notepad++? If not, is there any way in notepad++ to add extra syntax bits to an existing language definition?

edit

TWIG is an html template language/engine. they syntax for it is the same as html, with the addition of a few open/close tags (specifically {% %}, {{ }}, and {# #}) for control statements. you can read more about it at the twig website

edit #2

Based on the answer from Brian Deragon, I have been investigating 3 files. Heres what I've figured out/done so far:

  • \plugins\APIs\html.xml - Seems to define keywords, for autocomplete. I made a copy of the file named twig.xml
  • langs.model.xml - Again, a list of keywords, with all the languages in 1 XML file. I copied the HTML object and replaced the name and ext parameters with twig.
  • stylers.model.xml - Has a list of different items, and style information (color, bg color, font, etc) for each. I copied the HTML section and changed the name and desc parameters to twig.

Those changes done, I opened up a twig file in notepad++, hoping to see it listed in the language options. Sadly, it has not appeared, leading me to believe that some of this is hard coded (and thus what I want might not be possible).

The stylers.model.xml is interesting, though. Each entry has a bunch of items, defined like this:

<LexerType name="twig" desc="TWIG" ext="">
    <WordsStyle name="DEFAULT" styleID="0" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="1" fontSize="" />
    <WordsStyle name="COMMENT" styleID="9" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
    <WordsStyle name="TAG" styleID="1" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
    <WordsStyle name="TAGEND" styleID="11" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="0" fontSize="" />
    ...
</LexerType>

Those seem to be where the styles are defined for the different elements. I can't find anywhere where those elements are defined though. langs.model.xml has a definition for comment start/end, but not for any other delimiters. what I really need is a place to tell notepad++ to treat { } as a delimiter, much like it does for < > now.

edit #3

I am also looking at this list of user defined languages for notepad++ http://sourceforge.net/apps/mediawiki/notepad-plus/index.php?title=User_Defined_Language_Files User defined languages use a different engine, but i might be able to find one in there that is similar to html enough that I can adapt it.

Answer

Brian Deragon picture Brian Deragon · Jan 5, 2012

You should be able to just copy and edit the XML definition file (html.xml); as long as you don't need stuff beyond the basics, like code-folding, advanced coloring based off of case-handling blocks or multiple conditionals, separate formatting for lead characters, label coloring, xml-based commenting, language mixing (coloring of embedded scripts), support for coloring of duck-types, etc. If you need anything "advanced" you need to write your own lexer, in which case most of the below applies.

Even still, the templates I listed below should give you a head-start on your own language definition file.


As far as I'm aware, Notepad++ uses Scintilla Lexers for determining its code rules.

You'll have to create your own lexer, but...the HTML Scintilla Lexer is already included in the Scintilla source code.

Then you would insert your custom lexer using a plug-in, like Gary's Lua Highlighter Plugin.

Resources for building a custom lexer:

That being said, Geany is very similar to Notepad++ (based off the same engine, Scintilla), so you might want to see whether it's already been done for Geany, or whether there's an open-source project for it in the works. This would at least give you a head start.

If that doesn't help, there are IDEs and editors with Twig support built-in, like:

GEdit has published their XML definition of the language here, which might help as a reference when creating your own definition file or lexer; there's also another template published by the guys from Twig here that might be of some help.

Here are the best Notepad++-specific tutorials for creating custom lexer's/User Defined Languages I can find:

If you want to get brave and build your own Scintilla dll, reference these threads, to see a guy who got it working, and to show up in the language list (use the previous/next thread message to see responses, or the thread index; it's a mailing list, so its UI isn't the best)

Hope that helps or gets you at least more of a head start!