Adjusting Notepad++ to work with an ASP VBScript project.

I have a large project in classic ASP, VBScript, and Javascript. It’s a hassle dealing with it because developer tools don’t support it that well or at all. I recently poked around the open source editor Notepad++ and got it adjusted to work decently well with the project.

Check out Notepad++ on the official website here.

In the past I had used Eclipse with an old VBScript ASP syntax highlighter. It wasn’t perfect, but worked alright overall. The main issue is that the highlighting stopped working every so often, and not to mention Eclipse is bulky and a pain to use for various reasons.

Here is a screenshot of Notepad++ adjusted to work with the project:
notepadpp

Here are my main adjustments:
“View” >> “Folder as Workspace”
“View” >> “Document Map”
“View” >> “Function List”
“Settings” >> “Preferences…” >> “Editing” >> “Display line number”

The function list feature won’t work without modification. My project is broken into a large number of “.asp” files and “.js” files. Neither extensions are linked to a function parser by default.

In this case, you have to modify the two functionlist.xml files. Thanks to some enterprising individuals on sourceforge.net, I was able to find a working parser for vbscript.

Here are the approximate locations of the files on Windows:
C:\Program Files (x86)\Notepad++
C:\Users\UserName\AppData\Roaming\Notepad++

Here are the two sections of xml I added to my functionlist.xml files:

<association langID="16" id="vb_function" />
<association langID="18" id="vb_function" />
<association langID="19" id="javascript_function" />


The langID relates to programming code type extensions. In this case 16 = “.vb”, 18 = “.asp”, and 19 = “.js”. I don’t need “.vb” right now, but I put it in there anyways in case I do open them in the future.

Here is the regex/parser code from the Sourceforge.net discussion that I used:


<parser id="vb_function" displayName="Visual Basic (.NET|Script|for Applications)" commentExpr="(?m:((?<=')[^\r\n]*$)|((?i:REM)[\t ].*$))">
    <classRange mainExpr="(?s:(?<=SCOPE>(?i:CLASS|TYPE)).*?(?i:END[\t ]\k<SCOPE>))" displayMode="node">
        <className>
            <nameExpr expr="(?i:CLASS|TYPE)[\t ]+(?:[A-Za-z_][\w]*\b)(?:.*?[\r\n])" />
            <nameExpr expr="[\t ]+(?:[A-Za-z_][\w]*\b)" />
            <nameExpr expr="[A-Za-z_][\w]*" />
        </className>
        <function mainExpr="(?m:^[\t ]*(?i:(?:(?:PUBLIC|PRIVATE|PROTECTED|FRIEND|PROTECTED FRIEND)[\t ]+)?(?:(?:STATIC|SHARED|SHADOWS|OVERRIDABLE|OVERRIDES|READONLY|WRITEONLY)[\t ]+)?(?:SUB|FUNCTION|PROPERTY)).*?(?:\(|$))">
            <functionName>
                <funcNameExpr expr="(?i:(?:(?:PUBLIC|PRIVATE|PROTECTED|FRIEND|PROTECTED FRIEND)[\t ]+)?(?:STATIC[\t ]+)?(?:SUB|FUNCTION|PROPERTY)).*?(?:\(|$)" />
                <funcNameExpr expr="(?i:(?:SUB|FUNCTION|PROPERTY)).*?(?:\(|$)" />
                <funcNameExpr expr="(?i:(?:GET|LET|SET)[\t ]+)?[A-Za-z_][\w]*(?=[\t ]*\()" />
            </functionName>
        </function>
    </classRange>
    <function mainExpr="^[\t ]*(?i:(?:(?:PUBLIC|PRIVATE|PROTECTED|FRIEND|PROTECTED FRIEND)[\t ]+)?(?:(?:STATIC|(?:DECLARE(?:[\t ]+(ANSI|UNICODE|AUTO))?))[\t ]+)?(?:SUB|FUNCTION|PROPERTY)).*?(?:\(|$)" displayMode="$functionName">
        <functionName>
            <nameExpr expr="(?i:(?:(?:PUBLIC|PRIVATE|PROTECTED|FRIEND|PROTECTED FRIEND)[\t ]+)?(?:(?:STATIC|(?:DECLARE(?:[\t ]+(ANSI|UNICODE|AUTO))?))[\t ]+)?(?:SUB|FUNCTION|PROPERTY)).*?(?:\(|$)" />
            <nameExpr expr="(?i:(?:SUB|FUNCTION|PROPERTY)).*?(?:\(|$)" />
            <nameExpr expr="(?i:(?:GET|LET|SET)[\t ]+)?[A-Za-z_][\w]*(?i:[\t ]+(LIB|ALIAS)[\t ]+[\w\"\.]+)*(?=[\t ]*\()" />
        </functionName>
    </function>
</parser>

If nothing happens, check your xml syntax. I had at first copied the regex xml without the final closing tag. There were no errors displayed by notepad++, but it just didn’t work. After fixing that it seems to be working fine. Notepad++ has very basic window and panel docking functionality. I would have preferred to have the document map and function lists side-by-side, but it only allows for one panel to be docked on each side of the window. Other than that, it looks to be a decent setup. Having syntax highlighting and a function list is a huge time saver.