Search code examples
fortranintel-fortrannedit

Updating syntax highliting in NEdit for modern Fortran


I generally use NEdit and have a file that give highlighting for the common Fortran language.

I tried to add in some of the missing keywords like DEALLOCATE, CONTIGUOUS, etc and ailed miserably. I was using example from here: https://groups.google.com/forum/#!topic/comp.lang.fortran/D8JtR7m53z4

Does anyone have any good links for updated version of NEdit for F90+?


Solution

  • The highlights were putting in the Fortran90 before the Fortran around line 308. Still having issues with !?OMP but working well enough, and I use CAPS for Fortran Intrinsics and CamelCase for most Variables, Subroutines and Functions...

    ! Preferences file for NEdit
    !
    ! This file is overwritten by the "Save Defaults..." command in NEdit 
    ! and serves only the interactively settable options presented in the NEdit
    ! "Preferences" menu.  To modify other options, such as key bindings, use 
    ! the .Xdefaults file in your home directory (or the X resource 
    ! specification method appropriate to your system).  The contents of this 
    ! file can be moved into an X resource file, but since resources in this file
    ! override their corresponding X resources, either this file should be 
    ! deleted or individual resource lines in the file should be deleted for the
    ! moved lines to take effect.
    
    nedit.fileVersion: 5.5
    nedit.shellCommands: \
        spell:Alt+B:s:ED:\n\
            (cat;echo "") | spell\n\
        wc::w:ED:\n\
            wc | awk '{print $1 " lines, " $2 " words, " $3 " characters"}'\n\
        sort::o:EX:\n\
            sort\n\
        number lines::n:AW:\n\
            nl -ba\n\
        make:Alt+Z:m:W:\n\
            make\n\
        expand::p:EX:\n\
            expand\n\
        unexpand::u:EX:\n\
            unexpand\n
    nedit.macroCommands: \
        Complete Word:Alt+D::: {\n\
            # Tuning parameters\n\
            ScanDistance = 200\n\
            \n\
            # Search back to a word boundary to find the word to complete\n\
            startScan = max(0, $cursor - ScanDistance)\n\
            endScan = min($text_length, $cursor + ScanDistance)\n\
            scanString = get_range(startScan, endScan)\n\
            keyEnd = $cursor-startScan\n\
            keyStart = search_string(scanString, "<", keyEnd, "backward", "regex")\n\
            if (keyStart == -1)\n\
                return\n\
            keyString = "<" substring(scanString, keyStart, keyEnd)\n\
            \n\
            # search both forward and backward from the cursor position.  Note that\n\
            # using a regex search can lead to incorrect results if any of the special\n\
            # regex characters is encountered, which is not considered a delimiter\n\
            backwardSearchResult = search_string(scanString, keyString, keyStart-1, \\\n\
                    "backward", "regex")\n\
            forwardSearchResult = search_string(scanString, keyString, keyEnd, "regex")\n\
            if (backwardSearchResult == -1 && forwardSearchResult == -1) {\n\
                beep()\n\
                return\n\
            }\n\
            \n\
            # if only one direction matched, use that, otherwise use the nearest\n\
            if (backwardSearchResult == -1)\n\
                matchStart = forwardSearchResult\n\
            else if (forwardSearchResult == -1)\n\
                matchStart = backwardSearchResult\n\
            else {\n\
                if (keyStart - backwardSearchResult <= forwardSearchResult - keyEnd)\n\
                    matchStart = backwardSearchResult\n\
                else\n\
                    matchStart = forwardSearchResult\n\
            }\n\
            \n\
            # find the complete word\n\
            matchEnd = search_string(scanString, ">", matchStart, "regex")\n\
            completedWord = substring(scanString, matchStart, matchEnd)\n\
            \n\
            # replace it in the window\n\
            replace_range(startScan + keyStart, $cursor, completedWord)\n\
        }\n\
        Fill Sel. w/Char:::R: {\n\
            if ($selection_start == -1) {\n\
                beep()\n\
                return\n\
            }\n\
            \n\
            # Ask the user what character to fill with\n\
            fillChar = string_dialog("Fill selection with what character?", "OK", "Cancel")\n\
            if ($string_dialog_button == 2 || $string_dialog_button == 0)\n\
                return\n\
            \n\
            # Count the number of lines in the selection\n\
            nLines = 0\n\
            for (i=$selection_start; i<$selection_end; i++)\n\
                if (get_character(i) == "\\n")\n\
                    nLines++\n\
            \n\
            # Create the fill text\n\
            rectangular = $selection_left != -1\n\
            line = ""\n\
            fillText = ""\n\
            if (rectangular) {\n\
                for (i=0; i<$selection_right-$selection_left; i++)\n\
                line = line fillChar\n\
                for (i=0; i<nLines; i++)\n\
                fillText = fillText line "\\n"\n\
                fillText = fillText line\n\
            } else {\n\
                if (nLines == 0) {\n\
                    for (i=$selection_start; i<$selection_end; i++)\n\
                        fillText = fillText fillChar\n\
                } else {\n\
                    startIndent = 0\n\
                    for (i=$selection_start-1; i>=0 && get_character(i)!="\\n"; i--)\n\
                        startIndent++\n\
                    for (i=0; i<$wrap_margin-startIndent; i++)\n\
                        fillText = fillText fillChar\n\
                    fillText = fillText "\\n"\n\
                for (i=0; i<$wrap_margin; i++)\n\
                    line = line fillChar\n\
                for (i=0; i<nLines-1; i++)\n\
                    fillText = fillText line "\\n"\n\
                for (i=$selection_end-1; i>=$selection_start && get_character(i)!="\\n"; \\\n\
                        i--)\n\
                    fillText = fillText fillChar\n\
                }\n\
            }\n\
            \n\
            # Replace the selection with the fill text\n\
            replace_selection(fillText)\n\
        }\n\
        Quote Mail Reply:::: {\n\
            if ($selection_start == -1)\n\
                replace_all("^.*$", "\\\\> &", "regex")\n\
            else\n\
                replace_in_selection("^.*$", "\\\\> &", "regex")\n\
        }\n\
        Unquote Mail Reply:::: {\n\
            if ($selection_start == -1)\n\
                replace_all("(^\\\\> )(.*)$", "\\\\2", "regex")\n\
            else\n\
                replace_in_selection("(^\\\\> )(.*)$", "\\\\2", "regex")\n\
        }\n\
        Comments>/* Comment */@C@C++@Java@CSS@JavaScript@Lex:::R: {\n\
            selStart = $selection_start\n\
            selEnd = $selection_end\n\
            replace_range(selStart, selEnd, "/* " get_selection() " */")\n\
            select(selStart, selEnd + 6)\n\
        }\n\
        Comments>/* Uncomment */@C@C++@Java@CSS@JavaScript@Lex:::R: {\n\
            sel = get_selection()\n\
            selStart = $selection_start\n\
            selEnd = $selection_end\n\
            commentStart = search_string(sel, "/*", 0)\n\
            if (substring(sel, commentStart + 2, commentStart + 3) == " ")\n\
                keepStart = commentStart + 3\n\
            else\n\
                keepStart = commentStart + 2\n\
            keepEnd = search_string(sel, "*/", length(sel), "backward")\n\
            commentEnd = keepEnd + 2\n\
            if (substring(sel, keepEnd - 1, keepEnd) == " ")\n\
                keepEnd = keepEnd - 1\n\
            replace_range(selStart + commentStart, selStart + commentEnd, \\\n\
                substring(sel, keepStart, keepEnd))\n\
            select(selStart, selEnd - (keepStart-commentStart) - \\\n\
                (commentEnd - keepEnd))\n\
        }\n\
        Comments>// Comment@C@C++@Java@JavaScript:::R: {\n\
            replace_in_selection("^.*$", "// &", "regex")\n\
        }\n\
        Comments>// Uncomment@C@C++@Java@JavaScript:::R: {\n\
            replace_in_selection("(^[ \\\\t]*// ?)(.*)$", "\\\\2", "regex")\n\
        }\n\
        Comments># Comment@Perl@Sh Ksh Bash@NEdit Macro@Makefile@Awk@Csh@Python@Tcl:::R: {\n\
            replace_in_selection("^.*$", "#&", "regex")\n\
        }\n\
        Comments># Uncomment@Perl@Sh Ksh Bash@NEdit Macro@Makefile@Awk@Csh@Python@Tcl:::R: {\n\
            replace_in_selection("(^[ \\\\t]*#)(.*)$", "\\\\2", "regex")\n\
        }\n\
        Comments>-- Comment@SQL:::R: {\n\
            replace_in_selection("^.*$", "--&", "regex")\n\
        }\n\
        Comments>-- Uncomment@SQL:::R: {\n\
            replace_in_selection("(^[ \\\\t]*--)(.*)$", "\\\\2", "regex")\n\
        }\n\
        Comments>! Comment@X Resources:::R: {\n\
            replace_in_selection("^.*$", "!&", "regex")\n\
        }\n\
        Comments>! Uncomment@X Resources:::R: {\n\
            replace_in_selection("(^[ \\\\t]*!)(.*)$", "\\\\2", "regex")\n\
        }\n\
        Comments>% Comment@LaTeX:::R: {\n\
                            replace_in_selection("^.*$", "%&", "regex")\n\
                            }\n\
        Comments>% Uncomment@LaTeX:::R: {\n\
                            replace_in_selection("(^[ \\\\t]*%)(.*)$", "\\\\2", "regex")\n\
                            }\n\
        Comments>Bar Comment@C:::R: {\n\
            if ($selection_left != -1) {\n\
                dialog("Selection must not be rectangular")\n\
                return\n\
            }\n\
            start = $selection_start\n\
            end = $selection_end-1\n\
            origText = get_range($selection_start, $selection_end-1)\n\
            newText = "/*\\n" replace_in_string(get_range(start, end), \\\n\
                "^", " * ", "regex") "\\n */\\n"\n\
            replace_selection(newText)\n\
            select(start, start + length(newText))\n\
        }\n\
        Comments>Bar Uncomment@C:::R: {\n\
            selStart = $selection_start\n\
            selEnd = $selection_end\n\
            newText = get_range(selStart+3, selEnd-4)\n\
            newText = replace_in_string(newText, "^ \\\\* ", "", "regex")\n\
            replace_range(selStart, selEnd, newText)\n\
            select(selStart, selStart + length(newText))\n\
        }\n\
        Make C Prototypes@C@C++:::: {\n\
            if ($selection_start == -1) {\n\
                start = 0\n\
                end = $text_length\n\
            } else {\n\
                start = $selection_start\n\
                end = $selection_end\n\
            }\n\
            string = get_range(start, end)\n\
            nDefs = 0\n\
            searchPos = 0\n\
            prototypes = ""\n\
            staticPrototypes = ""\n\
            for (;;) {\n\
                headerStart = search_string(string, \\\n\
                    "^[a-zA-Z]([^;#\\"'{}=><!/]|\\n)*\\\\)[ \\t]*\\n?[ \\t]*\\\\{", \\\n\
                    searchPos, "regex")\n\
                if (headerStart == -1)\n\
                break\n\
                headerEnd = search_string(string, ")", $search_end,"backward") + 1\n\
                prototype = substring(string, headerStart, headerEnd) ";\\n"\n\
                if (substring(string, headerStart, headerStart+6) == "static")\n\
                staticPrototypes = staticPrototypes prototype\n\
                else\n\
                            prototypes = prototypes prototype\n\
                searchPos = headerEnd\n\
                nDefs++\n\
            }\n\
            if (nDefs == 0) {\n\
                dialog("No function declarations found")\n\
                return\n\
            }\n\
            new()\n\
            focus_window("last")\n\
            replace_range(0, 0, prototypes staticPrototypes)\n\
        }\n
    nedit.bgMenuCommands: \
        Undo:::: {\n\
            undo()\n\
        }\n\
        Redo:::: {\n\
            redo()\n\
        }\n\
        Cut:::R: {\n\
            cut_clipboard()\n\
        }\n\
        Copy:::R: {\n\
            copy_clipboard()\n\
        }\n\
        Paste:::: {\n\
            paste_clipboard()\n\
        }\n
    
    nedit.highlightPatterns: Ada:Default\n\
        Awk:Default\n\
        C++:Default\n\
        C:Default\n\
        CSS:Default\n\
        Csh:Default\n\
        Fortran:Default\n\
        Fortran90:1:30{\n\
        Continuation:"&":::Flag::\n\
        String:"'":"'":"\\n([^ \\t]| [^ \\t]|  [^ \\t]|   [^ \\t]|    [^ \\t]|     [ \\t0]| *\\t[^1-9])":String::\n\
        Keywords:"<(LT|GT|EQ|AND|OR|ACCEPT|[Aa]ccept|ASSIGN|[Aa]ssign|AUTOMATIC|[Aa]utomatic|BACKSPACE|[Bb]ackspace|BLOCK|[Bb]lock|CALL|[Cc]all|CLOSE|[Cc]lose|COMMON|[Cc]ommon|CONTINUE|[Cc]ontinue|DATA|[Dd]ata|DECODE|[Dd]ecode|DELETE|[Dd]elete|DIMENSION|[Dd]imension|DO|[Dd]o|ELSE|[Ee]lse|ELSEIF|[Ee]lseif|ENCODE|[Ee]ncode|ENDFILE|[Ee]nd[Ff]ile|ENDFILE|[Ee]ndfile|END|[Ee]nd|ENDIF|[Ee]ndif|ENTRY|[Ee]ntry|EQUIVALENCE|[Ee]quivalence|EXIT|[Ee]xit|EXTERNAL|[Ee]xternal|FORMAT|[Ff]ormat|FUNCTION|[Ff]unction|GOTO|[Gg]oto|IF|[Ii]f|IMPLICIT|[Ii]mplicit|INCLUDE|[Ii]nclude|INQUIRE|[Ii]nquire|INTRINSIC|[Ii]ntrinsic|LOGICAL|[Ll]ogical|MAP|[Mm]ap|NONE|[Nn]one|ON|[Oo]n|OPEN|[Oo]pen|PARAMETER|[Pp]arameter|PAUSE|[Pp]ause|POINTER|[Pp]ointer|PRINT|[Pp]rint|PROGRAM|[Pp]rogram|READ|[Rr]ead|RECORD|[Rr]ecord|RETURN|[Rr]eturn|REWIND|[Rr]ewind|SAVE|[Ss]ave|STATIC|[Ss]tatic|STOP|[Ss]top|STRUCTURE|[Ss]tructure|SUBROUTINE|[Ss]ubroutine|SYSTEM|[Ss]ystem|THEN|[Tt]hen|TO|[Tt]o|TYPE|[Tt]ype|UNION|[Uu]nion|MAP|UNLOCK|[Uu]nlock|VIRTUAL|[Vv]irtual|VOLATILE|[Vv]olatile|WHILE|[Ww]hile|WRITE|[Ww]rite)>":::Keyword::D\n\
        Data Types:"<(BYTE|[Bb]yte|CHARACTER|[Cc]haracter|COMPLEX|[Cc]omplex|DOUBLE COMPLEX|[Dd]ouble *[Cc]omplex|DOUBLE *PRECISION|[Dd]ouble [Pp]recision|DOUBLE|[Dd]ouble|INTEGER|[Ii]nteger|REAL|[Rr]eal)(\\*[0-9]+)?>":::Keyword::D\n\
        F90 Keywords:"<('!'DIR'$'|DIR|OMP|DEC|EQV|NEQV|KIND|SIMD|PARALLEL OFF|PARALLEL ON|ALLOCATABLE|[Aa]llocatable|ALLOCATE|[Aa]llocate|CASE|[Cc]ase|CASE|[Cc]ase|CONTAINS|CONTIGUOUS|[Cc]ontiguous|[Cc]ontains|CYCLE|[Cc]ycle|DEALLOCATE|[Dd]eallocate|ELSEWHERE|[Ee]lsewhere|ENDWHERE|[Ee]ndwhere|INTENT|[Ii]ntent|INTERFACE|[Ii]nterface|MODULE|[Mm]odule|NAMELIST|[Nn]amelist|OPTIONAL|[Oo]ptional|PRIVATE|[Pp]rivate|PROCEDURE|[Pp]rocedure|PUBLIC|[Pp]ublic|REWRITE|[Rr]ewrite|SELECT|[Ss]elect|USE|[Uu]se|WHERE|[Ww]here)>":::Keyword::D\n\
        Numeric const:"<[0-9]+(\\.[0-9]*)?([DEde][-+]?[0-9]*)?|\\.[0-9]+([DEde][-+]?[0-9]*)?>":::Numeric Const::D\n\
        Comment:"! ":"$"::Comment::\n\
            }\n\
        Java:Default\n\
        JavaScript:Default\n\
        LaTeX:Default\n\
        Lex:Default\n\
        Makefile:Default\n\
        Matlab:Default\n\
        NEdit Macro:Default\n\
        Pascal:Default\n\
        Perl:Default\n\
        PostScript:Default\n\
        Python:Default\n\
        Regex:Default\n\
        SGML HTML:Default\n\
        SQL:Default\n\
        Sh Ksh Bash:Default\n\
        Tcl:Default\n\
        VHDL:Default\n\
        Verilog:Default\n\
        XML:Default\n\
        X Resources:Default\n\
        Yacc:Default
    nedit.languageModes:    Ada:.ada .ad .ads .adb .a:::::::\n\
        Awk:.awk:::::::\n\
        C++:.cc .hh .C .H .i .cxx .hxx .cpp .c++::::::".,/\\`'!|@#%^&*()-=+{}[]"":;<>?~":\n\
        C:.c .h::::::".,/\\`'!|@#%^&*()-=+{}[]"":;<>?~":\n\
        CSS:css::Auto:None:::".,/\\`'!|@#%^&*()=+{}[]"":;<>?~":\n\
        Csh:.csh .cshrc .login .logout:"^[ \\t]*#[ \\t]*![ \\t]*/bin/csh"::::::\n\
        Fortran90:.f90 .f03 .f08 .F90 .F03 .F08:::::::\n\
        Fortran:.f .f77 .for :::::::\n\
        Java:.java:::::::\n\
        JavaScript:.js:::::::\n\
        LaTeX:.tex .sty .cls .ltx .ins:::::::\n\
        Lex:.lex:::::::\n\
        Makefile:Makefile makefile .gmk:::None:8:8::\n\
        Matlab:.m .oct .sci:::::::\n\
        NEdit Macro:.nm .neditmacro:::::::\n\
        Pascal:.pas .p .int:::::::\n\
        Perl:.pl .pm .p5 .PL:"^[ \\t]*#[ \\t]*!.*perl":Auto:None:::".,/\\\\`'!$@#%^&*()-=+{}[]"":;<>?~|":\n\
        PostScript:.ps .eps .epsf .epsi:"^%!":::::"/%(){}[]<>":\n\
        Python:.py:"^#!.*python":Auto:None:::"!""#$%&'()*+,-./:;<=>?@[\\\\]^`{|}~":\n\
        Regex:.reg .regex:"\\(\\?[:#=!iInN].+\\)":None:Continuous::::\n\
        SGML HTML:.sgml .sgm .html .htm:"\\<[Hh][Tt][Mm][Ll]\\>"::::::\n\
        SQL:.sql:::::::\n\
        Sh Ksh Bash:.sh .bash .ksh .profile .bashrc .bash_logout .bash_login .bash_profile:"^[ \\t]*#[ \\t]*![ \\t]*/.*bin/(bash|ksh|sh|zsh)"::::::\n\
        Tcl:.tcl .tk .itcl .itk::Smart:None::::\n\
        VHDL:.vhd .vhdl .vdl:::::::\n\
        Verilog:.v:::::::\n\
        XML:.xml .xsl .dtd:"\\<(?i\\?xml|!doctype)"::None:::"<>/=""'()+*?|":\n\
        X Resources:.Xresources .Xdefaults .nedit:"^[!#].*([Aa]pp|[Xx]).*[Dd]efaults"::::::\n\
        Yacc:.y::::::".,/\\`'!|@#%^&*()-=+{}[]"":;<>?~":
    nedit.styles:   Plain:black:Plain\n\
        Comment:gray20:Italic\n\
        Keyword:black:Bold\n\
        Storage Type:brown:Bold\n\
        Storage Type1:saddle brown:Bold\n\
        String:darkGreen:Plain\n\
        String1:SeaGreen:Plain\n\
        String2:darkGreen:Bold\n\
        Preprocessor:RoyalBlue4:Plain\n\
        Preprocessor1:blue:Plain\n\
        Character Const:darkGreen:Plain\n\
        Numeric Const:darkGreen:Plain\n\
        Identifier:brown:Plain\n\
        Identifier1:RoyalBlue4:Plain\n\
        Identifier2:SteelBlue:Plain\n\
        Subroutine:brown:Plain\n\
        Subroutine1:chocolate:Plain\n\
        Ada Attributes:plum:Bold\n\
        Label:red:Italic\n\
        Flag:red:Bold\n\
        Text Comment:SteelBlue4:Italic\n\
        Text Key:VioletRed4:Bold\n\
        Text Key1:VioletRed4:Plain\n\
        Text Arg:RoyalBlue4:Bold\n\
        Text Arg1:SteelBlue4:Bold\n\
        Text Arg2:RoyalBlue4:Plain\n\
        Text Escape:gray30:Bold\n\
        LaTeX Math:darkGreen:Plain\n\
        Pointer:#660000:Bold\n\
        Regex:#009944:Bold\n\
        Warning:brown2:Italic
    nedit.smartIndentInit:  C:Default\n\
        C++:Default\n\
        Python:Default\n\
        Matlab:Default
    nedit.smartIndentInitCommon: Default
    nedit.autoWrap: Newline
    nedit.wrapMargin: 0
    nedit.autoIndent: Auto
    nedit.autoSave: True
    nedit.openInTab: True
    nedit.saveOldVersion: False
    nedit.showMatching: Delimiter
    nedit.matchSyntaxBased: True
    nedit.highlightSyntax: True
    nedit.backlightChars: False
    nedit.searchDialogs: False
    nedit.beepOnSearchWrap: False
    nedit.retainSearchDialogs: False
    nedit.searchWraps: True
    nedit.stickyCaseSenseButton: True
    nedit.repositionDialogs: True
    nedit.autoScroll: False
    nedit.appendLF: True
    nedit.sortOpenPrevMenu: True
    nedit.statisticsLine: False
    nedit.iSearchLine: False
    nedit.sortTabs: False
    nedit.tabBar: True
    nedit.tabBarHideOne: True
    nedit.toolTips: True
    nedit.globalTabNavigate: False
    nedit.lineNumbers: False
    nedit.pathInWindowsMenu: True
    nedit.warnFileMods: True
    nedit.warnRealFileMods: True
    nedit.warnExit: True
    nedit.searchMethod: Literal
    nedit.textRows: 24
    nedit.textCols: 80
    nedit.tabDistance: 8
    nedit.emulateTabs: 0
    nedit.insertTabs: True
    nedit.textFont: -*-courier-medium-r-normal--*-120-*-*-*-iso8859-1
    nedit.boldHighlightFont: -*-courier-bold-r-normal--*-120-*-*-*-iso8859-1
    nedit.italicHighlightFont: -*-courier-medium-o-normal--*-120-*-*-*-iso8859-1
    nedit.boldItalicHighlightFont: -*-courier-bold-o-normal--*-120-*-*-*-iso8859-1
    nedit.textFgColor: black
    nedit.textBgColor: rgb:e5/e5/e5
    nedit.selectFgColor: black
    nedit.selectBgColor: rgb:cc/cc/cc
    nedit.hiliteFgColor: white
    nedit.hiliteBgColor: red
    nedit.lineNoFgColor: black
    nedit.cursorFgColor: black
    nedit.smartTags: True
    nedit.prefFileRead: True
    nedit.titleFormat: {%c} [%s] %f (%S) - %d
    

    So it needs some more work for lower case and CamelCase, but it is working well enough.