#1017 continuation, new (last) attempt. You can view, comment on, or merge this pull request online at:
https://github.com/geany/geany/pull/1752
-- Commit Summary --
* Add AutoIt syntax highlighting and Ctags parser for AutoIt
-- File Changes --
M ctags/Makefile.am (1) M ctags/main/parsers.h (3) A ctags/parsers/autoit.c (121) M data/Makefile.am (3) A data/filedefs/filetypes.autoit (72) M data/filetype_extensions.conf (1) M scintilla/Makefile.am (1) A scintilla/lexers/LexAU3.cxx (910) M scintilla/scintilla_changes.patch (2) M scintilla/src/Catalogue.cxx (1) M src/filetypes.c (1) M src/filetypes.h (1) M src/highlighting.c (9) M src/highlightingmappings.h (35) M src/symbols.c (8) M src/tagmanager/tm_parser.c (5) M src/tagmanager/tm_parser.h (1) M tests/ctags/Makefile.am (1) A tests/ctags/simple.au3 (32) A tests/ctags/simple.au3.tags (5)
-- Patch Links --
https://github.com/geany/geany/pull/1752.patch https://github.com/geany/geany/pull/1752.diff
b4n requested changes on this pull request.
Otherwise it looks good. I didn't review the Scintilla lexer properly, but it matches upstream's so I'm gonna be happy about it.
@@ -0,0 +1,72 @@
+# For complete documentation of this file, please see Geany's main documentation +# AutoIt 3.3.14.2 +[styling] +# Edit these in the colorscheme .conf file instead +default=default +comment=comment +commentblock=comment +number=number +function=function +keyword=type
shouldn't this be `keyword=keyword`?
@@ -0,0 +1,72 @@
+# For complete documentation of this file, please see Geany's main documentation +# AutoIt 3.3.14.2 +[styling] +# Edit these in the colorscheme .conf file instead +default=default +comment=comment
this should likely be `comment=comment_line`, shouldn't it?
@@ -0,0 +1,72 @@
+# For complete documentation of this file, please see Geany's main documentation +# AutoIt 3.3.14.2 +[styling] +# Edit these in the colorscheme .conf file instead +default=default +comment=comment +commentblock=comment +number=number +function=function +keyword=type +macro=preprocessor +string=string +operator=operator +variable=keyword_2
This is also questionable, but there's not a so obvious expected value, I would guess `variable=identifier`
+function=function
+keyword=type +macro=preprocessor +string=string +operator=operator +variable=keyword_2 +sent=other +preprocessor=preprocessor +special=type +expand=default +comobj=keyword_1 +udf=class + +[keywords] +keywords=and byref case const continuecase continueloop default dim do else elseif endfunc endif endselect endswitch endwith enum exit exitloop false for func global if in local next not null or redim return select static step switch then to true until volatile wend while with +functions=abs acos adlibregister adlibunregister asc ascw asin assign atan autoitsetoption autoitwingettitle autoitwinsettitle beep binary binarylen binarymid binarytostring bitand bitnot bitor bitrotate bitshift bitxor blockinput break call cdtray ceiling chr chrw clipget clipput consoleread consolewrite consolewriteerror controlclick controlcommand controldisable controlenable controlfocus controlgetfocus controlgethandle controlgetpos controlgettext controlhide controllistview controlmove controlsend controlsettext controlshow controltreeview cos dec dircopy dircreate dirgetsize dirmove dirremove dllcall dllcalladdress dllcallbackfree dllcallbackgetptr dllcallbackregister dllclose dllopen dllstructcreate dllstructgetdata dllstructgetptr dllstructgetsize dllstructsetdata drivegetdrive drivegetfilesystem drivegetlabel drivegetserial drivegettype drivemapadd drivemapdel drivemapget drivesetlabel drivespacefree drivespacetotal drivestatus envget envset envupdate eval execute exp filechangedir fileclose filecopy filecreatentfslink filecreateshortcut filedelete fileexists filefindfirstfile filefindnextfile fileflush filegetattrib filegetencoding filegetlongname filegetpos filegetshortcut filegetshortname filegetsize filegettime filegetversion fileinstall filemove fileopen fileopendialog fileread filereadline filereadtoarray filerecycle filerecycleempty filesavedialog fileselectfolder filesetattrib filesetend filesetpos filesettime filewrite filewriteline floor ftpsetproxy funcname guicreate guictrlcreateavi guictrlcreatebutton guictrlcreatecheckbox guictrlcreatecombo guictrlcreatecontextmenu guictrlcreatedate guictrlcreatedummy guictrlcreateedit guictrlcreategraphic guictrlcreategroup guictrlcreateicon guictrlcreateinput guictrlcreatelabel guictrlcreatelist guictrlcreatelistview guictrlcreatelistviewitem guictrlcreatemenu guictrlcreatemenuitem guictrlcreatemonthcal guictrlcreateobj guictrlcreatepic guictrlcreateprogress guictrlcreateradio guictrlcreateslider guictrlcreatetab guictrlcreatetabitem guictrlcreatetreeview guictrlcreatetreeviewitem guictrlcreateupdown guictrldelete guictrlgethandle guictrlgetstate guictrlread guictrlrecvmsg guictrlregisterlistviewsort guictrlsendmsg guictrlsendtodummy guictrlsetbkcolor guictrlsetcolor guictrlsetcursor guictrlsetdata guictrlsetdefbkcolor guictrlsetdefcolor guictrlsetfont guictrlsetgraphic guictrlsetimage guictrlsetlimit guictrlsetonevent guictrlsetpos guictrlsetresizing guictrlsetstate guictrlsetstyle guictrlsettip guidelete guigetcursorinfo guigetmsg guigetstyle guiregistermsg guisetaccelerators guisetbkcolor guisetcoord guisetcursor guisetfont guisethelp guiseticon guisetonevent guisetstate guisetstyle guistartgroup guiswitch hex hotkeyset httpsetproxy httpsetuseragent hwnd inetclose inetget inetgetinfo inetgetsize inetread inidelete iniread inireadsection inireadsectionnames inirenamesection iniwrite iniwritesection inputbox int isadmin isarray isbinary isbool isdeclared isdllstruct isfloat isfunc ishwnd isint iskeyword isnumber isobj isptr isstring log memgetstats mod mouseclick mouseclickdrag mousedown mousegetcursor mousegetpos mousemove mouseup mousewheel msgbox number objcreate objcreateinterface objevent objevent objget objname onautoitexitregister onautoitexitunregister opt ping pixelchecksum pixelgetcolor pixelsearch processclose processexists processgetstats processlist processsetpriority processwait processwaitclose progressoff progresson progressset ptr random regdelete regenumkey regenumval regread regwrite round run runas runaswait runwait send sendkeepactive seterror setextended shellexecute shellexecutewait shutdown sin sleep soundplay soundsetwavevolume splashimageon splashoff splashtexton sqrt srandom statusbargettext stderrread stdinwrite stdioclose stdoutread string stringaddcr stringcompare stringformat stringfromasciiarray stringinstr stringisalnum stringisalpha stringisascii stringisdigit stringisfloat stringisint stringislower stringisspace stringisupper stringisxdigit stringleft stringlen stringlower stringmid stringregexp stringregexpreplace stringreplace stringreverse stringright stringsplit stringstripcr stringstripws stringtoasciiarray stringtobinary stringtrimleft stringtrimright stringupper tan tcpaccept tcpclosesocket tcpconnect tcplisten tcpnametoip tcprecv tcpsend tcpshutdown tcpstartup timerdiff timerinit tooltip traycreateitem traycreatemenu traygetmsg trayitemdelete trayitemgethandle trayitemgetstate trayitemgettext trayitemsetonevent trayitemsetstate trayitemsettext traysetclick trayseticon traysetonevent traysetpauseicon traysetstate traysettooltip traytip ubound udpbind udpclosesocket udpopen udprecv udpsend udpshutdown udpstartup vargettype winactivate winactive winclose winexists winflash wingetcaretpos wingetclasslist wingetclientsize wingethandle wingetpos wingetprocess wingetstate wingettext wingettitle winkill winlist winmenuselectitem winminimizeall winminimizeallundo winmove winsetontop winsetstate winsettitle winsettrans winwait winwaitactive winwaitclose winwaitnotactive
do we need this? I don't think any other language has that, and better fit for a tag file, doesn't it? If we want different highlighting for known function names, we probably should rather play with Scintilla's rainbow identifiers or simply set this dynamically from a tags file (which is indeed not currently possible and has performance questions, but well).
Not a blocker, but it looks a bit odd.
+[keywords] +keywords=and byref case const continuecase continueloop default dim do else elseif endfunc endif endselect endswitch endwith enum exit exitloop false for func global if in local next not null or redim return select static step switch then to true until volatile wend while with +functions=abs acos adlibregister adlibunregister asc ascw asin assign atan autoitsetoption autoitwingettitle autoitwinsettitle beep binary binarylen binarymid binarytostring bitand bitnot bitor bitrotate bitshift bitxor blockinput break call cdtray ceiling chr chrw clipget clipput consoleread consolewrite consolewriteerror controlclick controlcommand controldisable controlenable controlfocus controlgetfocus controlgethandle controlgetpos controlgettext controlhide controllistview controlmove controlsend controlsettext controlshow controltreeview cos dec dircopy dircreate dirgetsize dirmove dirremove dllcall dllcalladdress dllcallbackfree dllcallbackgetptr dllcallbackregister dllclose dllopen dllstructcreate dllstructgetdata dllstructgetptr dllstructgetsize dllstructsetdata drivegetdrive drivegetfilesystem drivegetlabel drivegetserial drivegettype drivemapadd drivemapdel drivemapget drivesetlabel drivespacefree drivespacetotal drivestatus envget envset envupdate eval execute exp filechangedir fileclose filecopy filecreatentfslink filecreateshortcut filedelete fileexists filefindfirstfile filefindnextfile fileflush filegetattrib filegetencoding filegetlongname filegetpos filegetshortcut filegetshortname filegetsize filegettime filegetversion fileinstall filemove fileopen fileopendialog fileread filereadline filereadtoarray filerecycle filerecycleempty filesavedialog fileselectfolder filesetattrib filesetend filesetpos filesettime filewrite filewriteline floor ftpsetproxy funcname guicreate guictrlcreateavi guictrlcreatebutton guictrlcreatecheckbox guictrlcreatecombo guictrlcreatecontextmenu guictrlcreatedate guictrlcreatedummy guictrlcreateedit guictrlcreategraphic guictrlcreategroup guictrlcreateicon guictrlcreateinput guictrlcreatelabel guictrlcreatelist guictrlcreatelistview guictrlcreatelistviewitem guictrlcreatemenu guictrlcreatemenuitem guictrlcreatemonthcal guictrlcreateobj guictrlcreatepic guictrlcreateprogress guictrlcreateradio guictrlcreateslider guictrlcreatetab guictrlcreatetabitem guictrlcreatetreeview guictrlcreatetreeviewitem guictrlcreateupdown guictrldelete guictrlgethandle guictrlgetstate guictrlread guictrlrecvmsg guictrlregisterlistviewsort guictrlsendmsg guictrlsendtodummy guictrlsetbkcolor guictrlsetcolor guictrlsetcursor guictrlsetdata guictrlsetdefbkcolor guictrlsetdefcolor guictrlsetfont guictrlsetgraphic guictrlsetimage guictrlsetlimit guictrlsetonevent guictrlsetpos guictrlsetresizing guictrlsetstate guictrlsetstyle guictrlsettip guidelete guigetcursorinfo guigetmsg guigetstyle guiregistermsg guisetaccelerators guisetbkcolor guisetcoord guisetcursor guisetfont guisethelp guiseticon guisetonevent guisetstate guisetstyle guistartgroup guiswitch hex hotkeyset httpsetproxy httpsetuseragent hwnd inetclose inetget inetgetinfo inetgetsize inetread inidelete iniread inireadsection inireadsectionnames inirenamesection iniwrite iniwritesection inputbox int isadmin isarray isbinary isbool isdeclared isdllstruct isfloat isfunc ishwnd isint iskeyword isnumber isobj isptr isstring log memgetstats mod mouseclick mouseclickdrag mousedown mousegetcursor mousegetpos mousemove mouseup mousewheel msgbox number objcreate objcreateinterface objevent objevent objget objname onautoitexitregister onautoitexitunregister opt ping pixelchecksum pixelgetcolor pixelsearch processclose processexists processgetstats processlist processsetpriority processwait processwaitclose progressoff progresson progressset ptr random regdelete regenumkey regenumval regread regwrite round run runas runaswait runwait send sendkeepactive seterror setextended shellexecute shellexecutewait shutdown sin sleep soundplay soundsetwavevolume splashimageon splashoff splashtexton sqrt srandom statusbargettext stderrread stdinwrite stdioclose stdoutread string stringaddcr stringcompare stringformat stringfromasciiarray stringinstr stringisalnum stringisalpha stringisascii stringisdigit stringisfloat stringisint stringislower stringisspace stringisupper stringisxdigit stringleft stringlen stringlower stringmid stringregexp stringregexpreplace stringreplace stringreverse stringright stringsplit stringstripcr stringstripws stringtoasciiarray stringtobinary stringtrimleft stringtrimright stringupper tan tcpaccept tcpclosesocket tcpconnect tcplisten tcpnametoip tcprecv tcpsend tcpshutdown tcpstartup timerdiff timerinit tooltip traycreateitem traycreatemenu traygetmsg trayitemdelete trayitemgethandle trayitemgetstate trayitemgettext trayitemsetonevent trayitemsetstate trayitemsettext traysetclick trayseticon traysetonevent traysetpauseicon traysetstate traysettooltip traytip ubound udpbind udpclosesocket udpopen udprecv udpsend udpshutdown udpstartup vargettype winactivate winactive winclose winexists winflash wingetcaretpos wingetclasslist wingetclientsize wingethandle wingetpos wingetprocess wingetstate wingettext wingettitle winkill winlist winmenuselectitem winminimizeall winminimizeallundo winmove winsetontop winsetstate winsettitle winsettrans winwait winwaitactive winwaitclose winwaitnotactive +macros=@appdatacommondir @appdatadir @autoitexe @autoitpid @autoitversion @autoitx64 @com_eventobj @commonfilesdir @compiled @computername @comspec @cpuarch @cr @crlf @desktopcommondir @desktopdepth @desktopdir @desktopheight @desktoprefresh @desktopwidth @documentscommondir @error @exitcode @exitmethod @extended @favoritescommondir @favoritesdir @gui_ctrlhandle @gui_ctrlid @gui_dragfile @gui_dragid @gui_dropid @gui_winhandle @homedrive @homepath @homeshare @hotkeypressed @hour @ipaddress1 @ipaddress2 @ipaddress3 @ipaddress4 @kblayout @lf @localappdatadir @logondnsdomain @logondomain @logonserver @mday @min @mon @msec @muilang @mydocumentsdir @numparams @osarch @osbuild @oslang @osservicepack @ostype @osversion @programfilesdir @programscommondir @programsdir @scriptdir @scriptfullpath @scriptlinenumber @scriptname @sec @startmenucommondir @startmenudir @startupcommondir @startupdir @sw_disable @sw_enable @sw_hide @sw_lock @sw_maximize @sw_minimize @sw_restore @sw_show @sw_showdefault @sw_showmaximized @sw_showminimized @sw_showminnoactive @sw_showna @sw_shownoactivate @sw_shownormal @sw_unlock @systemdir @tab @tempdir @tray_id @trayiconflashing @trayiconvisible @username @userprofiledir @wday @windowsdir @workingdir @yday @year +sent={!} {#} {^} {{} {}} {+} {alt} {altdown} {altup} {appskey} {asc} {backspace} {break} {browser_back} {browser_favorites} {browser_forward} {browser_home} {browser_refresh} {browser_search} {browser_stop} {bs} {capslock} {ctrldown} {ctrlup} {del} {delete} {down} {end} {enter} {esc} {escape} {f1} {f10} {f11} {f12} {f2} {f3} {f4} {f5} {f6} {f7} {f8} {f9} {home} {ins} {insert} {lalt} {launch_app1} {launch_app2} {launch_mail} {launch_media} {lctrl} {left} {lshift} {lwin} {lwindown} {lwinup} {media_next} {media_play_pause} {media_prev} {media_stop} {numlock} {numpad0} {numpad1} {numpad2} {numpad3} {numpad4} {numpad5} {numpad6} {numpad7} {numpad8} {numpad9} {numpadadd} {numpaddiv} {numpaddot} {numpadenter} {numpadmult} {numpadsub} {oem_102} {pause} {pgdn} {pgup} {printscreen} {ralt} {rctrl} {right} {rshift} {rwin} {rwindown} {rwinup} {scrolllock} {shiftdown} {shiftup} {sleep} {space} {tab} {up} {volume_down} {volume_mute} {volume_up} +preprocessor=#ce #comments-end #comments-start #cs #include #include-once #notrayicon #onautoitstartregister #requireadmin +special=#endregion #forcedef #forceref #ignorefunc #pragma #region +expand= +udf= + +[lexer_properties] +#settings for folding comment blocks and preprocessor lines +fold.comment=1 +fold.compact=0 +fold.preprocessor=1
You shouldn't be setting those here, they are not lexer-specific and we set them unconditionally (to the same values, even). If there is *really* a compelling reason to set them for this filetype, comment them out for them to be easy to find, but don't set them in case we wanna change Geany's default one day.
@@ -0,0 +1,121 @@
+/*
All comments on this file are optional, as it's UCTags' upstream. I just take this opportunity to make comment on this, but anything here should be changed upstream first -- or at the same time.
+/*
+* FUNCTION DEFINITIONS +*/ +static void findAutoItTags (void) +{ + vString *name = vStringNew (); + const unsigned char *line; + + while ((line = readLineFromInputFile ()) != NULL) + { + const unsigned char* p = line; + if (p [0] == '#') + { + /* min. string "#region" > 7 */ + if ((p [1] == 'R' || p [1] == 'r') && + strlen ((const char *) p) > 8 &&
Why `strlen()` here? It'll highly likely be slower than manually checking the characters, and as a C string always ends with a `NUL` byte, it's safe to drop it, the character checks would catch a premature end.
- vString *name = vStringNew ();
+ const unsigned char *line; + + while ((line = readLineFromInputFile ()) != NULL) + { + const unsigned char* p = line; + if (p [0] == '#') + { + /* min. string "#region" > 7 */ + if ((p [1] == 'R' || p [1] == 'r') && + strlen ((const char *) p) > 8 && + (p [2] == 'E' || p [2] == 'e') && + (p [3] == 'G' || p [3] == 'g') && + (p [4] == 'I' || p [4] == 'i') && + (p [5] == 'O' || p [5] == 'o') && + (p [6] == 'N' || p [6] == 'n'))
Doesn't the syntax require a whitespace after the `#region`? This would catch `#regionfoobar something` as a region named `foobar something`
- vString *name = vStringNew ();
+ const unsigned char *line; + + while ((line = readLineFromInputFile ()) != NULL) + { + const unsigned char* p = line; + if (p [0] == '#') + { + /* min. string "#region" > 7 */ + if ((p [1] == 'R' || p [1] == 'r') && + strlen ((const char *) p) > 8 && + (p [2] == 'E' || p [2] == 'e') && + (p [3] == 'G' || p [3] == 'g') && + (p [4] == 'I' || p [4] == 'i') && + (p [5] == 'O' || p [5] == 'o') && + (p [6] == 'N' || p [6] == 'n'))
Depending on the syntax limitation, you could also want to restrict the set of characters allowed for the region's name, but that might be less of a problem.
+ if (vStringLength(name) > 0) + { + makeSimpleTag (name, AutoItKinds, K_REGION); + vStringClear (name); + } + } + } + else + { + /* skip white space */ + while (isspace ((int) *p)) + ++p; + /* min. string "func a()" == 8 */ + if ((p [0] == 'F' || p [0] == 'f') && + strlen ((const char *) p) >= 8 &&
again, the `strlen()` check doesn't seem very useful.
@@ -74,7 +74,7 @@ index ed47aa8..e58f1ab 100644
LINK_LEXER(lmAsm); - LINK_LEXER(lmAsn1); - LINK_LEXER(lmASY); -- LINK_LEXER(lmAU3); + LINK_LEXER(lmAU3);
You also need to change the diff section header to match (`-77,123 +77,51`) as you're changing the final line count.
To be clear, b4n's changes on the parser are for ctags and he should have made them there if he doesn't like the parser :)
Do not make the parser in Geany different to upstream, we have enough of those already!!!
@elextr yeah, I should have made them on the PR integrating the parser to UCTags, but I missed that train. I'm commenting here because it's an opportunity, but yes any change should be made in UCTags, and then imported.
Skif-off commented on this pull request.
@@ -0,0 +1,72 @@
+# For complete documentation of this file, please see Geany's main documentation +# AutoIt 3.3.14.2 +[styling] +# Edit these in the colorscheme .conf file instead +default=default +comment=comment +commentblock=comment +number=number +function=function +keyword=type
Hm, I don't remember why I used this style, I will fix it.
Skif-off commented on this pull request.
@@ -0,0 +1,72 @@
+# For complete documentation of this file, please see Geany's main documentation +# AutoIt 3.3.14.2 +[styling] +# Edit these in the colorscheme .conf file instead +default=default +comment=comment
Usually AutoIt's line and block comments are highlighted equally and I did it this way. Is it mistake?
All ```filetypes*``` are editable files, if needed :)
Skif-off commented on this pull request.
@@ -0,0 +1,72 @@
+# For complete documentation of this file, please see Geany's main documentation +# AutoIt 3.3.14.2 +[styling] +# Edit these in the colorscheme .conf file instead +default=default +comment=comment +commentblock=comment +number=number +function=function +keyword=type +macro=preprocessor +string=string +operator=operator +variable=keyword_2
```identifier == default``` in all Geany's colorshemes (default and from [here](https://github.com/geany/geany-themes)), but I wanted to use the highlighting. Some```filetypes*``` has ```variable=type```, but I already use ```type``` and I took ```keyword_2``` because that it no one uses and it looks normal in all colorschemes.
I don't know what to do here.
Skif-off commented on this pull request.
+function=function
+keyword=type +macro=preprocessor +string=string +operator=operator +variable=keyword_2 +sent=other +preprocessor=preprocessor +special=type +expand=default +comobj=keyword_1 +udf=class + +[keywords] +keywords=and byref case const continuecase continueloop default dim do else elseif endfunc endif endselect endswitch endwith enum exit exitloop false for func global if in local next not null or redim return select static step switch then to true until volatile wend while with +functions=abs acos adlibregister adlibunregister asc ascw asin assign atan autoitsetoption autoitwingettitle autoitwinsettitle beep binary binarylen binarymid binarytostring bitand bitnot bitor bitrotate bitshift bitxor blockinput break call cdtray ceiling chr chrw clipget clipput consoleread consolewrite consolewriteerror controlclick controlcommand controldisable controlenable controlfocus controlgetfocus controlgethandle controlgetpos controlgettext controlhide controllistview controlmove controlsend controlsettext controlshow controltreeview cos dec dircopy dircreate dirgetsize dirmove dirremove dllcall dllcalladdress dllcallbackfree dllcallbackgetptr dllcallbackregister dllclose dllopen dllstructcreate dllstructgetdata dllstructgetptr dllstructgetsize dllstructsetdata drivegetdrive drivegetfilesystem drivegetlabel drivegetserial drivegettype drivemapadd drivemapdel drivemapget drivesetlabel drivespacefree drivespacetotal drivestatus envget envset envupdate eval execute exp filechangedir fileclose filecopy filecreatentfslink filecreateshortcut filedelete fileexists filefindfirstfile filefindnextfile fileflush filegetattrib filegetencoding filegetlongname filegetpos filegetshortcut filegetshortname filegetsize filegettime filegetversion fileinstall filemove fileopen fileopendialog fileread filereadline filereadtoarray filerecycle filerecycleempty filesavedialog fileselectfolder filesetattrib filesetend filesetpos filesettime filewrite filewriteline floor ftpsetproxy funcname guicreate guictrlcreateavi guictrlcreatebutton guictrlcreatecheckbox guictrlcreatecombo guictrlcreatecontextmenu guictrlcreatedate guictrlcreatedummy guictrlcreateedit guictrlcreategraphic guictrlcreategroup guictrlcreateicon guictrlcreateinput guictrlcreatelabel guictrlcreatelist guictrlcreatelistview guictrlcreatelistviewitem guictrlcreatemenu guictrlcreatemenuitem guictrlcreatemonthcal guictrlcreateobj guictrlcreatepic guictrlcreateprogress guictrlcreateradio guictrlcreateslider guictrlcreatetab guictrlcreatetabitem guictrlcreatetreeview guictrlcreatetreeviewitem guictrlcreateupdown guictrldelete guictrlgethandle guictrlgetstate guictrlread guictrlrecvmsg guictrlregisterlistviewsort guictrlsendmsg guictrlsendtodummy guictrlsetbkcolor guictrlsetcolor guictrlsetcursor guictrlsetdata guictrlsetdefbkcolor guictrlsetdefcolor guictrlsetfont guictrlsetgraphic guictrlsetimage guictrlsetlimit guictrlsetonevent guictrlsetpos guictrlsetresizing guictrlsetstate guictrlsetstyle guictrlsettip guidelete guigetcursorinfo guigetmsg guigetstyle guiregistermsg guisetaccelerators guisetbkcolor guisetcoord guisetcursor guisetfont guisethelp guiseticon guisetonevent guisetstate guisetstyle guistartgroup guiswitch hex hotkeyset httpsetproxy httpsetuseragent hwnd inetclose inetget inetgetinfo inetgetsize inetread inidelete iniread inireadsection inireadsectionnames inirenamesection iniwrite iniwritesection inputbox int isadmin isarray isbinary isbool isdeclared isdllstruct isfloat isfunc ishwnd isint iskeyword isnumber isobj isptr isstring log memgetstats mod mouseclick mouseclickdrag mousedown mousegetcursor mousegetpos mousemove mouseup mousewheel msgbox number objcreate objcreateinterface objevent objevent objget objname onautoitexitregister onautoitexitunregister opt ping pixelchecksum pixelgetcolor pixelsearch processclose processexists processgetstats processlist processsetpriority processwait processwaitclose progressoff progresson progressset ptr random regdelete regenumkey regenumval regread regwrite round run runas runaswait runwait send sendkeepactive seterror setextended shellexecute shellexecutewait shutdown sin sleep soundplay soundsetwavevolume splashimageon splashoff splashtexton sqrt srandom statusbargettext stderrread stdinwrite stdioclose stdoutread string stringaddcr stringcompare stringformat stringfromasciiarray stringinstr stringisalnum stringisalpha stringisascii stringisdigit stringisfloat stringisint stringislower stringisspace stringisupper stringisxdigit stringleft stringlen stringlower stringmid stringregexp stringregexpreplace stringreplace stringreverse stringright stringsplit stringstripcr stringstripws stringtoasciiarray stringtobinary stringtrimleft stringtrimright stringupper tan tcpaccept tcpclosesocket tcpconnect tcplisten tcpnametoip tcprecv tcpsend tcpshutdown tcpstartup timerdiff timerinit tooltip traycreateitem traycreatemenu traygetmsg trayitemdelete trayitemgethandle trayitemgetstate trayitemgettext trayitemsetonevent trayitemsetstate trayitemsettext traysetclick trayseticon traysetonevent traysetpauseicon traysetstate traysettooltip traytip ubound udpbind udpclosesocket udpopen udprecv udpsend udpshutdown udpstartup vargettype winactivate winactive winclose winexists winflash wingetcaretpos wingetclasslist wingetclientsize wingethandle wingetpos wingetprocess wingetstate wingettext wingettitle winkill winlist winmenuselectitem winminimizeall winminimizeallundo winmove winsetontop winsetstate winsettitle winsettrans winwait winwaitactive winwaitclose winwaitnotactive
Sorry, I don't understand :) Lists of keywords and internal functions are normal practice (Lisp, Latex, Fortran, FreeBasic, Python, Lua and so on).
b4n commented on this pull request.
@@ -0,0 +1,72 @@
+# For complete documentation of this file, please see Geany's main documentation +# AutoIt 3.3.14.2 +[styling] +# Edit these in the colorscheme .conf file instead +default=default +comment=comment
We have 2 named styles: one for single-line comments, and one for multi-line comments. While most of the colorschemes (if not all) use the same colors for both, it's a good thing to still differentiate those in the filetypes files to so a colorscheme that would want to style them different would work consistently with all filetypes.
Skif-off commented on this pull request.
+[keywords] +keywords=and byref case const continuecase continueloop default dim do else elseif endfunc endif endselect endswitch endwith enum exit exitloop false for func global if in local next not null or redim return select static step switch then to true until volatile wend while with +functions=abs acos adlibregister adlibunregister asc ascw asin assign atan autoitsetoption autoitwingettitle autoitwinsettitle beep binary binarylen binarymid binarytostring bitand bitnot bitor bitrotate bitshift bitxor blockinput break call cdtray ceiling chr chrw clipget clipput consoleread consolewrite consolewriteerror controlclick controlcommand controldisable controlenable controlfocus controlgetfocus controlgethandle controlgetpos controlgettext controlhide controllistview controlmove controlsend controlsettext controlshow controltreeview cos dec dircopy dircreate dirgetsize dirmove dirremove dllcall dllcalladdress dllcallbackfree dllcallbackgetptr dllcallbackregister dllclose dllopen dllstructcreate dllstructgetdata dllstructgetptr dllstructgetsize dllstructsetdata drivegetdrive drivegetfilesystem drivegetlabel drivegetserial drivegettype drivemapadd drivemapdel drivemapget drivesetlabel drivespacefree drivespacetotal drivestatus envget envset envupdate eval execute exp filechangedir fileclose filecopy filecreatentfslink filecreateshortcut filedelete fileexists filefindfirstfile filefindnextfile fileflush filegetattrib filegetencoding filegetlongname filegetpos filegetshortcut filegetshortname filegetsize filegettime filegetversion fileinstall filemove fileopen fileopendialog fileread filereadline filereadtoarray filerecycle filerecycleempty filesavedialog fileselectfolder filesetattrib filesetend filesetpos filesettime filewrite filewriteline floor ftpsetproxy funcname guicreate guictrlcreateavi guictrlcreatebutton guictrlcreatecheckbox guictrlcreatecombo guictrlcreatecontextmenu guictrlcreatedate guictrlcreatedummy guictrlcreateedit guictrlcreategraphic guictrlcreategroup guictrlcreateicon guictrlcreateinput guictrlcreatelabel guictrlcreatelist guictrlcreatelistview guictrlcreatelistviewitem guictrlcreatemenu guictrlcreatemenuitem guictrlcreatemonthcal guictrlcreateobj guictrlcreatepic guictrlcreateprogress guictrlcreateradio guictrlcreateslider guictrlcreatetab guictrlcreatetabitem guictrlcreatetreeview guictrlcreatetreeviewitem guictrlcreateupdown guictrldelete guictrlgethandle guictrlgetstate guictrlread guictrlrecvmsg guictrlregisterlistviewsort guictrlsendmsg guictrlsendtodummy guictrlsetbkcolor guictrlsetcolor guictrlsetcursor guictrlsetdata guictrlsetdefbkcolor guictrlsetdefcolor guictrlsetfont guictrlsetgraphic guictrlsetimage guictrlsetlimit guictrlsetonevent guictrlsetpos guictrlsetresizing guictrlsetstate guictrlsetstyle guictrlsettip guidelete guigetcursorinfo guigetmsg guigetstyle guiregistermsg guisetaccelerators guisetbkcolor guisetcoord guisetcursor guisetfont guisethelp guiseticon guisetonevent guisetstate guisetstyle guistartgroup guiswitch hex hotkeyset httpsetproxy httpsetuseragent hwnd inetclose inetget inetgetinfo inetgetsize inetread inidelete iniread inireadsection inireadsectionnames inirenamesection iniwrite iniwritesection inputbox int isadmin isarray isbinary isbool isdeclared isdllstruct isfloat isfunc ishwnd isint iskeyword isnumber isobj isptr isstring log memgetstats mod mouseclick mouseclickdrag mousedown mousegetcursor mousegetpos mousemove mouseup mousewheel msgbox number objcreate objcreateinterface objevent objevent objget objname onautoitexitregister onautoitexitunregister opt ping pixelchecksum pixelgetcolor pixelsearch processclose processexists processgetstats processlist processsetpriority processwait processwaitclose progressoff progresson progressset ptr random regdelete regenumkey regenumval regread regwrite round run runas runaswait runwait send sendkeepactive seterror setextended shellexecute shellexecutewait shutdown sin sleep soundplay soundsetwavevolume splashimageon splashoff splashtexton sqrt srandom statusbargettext stderrread stdinwrite stdioclose stdoutread string stringaddcr stringcompare stringformat stringfromasciiarray stringinstr stringisalnum stringisalpha stringisascii stringisdigit stringisfloat stringisint stringislower stringisspace stringisupper stringisxdigit stringleft stringlen stringlower stringmid stringregexp stringregexpreplace stringreplace stringreverse stringright stringsplit stringstripcr stringstripws stringtoasciiarray stringtobinary stringtrimleft stringtrimright stringupper tan tcpaccept tcpclosesocket tcpconnect tcplisten tcpnametoip tcprecv tcpsend tcpshutdown tcpstartup timerdiff timerinit tooltip traycreateitem traycreatemenu traygetmsg trayitemdelete trayitemgethandle trayitemgetstate trayitemgettext trayitemsetonevent trayitemsetstate trayitemsettext traysetclick trayseticon traysetonevent traysetpauseicon traysetstate traysettooltip traytip ubound udpbind udpclosesocket udpopen udprecv udpsend udpshutdown udpstartup vargettype winactivate winactive winclose winexists winflash wingetcaretpos wingetclasslist wingetclientsize wingethandle wingetpos wingetprocess wingetstate wingettext wingettitle winkill winlist winmenuselectitem winminimizeall winminimizeallundo winmove winsetontop winsetstate winsettitle winsettrans winwait winwaitactive winwaitclose winwaitnotactive +macros=@appdatacommondir @appdatadir @autoitexe @autoitpid @autoitversion @autoitx64 @com_eventobj @commonfilesdir @compiled @computername @comspec @cpuarch @cr @crlf @desktopcommondir @desktopdepth @desktopdir @desktopheight @desktoprefresh @desktopwidth @documentscommondir @error @exitcode @exitmethod @extended @favoritescommondir @favoritesdir @gui_ctrlhandle @gui_ctrlid @gui_dragfile @gui_dragid @gui_dropid @gui_winhandle @homedrive @homepath @homeshare @hotkeypressed @hour @ipaddress1 @ipaddress2 @ipaddress3 @ipaddress4 @kblayout @lf @localappdatadir @logondnsdomain @logondomain @logonserver @mday @min @mon @msec @muilang @mydocumentsdir @numparams @osarch @osbuild @oslang @osservicepack @ostype @osversion @programfilesdir @programscommondir @programsdir @scriptdir @scriptfullpath @scriptlinenumber @scriptname @sec @startmenucommondir @startmenudir @startupcommondir @startupdir @sw_disable @sw_enable @sw_hide @sw_lock @sw_maximize @sw_minimize @sw_restore @sw_show @sw_showdefault @sw_showmaximized @sw_showminimized @sw_showminnoactive @sw_showna @sw_shownoactivate @sw_shownormal @sw_unlock @systemdir @tab @tempdir @tray_id @trayiconflashing @trayiconvisible @username @userprofiledir @wday @windowsdir @workingdir @yday @year +sent={!} {#} {^} {{} {}} {+} {alt} {altdown} {altup} {appskey} {asc} {backspace} {break} {browser_back} {browser_favorites} {browser_forward} {browser_home} {browser_refresh} {browser_search} {browser_stop} {bs} {capslock} {ctrldown} {ctrlup} {del} {delete} {down} {end} {enter} {esc} {escape} {f1} {f10} {f11} {f12} {f2} {f3} {f4} {f5} {f6} {f7} {f8} {f9} {home} {ins} {insert} {lalt} {launch_app1} {launch_app2} {launch_mail} {launch_media} {lctrl} {left} {lshift} {lwin} {lwindown} {lwinup} {media_next} {media_play_pause} {media_prev} {media_stop} {numlock} {numpad0} {numpad1} {numpad2} {numpad3} {numpad4} {numpad5} {numpad6} {numpad7} {numpad8} {numpad9} {numpadadd} {numpaddiv} {numpaddot} {numpadenter} {numpadmult} {numpadsub} {oem_102} {pause} {pgdn} {pgup} {printscreen} {ralt} {rctrl} {right} {rshift} {rwin} {rwindown} {rwinup} {scrolllock} {shiftdown} {shiftup} {sleep} {space} {tab} {up} {volume_down} {volume_mute} {volume_up} +preprocessor=#ce #comments-end #comments-start #cs #include #include-once #notrayicon #onautoitstartregister #requireadmin +special=#endregion #forcedef #forceref #ignorefunc #pragma #region +expand= +udf= + +[lexer_properties] +#settings for folding comment blocks and preprocessor lines +fold.comment=1 +fold.compact=0 +fold.preprocessor=1
I added default values from AutoIt Lexer just in case because I found them in ```LexAU3.cxx``` only. I think I will comment them.
b4n commented on this pull request.
@@ -0,0 +1,72 @@
+# For complete documentation of this file, please see Geany's main documentation +# AutoIt 3.3.14.2 +[styling] +# Edit these in the colorscheme .conf file instead +default=default +comment=comment +commentblock=comment +number=number +function=function +keyword=type +macro=preprocessor +string=string +operator=operator +variable=keyword_2
OK… I'm not sure either what to do here, and I guess this is one of the instances where the named styles we provide are not always enough.
The actual problem is possibly more subtle, it `identifier` might be styled as `default` by most colorschemes because doing otherwise results in weird behavior in some filetypes, which might be for a bad reason; or it might be that we don't have enough subtleties in the styles we provide.
@codebrainz do you have an opinion?
b4n commented on this pull request.
+function=function
+keyword=type +macro=preprocessor +string=string +operator=operator +variable=keyword_2 +sent=other +preprocessor=preprocessor +special=type +expand=default +comobj=keyword_1 +udf=class + +[keywords] +keywords=and byref case const continuecase continueloop default dim do else elseif endfunc endif endselect endswitch endwith enum exit exitloop false for func global if in local next not null or redim return select static step switch then to true until volatile wend while with +functions=abs acos adlibregister adlibunregister asc ascw asin assign atan autoitsetoption autoitwingettitle autoitwinsettitle beep binary binarylen binarymid binarytostring bitand bitnot bitor bitrotate bitshift bitxor blockinput break call cdtray ceiling chr chrw clipget clipput consoleread consolewrite consolewriteerror controlclick controlcommand controldisable controlenable controlfocus controlgetfocus controlgethandle controlgetpos controlgettext controlhide controllistview controlmove controlsend controlsettext controlshow controltreeview cos dec dircopy dircreate dirgetsize dirmove dirremove dllcall dllcalladdress dllcallbackfree dllcallbackgetptr dllcallbackregister dllclose dllopen dllstructcreate dllstructgetdata dllstructgetptr dllstructgetsize dllstructsetdata drivegetdrive drivegetfilesystem drivegetlabel drivegetserial drivegettype drivemapadd drivemapdel drivemapget drivesetlabel drivespacefree drivespacetotal drivestatus envget envset envupdate eval execute exp filechangedir fileclose filecopy filecreatentfslink filecreateshortcut filedelete fileexists filefindfirstfile filefindnextfile fileflush filegetattrib filegetencoding filegetlongname filegetpos filegetshortcut filegetshortname filegetsize filegettime filegetversion fileinstall filemove fileopen fileopendialog fileread filereadline filereadtoarray filerecycle filerecycleempty filesavedialog fileselectfolder filesetattrib filesetend filesetpos filesettime filewrite filewriteline floor ftpsetproxy funcname guicreate guictrlcreateavi guictrlcreatebutton guictrlcreatecheckbox guictrlcreatecombo guictrlcreatecontextmenu guictrlcreatedate guictrlcreatedummy guictrlcreateedit guictrlcreategraphic guictrlcreategroup guictrlcreateicon guictrlcreateinput guictrlcreatelabel guictrlcreatelist guictrlcreatelistview guictrlcreatelistviewitem guictrlcreatemenu guictrlcreatemenuitem guictrlcreatemonthcal guictrlcreateobj guictrlcreatepic guictrlcreateprogress guictrlcreateradio guictrlcreateslider guictrlcreatetab guictrlcreatetabitem guictrlcreatetreeview guictrlcreatetreeviewitem guictrlcreateupdown guictrldelete guictrlgethandle guictrlgetstate guictrlread guictrlrecvmsg guictrlregisterlistviewsort guictrlsendmsg guictrlsendtodummy guictrlsetbkcolor guictrlsetcolor guictrlsetcursor guictrlsetdata guictrlsetdefbkcolor guictrlsetdefcolor guictrlsetfont guictrlsetgraphic guictrlsetimage guictrlsetlimit guictrlsetonevent guictrlsetpos guictrlsetresizing guictrlsetstate guictrlsetstyle guictrlsettip guidelete guigetcursorinfo guigetmsg guigetstyle guiregistermsg guisetaccelerators guisetbkcolor guisetcoord guisetcursor guisetfont guisethelp guiseticon guisetonevent guisetstate guisetstyle guistartgroup guiswitch hex hotkeyset httpsetproxy httpsetuseragent hwnd inetclose inetget inetgetinfo inetgetsize inetread inidelete iniread inireadsection inireadsectionnames inirenamesection iniwrite iniwritesection inputbox int isadmin isarray isbinary isbool isdeclared isdllstruct isfloat isfunc ishwnd isint iskeyword isnumber isobj isptr isstring log memgetstats mod mouseclick mouseclickdrag mousedown mousegetcursor mousegetpos mousemove mouseup mousewheel msgbox number objcreate objcreateinterface objevent objevent objget objname onautoitexitregister onautoitexitunregister opt ping pixelchecksum pixelgetcolor pixelsearch processclose processexists processgetstats processlist processsetpriority processwait processwaitclose progressoff progresson progressset ptr random regdelete regenumkey regenumval regread regwrite round run runas runaswait runwait send sendkeepactive seterror setextended shellexecute shellexecutewait shutdown sin sleep soundplay soundsetwavevolume splashimageon splashoff splashtexton sqrt srandom statusbargettext stderrread stdinwrite stdioclose stdoutread string stringaddcr stringcompare stringformat stringfromasciiarray stringinstr stringisalnum stringisalpha stringisascii stringisdigit stringisfloat stringisint stringislower stringisspace stringisupper stringisxdigit stringleft stringlen stringlower stringmid stringregexp stringregexpreplace stringreplace stringreverse stringright stringsplit stringstripcr stringstripws stringtoasciiarray stringtobinary stringtrimleft stringtrimright stringupper tan tcpaccept tcpclosesocket tcpconnect tcplisten tcpnametoip tcprecv tcpsend tcpshutdown tcpstartup timerdiff timerinit tooltip traycreateitem traycreatemenu traygetmsg trayitemdelete trayitemgethandle trayitemgetstate trayitemgettext trayitemsetonevent trayitemsetstate trayitemsettext traysetclick trayseticon traysetonevent traysetpauseicon traysetstate traysettooltip traytip ubound udpbind udpclosesocket udpopen udprecv udpsend udpshutdown udpstartup vargettype winactivate winactive winclose winexists winflash wingetcaretpos wingetclasslist wingetclientsize wingethandle wingetpos wingetprocess wingetstate wingettext wingettitle winkill winlist winmenuselectitem winminimizeall winminimizeallundo winmove winsetontop winsetstate winsettitle winsettrans winwait winwaitactive winwaitclose winwaitnotactive
Keywords are of course fine. Internal functions… you're right, I guess I just felt like there was a little too many of them. I guess leave it like that then.
b4n commented on this pull request.
+[keywords] +keywords=and byref case const continuecase continueloop default dim do else elseif endfunc endif endselect endswitch endwith enum exit exitloop false for func global if in local next not null or redim return select static step switch then to true until volatile wend while with +functions=abs acos adlibregister adlibunregister asc ascw asin assign atan autoitsetoption autoitwingettitle autoitwinsettitle beep binary binarylen binarymid binarytostring bitand bitnot bitor bitrotate bitshift bitxor blockinput break call cdtray ceiling chr chrw clipget clipput consoleread consolewrite consolewriteerror controlclick controlcommand controldisable controlenable controlfocus controlgetfocus controlgethandle controlgetpos controlgettext controlhide controllistview controlmove controlsend controlsettext controlshow controltreeview cos dec dircopy dircreate dirgetsize dirmove dirremove dllcall dllcalladdress dllcallbackfree dllcallbackgetptr dllcallbackregister dllclose dllopen dllstructcreate dllstructgetdata dllstructgetptr dllstructgetsize dllstructsetdata drivegetdrive drivegetfilesystem drivegetlabel drivegetserial drivegettype drivemapadd drivemapdel drivemapget drivesetlabel drivespacefree drivespacetotal drivestatus envget envset envupdate eval execute exp filechangedir fileclose filecopy filecreatentfslink filecreateshortcut filedelete fileexists filefindfirstfile filefindnextfile fileflush filegetattrib filegetencoding filegetlongname filegetpos filegetshortcut filegetshortname filegetsize filegettime filegetversion fileinstall filemove fileopen fileopendialog fileread filereadline filereadtoarray filerecycle filerecycleempty filesavedialog fileselectfolder filesetattrib filesetend filesetpos filesettime filewrite filewriteline floor ftpsetproxy funcname guicreate guictrlcreateavi guictrlcreatebutton guictrlcreatecheckbox guictrlcreatecombo guictrlcreatecontextmenu guictrlcreatedate guictrlcreatedummy guictrlcreateedit guictrlcreategraphic guictrlcreategroup guictrlcreateicon guictrlcreateinput guictrlcreatelabel guictrlcreatelist guictrlcreatelistview guictrlcreatelistviewitem guictrlcreatemenu guictrlcreatemenuitem guictrlcreatemonthcal guictrlcreateobj guictrlcreatepic guictrlcreateprogress guictrlcreateradio guictrlcreateslider guictrlcreatetab guictrlcreatetabitem guictrlcreatetreeview guictrlcreatetreeviewitem guictrlcreateupdown guictrldelete guictrlgethandle guictrlgetstate guictrlread guictrlrecvmsg guictrlregisterlistviewsort guictrlsendmsg guictrlsendtodummy guictrlsetbkcolor guictrlsetcolor guictrlsetcursor guictrlsetdata guictrlsetdefbkcolor guictrlsetdefcolor guictrlsetfont guictrlsetgraphic guictrlsetimage guictrlsetlimit guictrlsetonevent guictrlsetpos guictrlsetresizing guictrlsetstate guictrlsetstyle guictrlsettip guidelete guigetcursorinfo guigetmsg guigetstyle guiregistermsg guisetaccelerators guisetbkcolor guisetcoord guisetcursor guisetfont guisethelp guiseticon guisetonevent guisetstate guisetstyle guistartgroup guiswitch hex hotkeyset httpsetproxy httpsetuseragent hwnd inetclose inetget inetgetinfo inetgetsize inetread inidelete iniread inireadsection inireadsectionnames inirenamesection iniwrite iniwritesection inputbox int isadmin isarray isbinary isbool isdeclared isdllstruct isfloat isfunc ishwnd isint iskeyword isnumber isobj isptr isstring log memgetstats mod mouseclick mouseclickdrag mousedown mousegetcursor mousegetpos mousemove mouseup mousewheel msgbox number objcreate objcreateinterface objevent objevent objget objname onautoitexitregister onautoitexitunregister opt ping pixelchecksum pixelgetcolor pixelsearch processclose processexists processgetstats processlist processsetpriority processwait processwaitclose progressoff progresson progressset ptr random regdelete regenumkey regenumval regread regwrite round run runas runaswait runwait send sendkeepactive seterror setextended shellexecute shellexecutewait shutdown sin sleep soundplay soundsetwavevolume splashimageon splashoff splashtexton sqrt srandom statusbargettext stderrread stdinwrite stdioclose stdoutread string stringaddcr stringcompare stringformat stringfromasciiarray stringinstr stringisalnum stringisalpha stringisascii stringisdigit stringisfloat stringisint stringislower stringisspace stringisupper stringisxdigit stringleft stringlen stringlower stringmid stringregexp stringregexpreplace stringreplace stringreverse stringright stringsplit stringstripcr stringstripws stringtoasciiarray stringtobinary stringtrimleft stringtrimright stringupper tan tcpaccept tcpclosesocket tcpconnect tcplisten tcpnametoip tcprecv tcpsend tcpshutdown tcpstartup timerdiff timerinit tooltip traycreateitem traycreatemenu traygetmsg trayitemdelete trayitemgethandle trayitemgetstate trayitemgettext trayitemsetonevent trayitemsetstate trayitemsettext traysetclick trayseticon traysetonevent traysetpauseicon traysetstate traysettooltip traytip ubound udpbind udpclosesocket udpopen udprecv udpsend udpshutdown udpstartup vargettype winactivate winactive winclose winexists winflash wingetcaretpos wingetclasslist wingetclientsize wingethandle wingetpos wingetprocess wingetstate wingettext wingettitle winkill winlist winmenuselectitem winminimizeall winminimizeallundo winmove winsetontop winsetstate winsettitle winsettrans winwait winwaitactive winwaitclose winwaitnotactive +macros=@appdatacommondir @appdatadir @autoitexe @autoitpid @autoitversion @autoitx64 @com_eventobj @commonfilesdir @compiled @computername @comspec @cpuarch @cr @crlf @desktopcommondir @desktopdepth @desktopdir @desktopheight @desktoprefresh @desktopwidth @documentscommondir @error @exitcode @exitmethod @extended @favoritescommondir @favoritesdir @gui_ctrlhandle @gui_ctrlid @gui_dragfile @gui_dragid @gui_dropid @gui_winhandle @homedrive @homepath @homeshare @hotkeypressed @hour @ipaddress1 @ipaddress2 @ipaddress3 @ipaddress4 @kblayout @lf @localappdatadir @logondnsdomain @logondomain @logonserver @mday @min @mon @msec @muilang @mydocumentsdir @numparams @osarch @osbuild @oslang @osservicepack @ostype @osversion @programfilesdir @programscommondir @programsdir @scriptdir @scriptfullpath @scriptlinenumber @scriptname @sec @startmenucommondir @startmenudir @startupcommondir @startupdir @sw_disable @sw_enable @sw_hide @sw_lock @sw_maximize @sw_minimize @sw_restore @sw_show @sw_showdefault @sw_showmaximized @sw_showminimized @sw_showminnoactive @sw_showna @sw_shownoactivate @sw_shownormal @sw_unlock @systemdir @tab @tempdir @tray_id @trayiconflashing @trayiconvisible @username @userprofiledir @wday @windowsdir @workingdir @yday @year +sent={!} {#} {^} {{} {}} {+} {alt} {altdown} {altup} {appskey} {asc} {backspace} {break} {browser_back} {browser_favorites} {browser_forward} {browser_home} {browser_refresh} {browser_search} {browser_stop} {bs} {capslock} {ctrldown} {ctrlup} {del} {delete} {down} {end} {enter} {esc} {escape} {f1} {f10} {f11} {f12} {f2} {f3} {f4} {f5} {f6} {f7} {f8} {f9} {home} {ins} {insert} {lalt} {launch_app1} {launch_app2} {launch_mail} {launch_media} {lctrl} {left} {lshift} {lwin} {lwindown} {lwinup} {media_next} {media_play_pause} {media_prev} {media_stop} {numlock} {numpad0} {numpad1} {numpad2} {numpad3} {numpad4} {numpad5} {numpad6} {numpad7} {numpad8} {numpad9} {numpadadd} {numpaddiv} {numpaddot} {numpadenter} {numpadmult} {numpadsub} {oem_102} {pause} {pgdn} {pgup} {printscreen} {ralt} {rctrl} {right} {rshift} {rwin} {rwindown} {rwinup} {scrolllock} {shiftdown} {shiftup} {sleep} {space} {tab} {up} {volume_down} {volume_mute} {volume_up} +preprocessor=#ce #comments-end #comments-start #cs #include #include-once #notrayicon #onautoitstartregister #requireadmin +special=#endregion #forcedef #forceref #ignorefunc #pragma #region +expand= +udf= + +[lexer_properties] +#settings for folding comment blocks and preprocessor lines +fold.comment=1 +fold.compact=0 +fold.preprocessor=1
these are generic fold properties that are used by most lexers supporting folding. I think you should just drop them from here.
Skif-off commented on this pull request.
@@ -0,0 +1,121 @@
+/*
I took it from another parser and added all needed info for possible maintainers: links to homepage and documentations and a list of what the parser can do. You can find discussion [here](https://github.com/universal-ctags/ctags/pull/1598).
Skif-off commented on this pull request.
@@ -0,0 +1,72 @@
+# For complete documentation of this file, please see Geany's main documentation +# AutoIt 3.3.14.2 +[styling] +# Edit these in the colorscheme .conf file instead +default=default +comment=comment
Ok, I will fix it.
Skif-off commented on this pull request.
+[keywords] +keywords=and byref case const continuecase continueloop default dim do else elseif endfunc endif endselect endswitch endwith enum exit exitloop false for func global if in local next not null or redim return select static step switch then to true until volatile wend while with +functions=abs acos adlibregister adlibunregister asc ascw asin assign atan autoitsetoption autoitwingettitle autoitwinsettitle beep binary binarylen binarymid binarytostring bitand bitnot bitor bitrotate bitshift bitxor blockinput break call cdtray ceiling chr chrw clipget clipput consoleread consolewrite consolewriteerror controlclick controlcommand controldisable controlenable controlfocus controlgetfocus controlgethandle controlgetpos controlgettext controlhide controllistview controlmove controlsend controlsettext controlshow controltreeview cos dec dircopy dircreate dirgetsize dirmove dirremove dllcall dllcalladdress dllcallbackfree dllcallbackgetptr dllcallbackregister dllclose dllopen dllstructcreate dllstructgetdata dllstructgetptr dllstructgetsize dllstructsetdata drivegetdrive drivegetfilesystem drivegetlabel drivegetserial drivegettype drivemapadd drivemapdel drivemapget drivesetlabel drivespacefree drivespacetotal drivestatus envget envset envupdate eval execute exp filechangedir fileclose filecopy filecreatentfslink filecreateshortcut filedelete fileexists filefindfirstfile filefindnextfile fileflush filegetattrib filegetencoding filegetlongname filegetpos filegetshortcut filegetshortname filegetsize filegettime filegetversion fileinstall filemove fileopen fileopendialog fileread filereadline filereadtoarray filerecycle filerecycleempty filesavedialog fileselectfolder filesetattrib filesetend filesetpos filesettime filewrite filewriteline floor ftpsetproxy funcname guicreate guictrlcreateavi guictrlcreatebutton guictrlcreatecheckbox guictrlcreatecombo guictrlcreatecontextmenu guictrlcreatedate guictrlcreatedummy guictrlcreateedit guictrlcreategraphic guictrlcreategroup guictrlcreateicon guictrlcreateinput guictrlcreatelabel guictrlcreatelist guictrlcreatelistview guictrlcreatelistviewitem guictrlcreatemenu guictrlcreatemenuitem guictrlcreatemonthcal guictrlcreateobj guictrlcreatepic guictrlcreateprogress guictrlcreateradio guictrlcreateslider guictrlcreatetab guictrlcreatetabitem guictrlcreatetreeview guictrlcreatetreeviewitem guictrlcreateupdown guictrldelete guictrlgethandle guictrlgetstate guictrlread guictrlrecvmsg guictrlregisterlistviewsort guictrlsendmsg guictrlsendtodummy guictrlsetbkcolor guictrlsetcolor guictrlsetcursor guictrlsetdata guictrlsetdefbkcolor guictrlsetdefcolor guictrlsetfont guictrlsetgraphic guictrlsetimage guictrlsetlimit guictrlsetonevent guictrlsetpos guictrlsetresizing guictrlsetstate guictrlsetstyle guictrlsettip guidelete guigetcursorinfo guigetmsg guigetstyle guiregistermsg guisetaccelerators guisetbkcolor guisetcoord guisetcursor guisetfont guisethelp guiseticon guisetonevent guisetstate guisetstyle guistartgroup guiswitch hex hotkeyset httpsetproxy httpsetuseragent hwnd inetclose inetget inetgetinfo inetgetsize inetread inidelete iniread inireadsection inireadsectionnames inirenamesection iniwrite iniwritesection inputbox int isadmin isarray isbinary isbool isdeclared isdllstruct isfloat isfunc ishwnd isint iskeyword isnumber isobj isptr isstring log memgetstats mod mouseclick mouseclickdrag mousedown mousegetcursor mousegetpos mousemove mouseup mousewheel msgbox number objcreate objcreateinterface objevent objevent objget objname onautoitexitregister onautoitexitunregister opt ping pixelchecksum pixelgetcolor pixelsearch processclose processexists processgetstats processlist processsetpriority processwait processwaitclose progressoff progresson progressset ptr random regdelete regenumkey regenumval regread regwrite round run runas runaswait runwait send sendkeepactive seterror setextended shellexecute shellexecutewait shutdown sin sleep soundplay soundsetwavevolume splashimageon splashoff splashtexton sqrt srandom statusbargettext stderrread stdinwrite stdioclose stdoutread string stringaddcr stringcompare stringformat stringfromasciiarray stringinstr stringisalnum stringisalpha stringisascii stringisdigit stringisfloat stringisint stringislower stringisspace stringisupper stringisxdigit stringleft stringlen stringlower stringmid stringregexp stringregexpreplace stringreplace stringreverse stringright stringsplit stringstripcr stringstripws stringtoasciiarray stringtobinary stringtrimleft stringtrimright stringupper tan tcpaccept tcpclosesocket tcpconnect tcplisten tcpnametoip tcprecv tcpsend tcpshutdown tcpstartup timerdiff timerinit tooltip traycreateitem traycreatemenu traygetmsg trayitemdelete trayitemgethandle trayitemgetstate trayitemgettext trayitemsetonevent trayitemsetstate trayitemsettext traysetclick trayseticon traysetonevent traysetpauseicon traysetstate traysettooltip traytip ubound udpbind udpclosesocket udpopen udprecv udpsend udpshutdown udpstartup vargettype winactivate winactive winclose winexists winflash wingetcaretpos wingetclasslist wingetclientsize wingethandle wingetpos wingetprocess wingetstate wingettext wingettitle winkill winlist winmenuselectitem winminimizeall winminimizeallundo winmove winsetontop winsetstate winsettitle winsettrans winwait winwaitactive winwaitclose winwaitnotactive +macros=@appdatacommondir @appdatadir @autoitexe @autoitpid @autoitversion @autoitx64 @com_eventobj @commonfilesdir @compiled @computername @comspec @cpuarch @cr @crlf @desktopcommondir @desktopdepth @desktopdir @desktopheight @desktoprefresh @desktopwidth @documentscommondir @error @exitcode @exitmethod @extended @favoritescommondir @favoritesdir @gui_ctrlhandle @gui_ctrlid @gui_dragfile @gui_dragid @gui_dropid @gui_winhandle @homedrive @homepath @homeshare @hotkeypressed @hour @ipaddress1 @ipaddress2 @ipaddress3 @ipaddress4 @kblayout @lf @localappdatadir @logondnsdomain @logondomain @logonserver @mday @min @mon @msec @muilang @mydocumentsdir @numparams @osarch @osbuild @oslang @osservicepack @ostype @osversion @programfilesdir @programscommondir @programsdir @scriptdir @scriptfullpath @scriptlinenumber @scriptname @sec @startmenucommondir @startmenudir @startupcommondir @startupdir @sw_disable @sw_enable @sw_hide @sw_lock @sw_maximize @sw_minimize @sw_restore @sw_show @sw_showdefault @sw_showmaximized @sw_showminimized @sw_showminnoactive @sw_showna @sw_shownoactivate @sw_shownormal @sw_unlock @systemdir @tab @tempdir @tray_id @trayiconflashing @trayiconvisible @username @userprofiledir @wday @windowsdir @workingdir @yday @year +sent={!} {#} {^} {{} {}} {+} {alt} {altdown} {altup} {appskey} {asc} {backspace} {break} {browser_back} {browser_favorites} {browser_forward} {browser_home} {browser_refresh} {browser_search} {browser_stop} {bs} {capslock} {ctrldown} {ctrlup} {del} {delete} {down} {end} {enter} {esc} {escape} {f1} {f10} {f11} {f12} {f2} {f3} {f4} {f5} {f6} {f7} {f8} {f9} {home} {ins} {insert} {lalt} {launch_app1} {launch_app2} {launch_mail} {launch_media} {lctrl} {left} {lshift} {lwin} {lwindown} {lwinup} {media_next} {media_play_pause} {media_prev} {media_stop} {numlock} {numpad0} {numpad1} {numpad2} {numpad3} {numpad4} {numpad5} {numpad6} {numpad7} {numpad8} {numpad9} {numpadadd} {numpaddiv} {numpaddot} {numpadenter} {numpadmult} {numpadsub} {oem_102} {pause} {pgdn} {pgup} {printscreen} {ralt} {rctrl} {right} {rshift} {rwin} {rwindown} {rwinup} {scrolllock} {shiftdown} {shiftup} {sleep} {space} {tab} {up} {volume_down} {volume_mute} {volume_up} +preprocessor=#ce #comments-end #comments-start #cs #include #include-once #notrayicon #onautoitstartregister #requireadmin +special=#endregion #forcedef #forceref #ignorefunc #pragma #region +expand= +udf= + +[lexer_properties] +#settings for folding comment blocks and preprocessor lines +fold.comment=1 +fold.compact=0 +fold.preprocessor=1
Ok.
Skif-off commented on this pull request.
+/*
+* FUNCTION DEFINITIONS +*/ +static void findAutoItTags (void) +{ + vString *name = vStringNew (); + const unsigned char *line; + + while ((line = readLineFromInputFile ()) != NULL) + { + const unsigned char* p = line; + if (p [0] == '#') + { + /* min. string "#region" > 7 */ + if ((p [1] == 'R' || p [1] == 'r') && + strlen ((const char *) p) > 8 &&
How can I use subscript (for examle ```p [1]```) if I don't know subscript dimension range, i.e. string length?
Skif-off commented on this pull request.
- vString *name = vStringNew ();
+ const unsigned char *line; + + while ((line = readLineFromInputFile ()) != NULL) + { + const unsigned char* p = line; + if (p [0] == '#') + { + /* min. string "#region" > 7 */ + if ((p [1] == 'R' || p [1] == 'r') && + strlen ((const char *) p) > 8 && + (p [2] == 'E' || p [2] == 'e') && + (p [3] == 'G' || p [3] == 'g') && + (p [4] == 'I' || p [4] == 'i') && + (p [5] == 'O' || p [5] == 'o') && + (p [6] == 'N' || p [6] == 'n'))
Valid syntax: ```autoit #Region #Region ;foobar something #Region;foobar something #Region foobar something ``` In other cases string will be ignored (and of course in first case it will not be shown in the list of symbols too). Works fine, I use it long time ago.
Skif-off commented on this pull request.
@@ -74,7 +74,7 @@ index ed47aa8..e58f1ab 100644
LINK_LEXER(lmAsm); - LINK_LEXER(lmAsn1); - LINK_LEXER(lmASY); -- LINK_LEXER(lmAU3); + LINK_LEXER(lmAU3);
I will check and fix it.
b4n commented on this pull request.
+/*
+* FUNCTION DEFINITIONS +*/ +static void findAutoItTags (void) +{ + vString *name = vStringNew (); + const unsigned char *line; + + while ((line = readLineFromInputFile ()) != NULL) + { + const unsigned char* p = line; + if (p [0] == '#') + { + /* min. string "#region" > 7 */ + if ((p [1] == 'R' || p [1] == 'r') && + strlen ((const char *) p) > 8 &&
C strings have a last element with value `0`, which is actually delimiting the end of the string. `strlen(str)` is just going through `str` to find at which offset `0` is found (it could basically be implemented as `for (len = 0; str[len] != 0; len++);`).
Anyway, this means that so long as none of the characters before the subscript has value `0`, the next one is a valid subscript -- it just can be the last one if it has value `0`. Thus, as you check the values of subscripts successively against a defined set *not including* `0`, you're sure that you won't try subscripting past the end of the string, otherwise your tests would have to be false already anyway. So if `p[1]` is either `'R'` or `'r'` (so not `0`), `p[2]` has to be a valid subscript.
b4n commented on this pull request.
- vString *name = vStringNew ();
+ const unsigned char *line; + + while ((line = readLineFromInputFile ()) != NULL) + { + const unsigned char* p = line; + if (p [0] == '#') + { + /* min. string "#region" > 7 */ + if ((p [1] == 'R' || p [1] == 'r') && + strlen ((const char *) p) > 8 && + (p [2] == 'E' || p [2] == 'e') && + (p [3] == 'G' || p [3] == 'g') && + (p [4] == 'I' || p [4] == 'i') && + (p [5] == 'O' || p [5] == 'o') && + (p [6] == 'N' || p [6] == 'n'))
Hum, I just tested whether I'm wasn't crazy, and I ain't: ```autoit #regiontest #endregion ``` results in showing a region named `test` in the symbols tree.
It might be considered OK as this is probably invalid syntax, I'm just mentioning this so you can make an informed decision whether it's a problem or an acceptable behavior given invalid input not worth handling.
--- Additionally with your examples, the leading `;` is included in the displayed region name, is that intentional? If not, you probably could simply use ```c while (isspace ((int) *p) || *p == ';') ``` below. It would allow for `#region;;;;foo`, but that might be valid or OK to get wrong (as suggested above, it can be considered OK to emit improper tags in invalid input)
@Skif-off pushed 1 commit.
37f4131 Some small fixes (filetypes.autoit and scintilla_changes.patch)
b4n approved this pull request.
Looks good. Just needs squashing and should be good to go.
Skif-off commented on this pull request.
- vString *name = vStringNew ();
+ const unsigned char *line; + + while ((line = readLineFromInputFile ()) != NULL) + { + const unsigned char* p = line; + if (p [0] == '#') + { + /* min. string "#region" > 7 */ + if ((p [1] == 'R' || p [1] == 'r') && + strlen ((const char *) p) > 8 && + (p [2] == 'E' || p [2] == 'e') && + (p [3] == 'G' || p [3] == 'g') && + (p [4] == 'I' || p [4] == 'i') && + (p [5] == 'O' || p [5] == 'o') && + (p [6] == 'N' || p [6] == 'n'))
results in showing a region named ```test``` in the symbols tree.
I cheked it again and now I see, I don't know what it was :) It's not valid syntax, in this case Geany does not highlight ```#Region``` and I think it's good notice to check.
Additionally with your examples, the leading ```;``` is included in the displayed region name, is that intentional? If not, you probably could simply use ...
I could not find the info (documentation, official and not official forum) how to use it correctly and what will be region name. I checked all variants with AutoIt's tool that checks the syntax of AutoIt scripts and decided to leave so.
This is often used, I personally use form ```#Region ;test``` because in this case name ```;test``` has a different color than the color of ```#Region```, I like this.
Skif-off commented on this pull request.
+/*
+* FUNCTION DEFINITIONS +*/ +static void findAutoItTags (void) +{ + vString *name = vStringNew (); + const unsigned char *line; + + while ((line = readLineFromInputFile ()) != NULL) + { + const unsigned char* p = line; + if (p [0] == '#') + { + /* min. string "#region" > 7 */ + if ((p [1] == 'R' || p [1] == 'r') && + strlen ((const char *) p) > 8 &&
I remembered why I used ```strlen()``` :) Besides subscript. Function defining: ```autoit Func t() ``` function name is ```t``` and one symbol is a minimum length of name. If string beginning with ```func``` then we have define of function , but if string length less 8 symbols then we have not valid function name, i.e. we have not function name, and this string should be discarded.
b4n commented on this pull request.
- vString *name = vStringNew ();
+ const unsigned char *line; + + while ((line = readLineFromInputFile ()) != NULL) + { + const unsigned char* p = line; + if (p [0] == '#') + { + /* min. string "#region" > 7 */ + if ((p [1] == 'R' || p [1] == 'r') && + strlen ((const char *) p) > 8 && + (p [2] == 'E' || p [2] == 'e') && + (p [3] == 'G' || p [3] == 'g') && + (p [4] == 'I' || p [4] == 'i') && + (p [5] == 'O' || p [5] == 'o') && + (p [6] == 'N' || p [6] == 'n'))
I'm not sure, but I actually expect the `;` to start a standard comment, so it's probably an unnamed region, with just a comment that happens to be there.
b4n commented on this pull request.
+/*
+* FUNCTION DEFINITIONS +*/ +static void findAutoItTags (void) +{ + vString *name = vStringNew (); + const unsigned char *line; + + while ((line = readLineFromInputFile ()) != NULL) + { + const unsigned char* p = line; + if (p [0] == '#') + { + /* min. string "#region" > 7 */ + if ((p [1] == 'R' || p [1] == 'r') && + strlen ((const char *) p) > 8 &&
I still think it's irrelevant, because it's then an "optimization" (as the code after more correctly checks the syntax), but it only kicks in when the there is less than an extra 8 characters after the line starting with `f`. This is highly unlikely to result in any speed benefits (especially as you're checking the next characters for `unc[ \t]`), and is highly likely to let pass things that aren't a function anyway but just happen to be long enough.
In any case, unless profiling shows this is faster (I doubt it), the clearest/simplest thing should be used IMO, which IMO again, is dropping this check.
Skif-off commented on this pull request.
- vString *name = vStringNew ();
+ const unsigned char *line; + + while ((line = readLineFromInputFile ()) != NULL) + { + const unsigned char* p = line; + if (p [0] == '#') + { + /* min. string "#region" > 7 */ + if ((p [1] == 'R' || p [1] == 'r') && + strlen ((const char *) p) > 8 && + (p [2] == 'E' || p [2] == 'e') && + (p [3] == 'G' || p [3] == 'g') && + (p [4] == 'I' || p [4] == 'i') && + (p [5] == 'O' || p [5] == 'o') && + (p [6] == 'N' || p [6] == 'n'))
I think yes, most likely, but it's used, it works (in other editors too), it's not a glaring mistake and I decided to do so.
b4n commented on this pull request.
@@ -0,0 +1,121 @@
+/*
Let's stop hijacking your PR and continue at https://github.com/universal-ctags/ctags/pull/1811 :)
Skif-off commented on this pull request.
@@ -0,0 +1,121 @@
+/*
Sorry, I can not check it in Geany (maybe because CTags version is more old?), I could not transfer the changes to my PR. I checked your PR in CTags and it seems that working fine.
b4n commented on this pull request.
@@ -0,0 +1,121 @@
+/*
Yeah it's using features we don't yet have, but there's a PR on importing that, I just have to finish reviewing it (and it's huge).
Skif-off commented on this pull request.
@@ -0,0 +1,121 @@
+/*
Is it your local, not public PR for now (i.e. in your PC)? I could not find it here and in your fork of Geany's repository.
elextr commented on this pull request.
@@ -0,0 +1,121 @@
+/*
I think @b4n means #1263, but even that is almost 2 years olde because its so big.
Skif-off commented on this pull request.
@@ -0,0 +1,121 @@
+/*
and it's huge
I don't know how to express the degree (level?) of my impression on English :))
elextr commented on this pull request.
@@ -0,0 +1,121 @@
+/*
"Oh [expletive deleted] " :grin:
Skif-off commented on this pull request.
@@ -0,0 +1,121 @@
+/*
But it can be try to use right now, isn't it?
Skif-off commented on this pull request.
@@ -0,0 +1,121 @@
+/*
I tried to use [#1263](https://github.com/geany/geany/pull/1263): as I understand, [#1263](https://github.com/geany/geany/pull/1263) requires updating from Geany's upstream and from UCTags's upstream too... I'm sorry that I can't help :(
@b4n can you look at this [parser](https://github.com/Skif-off/geany/blob/30036ffee8062fb9fb466eb485a3f9a82ff03...), if you have free time? I maked small update from UCTags's upstream, (until UCTags is updated in Geany).
Hm... Travis is fail with ``` MINGW=yes```, but as I understood it's not my fault, isn't it?
@Skif-off pushed 1 commit.
cd35a16 UPD: Small update of AutoIt parser from UCTags's upstream
@Skif-off pushed 1 commit.
ed8d316 UPD: AutoIt version and kick for Travis
@Skif-off pushed 1 commit.
da71687 Temporary: Fix conflict
@Skif-off pushed 1 commit.
c22a5b7 CHG: scintilla_changes.patch
@Skif-off pushed 1 commit.
e8be1f5 UPD: LexAU3.cxx
@Skif-off pushed 1 commit.
b4bf813dd8125d30f6f933b3b3fc92a0a27d7181 Temporary: conflict will fix later
@Skif-off pushed 1 commit.
0975a6b6f32f514d1cedb480a038dde6be70246f Temporary (will squash now)
@Skif-off pushed 1 commit.
2114d932fbf1daea7a52d16ea6c23656038d11eb Temporary (interferes rebase, will be squash later)
@Skif-off pushed 2 commits.
2a06a251facaa27273e037b77c3287680927babb Temporary (interferes rebase, will be squash later) 2 42fc589dd5340bbd512603144ef705d10778f2c3 Temporary (interferes rebase, will be squash later) 3
@Skif-off pushed 2 commits.
02975c5e577fe16fb592c75bab230abb1e01f81c Temporary c5c02ffa3aab381f72a8114b1318c4be88b989ee Temporary2
@Skif-off pushed 1 commit.
81673582969fd540ea2f685751af494fba8c657d Temp
@Skif-off pushed 1 commit.
c0ed9c75aa0d5ec3735a08700d71bb828e3a6347 Temp
@Skif-off pushed 1 commit.
2ee37c7af1df8a397a9222c86a82f6904695762d Tmp
New parser from UCtags doesn't work (Geany fail after start). Is it problem with some new/latest feature(s) of UCtags?
Geany fail after start
Can you elaborate? A [backtrace](https://www.geany.org/support/bugs) would help troubleshoot.
I forgot that under Linux instead Win will be more detailed: ``` Starting program: /usr/local/bin/geany -v [Thread debugging using libthread_db enabled] Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
(process:19323): Tagmanager-ERROR **: 13:32:37.609: Different number of tag types in TM (2) and ctags (5) for AutoIt
Program received signal SIGTRAP, Trace/breakpoint trap. 0x00007ffff5563e11 in ?? () from /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0 (gdb) bt #0 0x00007ffff5563e11 in () at /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0 #1 0x00007ffff5564eac in g_log_default_handler () at /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0 #2 0x00007ffff7944f3c in handler_log (domain=0x7ffff7b5d8bd "Tagmanager", level=6, msg=0x55555578d2b0 "Different number of tag types in TM (2) and ctags (5) for AutoIt", data=<optimized out>) at log.c:136 #3 0x00007ffff556513d in g_logv () at /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0 #4 0x00007ffff55652af in g_log () at /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0 #5 0x00007ffff7b00861 in tm_parser_verify_type_mappings () at tm_parser.c:698 #6 0x00007ffff7b03827 in tm_create_workspace () at tm_workspace.c:83 #7 0x00007ffff7b03827 in tm_get_workspace () at tm_workspace.c:121 #8 0x00007ffff7945f97 in main_lib (argc=<optimized out>, argv=<optimized out>) at libmain.c:1070 #9 0x00007ffff74f8b97 in __libc_start_main (main= 0x555555554600 <main>, argc=2, argv=0x7fffffffe0c8, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7fffffffe0b8) at ../csu/libc-start.c:310 #10 0x000055555555463a in _start () ```
Hmm... It's my fault: I thought that I must write in ```TMParserMapEntry``` only nedeed symbols.
@Skif-off pushed 1 commit.
73a644b89cc1b7a8389621661ede214cdac2fd29 FIX: Number of tag types
@Skif-off pushed 1 commit.
14b9593052326c626f44c48c6e7605d397921b7a FIX: Test
@Skif-off pushed 1 commit.
b02b6f4a6a4bf5e38b1a793025a843bb8839e2a0 Tmp
@Skif-off pushed 1 commit.
ab9900a9a62354532f71cc4f974ae297fee7c450 Tmp
@Skif-off pushed 1 commit.
745e985cc701ef714da192ee52cdf0cce9340b13 Tmp
@Skif-off pushed 1 commit.
9817e6888894b2ba5f40247cea578c9adfc8a13b Tmp
@Skif-off pushed 1 commit.
9745ddc8175c7636dea11b0531f7fb539c1197f0 Tmp
@Skif-off pushed 30 commits.
21b06d1e4bf18f2cab137ab08a976dbf14274d58 prefer XDG_RUNTIME_DIR over /tmp for the socket (#2222) 7214a646f8b467f5c790c786bcc4c2f8b4226e21 Update ja.po: "Appearance" "外観"→"出現" (#2255) 46d5e7542b8396ed593f2e319f71d153a67684dc Add support for fractional font sizes c29bf208530f4a852c176afd6b8f65e1436c4611 Show the GTK/GLib versions in about dialog (#2163) ec0e11ca040ef142ca1ab09f34951bf809b8839d [docs] Move error_regex section to [build-menu]; add filetype example aa90ea7035d0c01d1c5f00d97a0820a9daefac02 build.c: Replace ASSIGNIF inline macro with assign_cmd function d19f7719a5c3c81b4fa87df4bd2c7d8f3959e117 Add Groovy custom filetype (#2188) d80e36e85a031fc266fe200add05f0626a0696ad TypeScript syntax highlighting 434cfe580b0fdf4cf4cd02f4f7cb0bbbfa922f5e build.h: Move GBO_TO_* macros to build.c f088e7bdf62b706cb3a3970cf2f937a7e7408d66 Move GEANY_GBO_COMPILE etc to build.c 0ce5d5484e39edc25bc996cc0bf01f5bdc2b5221 build.c: Remove g_ptr_array_foreach with gpointer user_data & update HACKING (#2270) c88c27e2d22dbff72488d8a57a825830fb833682 Fix broken markup in HACKING 64a32db5e1d202b9055dd90dab335f7c2afa62c0 tests: unit test for some util strv functions 30a486d62462ad2bf34ac7af48547053f7167441 utils: fix suboptimal elipsis substitution by utils_strv_shorten_file_list() 72d9f378e0de976a6d3d9b5fb3107c1979f8895b utils: refactor utils_strv_shorten_file_list() and friends 4b4a41e7f54eb1de3941854fc66f53811fb70ef9 utils: move utils_strv_shorten_file_list() out of GEANY_PRIVATE 746697ab07e87077758c0b71280cf90cd01a5146 Merge pull request #2262 from kugel-/fix-1445 411aa99c00f6af1156f0a7d891dfcf0ed072e476 configure: check for realpath function now MSYS2 has it (#2263) 21488bc4b225e777130daa72d2470e8da87970f8 Update po files for string freeze of 1.36 0a9d076c688e72dc5e6211e287e00933cd6a3f44 Small update of the French translation a4e27a04a96fa6f80ee78927da18569a91837c0c Update version info for French translation 9e1bccc1c4b057eb4a2f14066ac6f46aa8f7e7c2 Small update of German translation b52a1ef8fd5e201d35921002fa4549fa7b5a4ac1 Update of NEWS for translation updates since 1.35 736aa5566aa66a7847735361f8a346316c68526d Update of Japanese translation 94a944114ba3d9db4e442472c44127fecf642a42 Update of Portuguese translation 64bd04b1bfb5d2218eee96afccab9c37d59edebb Update danish translation to 1.36 (#2313) 751644ccc7264d50180c2d99c7ddc2a8dea4c32f it.po for 1.36 (#2311) c669e69f000ca1b73ac8729f7614374200dfb43c Updated Danish and Italian translation 328e39a6a419cbf653380716f41916fb96106cbe Update of Spanish translation 96dfbc14e2e38703e289fa41306bf5995597c379 Add AutoIt syntax highlighting and Ctags parser for AutoIt
@Skif-off pushed 19 commits.
f8f4dd891bf1f21c9ebfba6daeb8407cdcb03650 Django highlighting in templates. 81f007297275a21e3d5cb42f3eb243eb1ab49455 Update of Latvian translation (#2319) 4fc18ea17916cce8536c27534229cc96ef3f797f Update of Slovak translation (#2318) 30a2ff697deb6551b8f65aa2a96346e0c0936f04 Add updated sk and lv translation to NEWS b055f59dfdae86e93b9457ebc4957cc4742f5e51 Merge pull request #2315 from djbaldey/django-syntax 7d540edbccc32e9164e21db4f38a796e6f744568 Update zh_CN.po (#2324) 24caa7f6b160f3176376c98acd18ed1e9c230396 Add updated zh_CN to NEWS 99eacb4416b9a0adfed0a1e46ba2740581535fae Fix static build 16e3aa29e24ad9ba419665c86c75e79a87202191 Small update of German translation 83c9042ab75bcc12b87d1fea3399fa5166d00bd0 Add "Nim" to the Programming file types group 51d307c178b4c1f2d7f1220280f5da9a88a6b766 Update NEWS for upcoming 1.36 release 825acb21eabd33390616b224b0454886dc7d6ec2 Set release date c9bdd73d82540bbfe9b13c6b6623e7c96a862f89 Post release version bump 4acdebf46ec2f0e701f541748a941d51b5b9fa94 Small update of making-a-release 22c2b86fbe7df74430835331eccbbce667e149fc Small update of German translation ad5a684c32e2474d00846e4a3edf0c5b8e2a1d47 Make Open Project dialog cancellable without closing existing session bcbae3d49abdb6d27d3627c686bb3b96b338b997 Make New Project dialog cancellable without closing existing session f40569d1c327af162726dbab14a78fd83ca5e0b8 Opening recent projects: Don't ask whether to close current project d35e941f2f1c05330b85260f5c068076d39bd5fb Add AutoIt syntax highlighting and Ctags parser for AutoIt
@Skif-off pushed 1 commit.
0f478a94dc6affe78ec9f7e7b39c79366b362dfc TMP, will be squash later (fix rebase conflict)
@Skif-off pushed 1 commit.
7bbb36e808200c9ecdc65366a2365a9937bbbd8f TMP
@Skif-off pushed 1 commit.
218b2e5fe56e34957942b7f1a5644b4eef33131d TMP
@Skif-off pushed 1 commit.
8cfbb83998b71a05f8e06c06d12e2ec6bfbe9dad TMP
@Skif-off pushed 1 commit.
eeeb9e361ee6252d02c7825ea6464707098e56d3 TEGTE
@Skif-off pushed 1 commit.
ab1395e745f4b6b937fa548179f1f2c978564a87 Add AutoIt syntax highlighting and Ctags parser for AutoIt
@Skif-off pushed 1 commit.
d7e7cb35c7718ead2c9b3fb35585965d7e13823b ADD: lexer_properties section
@Skif-off pushed 1 commit.
a9d0f924a32b13676e28a7e53fc06586bfed8ad0 TMP
@Skif-off pushed 1 commit.
64f97cc54b7822e8bcffca177bc2cb14d669dba1 TMP
@Skif-off pushed 1 commit.
d95b94b6d91c31d4830dbe87aeb9f77f7e57fca5 TMP
@Skif-off pushed 1 commit.
6ee606a0db5e13f23cc64e5c40bfa6cb196b4594 TMP2
Any news?
@Skif-off pushed 1 commit.
46ea3a97bea8efa286304a21c3c44f2eb732ab75 TMP: scintilla_changes.patch
@Skif-off pushed 1 commit.
cbfb1793fd7e7a10ab13f2d12c00face7f80045f Add AutoIt syntax highlighting and Ctags parser for AutoIt
@Skif-off pushed 1 commit.
880b42374ef5084052138d09640fc9225512ac8b TMP
@Skif-off pushed 1 commit.
7f7d82ea0e892fb0d5dac03c69c2bb707d163247 TMP
@Skif-off pushed 1 commit.
fe88f93a625dd295c71f06bdad77b6923f9c75bd An attempt to synchronization
@Skif-off pushed 1 commit.
8cf1d9789d4fd4701906e11ade9b60ee7cfb3da9 TMP
@Skif-off pushed 1 commit.
d11fcf985025f5c73141a5fa7dbae6f69a343153 Add AutoIt syntax highlighting and Ctags parser for AutoIt
@Skif-off pushed 1 commit.
80001e408a26070d3fba6778347e3ef14f050fc7 Fix confl.
@Skif-off pushed 1 commit.
c385005ec546143e466120c17e5e04d639f82eea FIX: Looks like...
@Skif-off pushed 1 commit.
5edd31912853f674a1d8b75fbf8862122ad234d6 TMP
@Skif-off pushed 1 commit.
43fc6766dfc773b321386a25ea7640cfe5118122 TMP
@Skif-off pushed 1 commit.
a752cb8f67651fee1f410a40267f9aad7fdd8ab1 UPD: simple.au3.tags
@Skif-off pushed 1 commit.
d82a3abe88ca08fa8f806c032ffd9b5e5169660b TMP
@Skif-off pushed 1 commit.
7bc8d8a6674f7a38c7cea5c085da98647138d58f UPD: new Scintilla
@Skif-off pushed 1 commit.
3c31a6e4f1c8e6c412bf58e94921fa3dad24c495 UPD: new Scintilla 2
@Skif-off pushed 1 commit.
c396cbfcf67ac40def23560254d32ef291184c49 TMP: rebase, he-he
@Skif-off pushed 1 commit.
c2809e337db9ab48771c9c17140454352c8f90c2 TMP
@Skif-off pushed 1 commit.
7484c4c261d24463812d1a0be79b6f345b16b348 TMPl
@Skif-off pushed 1 commit.
971783b6179383c3d34e8e4231e4b8369588de03 TMP2
@Skif-off pushed 1 commit.
432ab68c25677890c51a93f4168efd693ab70d25 TMP: Try to fix
@Skif-off pushed 1 commit.
1822a96fcfa0aa9d288b7332be8b22784e28d2a3 TMP
@Skif-off pushed 1 commit.
de44095c388578fb02f068dce86580295727f75a TMP
@Skif-off pushed 1 commit.
5e7a1cfa9a339e733ebc2bc3b6049f48f9f6ada0 TMP (will try to fix conflicts)
@Skif-off pushed 1 commit.
e31755bd68e3ade3b52e2273eb91dbf74a3dbee5 TMP
@Skif-off pushed 1 commit.
a368f098fd44324102035bed439a5991b24cbe73 Add AutoIt syntax highlighting and Ctags parser for AutoIt
@Skif-off pushed 1 commit.
7ef0ef6b80f15632610f4c6fed60c2c548c67ca4 FIX build
@Skif-off pushed 1 commit.
a14388d2044647c1d397d953c1836f0beb2c6401 Add AutoIt syntax highlighting and Ctags parser for AutoIt
@Skif-off pushed 1 commit.
9d138427b276ab049261f967afaf05e90422912d Add AutoIt syntax highlighting and Ctags parser for AutoIt
@Skif-off pushed 1 commit.
458af8ec125c90a5e37a7298ecfe71994f0adbf7 Add AutoIt syntax highlighting and Ctags parser for AutoIt
@Skif-off pushed 1 commit.
e2881605d6b93a1b59580080f47d4ce1c48bcaa4 Add AutoIt syntax highlighting and Ctags parser for AutoIt
[/jobs/6309415770](https://github.com/geany/geany/actions/runs/3720132501/jobs/6309415770): What does
(process:10108): Tagmanager-WARNING **: 12:59:46.979: Not all tag types mapped to symbol tree groups for AutoIt
mean? Maybe just drop the test when Meson is used?
@Skif-off pushed 1 commit.
b0502bf24a83fc474177a9ecc5b0dbdae2035dfa Add AutoIt syntax highlighting and Ctags parser for AutoIt
(process:10108): Tagmanager-WARNING **: 12:59:46.979: Not all tag types mapped to symbol tree groups for AutoIt
https://github.com/geany/geany/blob/bb45e3b7485e27f29bf652968b9094da322d0bc7...
Tagmanager and ctags are out of sync for autoit, did your updated parser change something?
@Skif-off pushed 1 commit.
6b6034ce7009cfa4f4506456f613a49302591dd8 TMP, will be squashed later
@Skif-off pushed 1 commit.
1bf4df7b9f1ee6adf9e11b622f47c4732432d4f9 Add AutoIt syntax highlighting and Ctags parser for AutoIt
Parser and lexer are current versions from upstreams (and both have not been updated for a long time). I'm sorry, right now I don't understand what the problem is :) ctags/parsers/autoit.c: ```c static roleDefinition AutoItIncludeRoles [] = { { true, "system", "system include" }, { true, "local", "local include" }, };
static kindDefinition AutoItKinds [] = { { true, 'f', "func", "functions" }, { true, 'r', "region", "regions" }, { true, 'g', "global", "global variables" }, { true, 'l', "local", "local variables" }, { true, 'S', "script", "included scripts", .referenceOnly = true, ATTACH_ROLES (AutoItIncludeRoles) }, }; ```
src/tagmanager/tm_parser.c: ```c static TMParserMapEntry map_AUTOIT[] = { {'f', tm_tag_function_t}, {'r', tm_tag_other_t}, {'g', tm_tag_member_t}, {'l', tm_tag_member_t}, {'S', tm_tag_member_t}, }; static TMParserMapGroup group_AUTOIT[] = { {_("Functions"), TM_ICON_METHOD, tm_tag_function_t}, {_("Regions"), TM_ICON_OTHER, tm_tag_other_t}, }; ```
`AutoItKinds` and `map_AUTOIT` are the same size and as I understand and see, `map_AUTOIT` and `group_AUTOIT` do not have to match in size.
Then something has probably changed in all the big changes in TM recently, @techee?
@Skif-off pushed 1 commit.
51901737a23dc410bcf01bf9140f234b83edab44 Add AutoIt syntax highlighting and Ctags parser for AutoIt
I took a quick look the list of commits and replaced `tm_tag_member_t` with `tm_tag_undef_t` (I tried to remember why I used `tm_tag_member_t` but couldn't): fail.
@Skif-off pushed 1 commit.
bc4d65dd1a3d84da7e69f02701bfc3134a85fdb8 Test with 'tm_tag_undef_t'
@Skif-off pushed 1 commit.
695a7af6b169dcaf0ea9441303344e60224fb9dc Return back
@Skif-off pushed 1 commit.
d136e5189be1f69bb00a9a760d1857ba01e60b41 Add AutoIt syntax highlighting and Ctags parser for AutoIt
(process:10108): Tagmanager-WARNING **: 12:59:46.979: Not all tag types mapped to symbol tree groups for AutoIt
It means that each `tm_tag_...` from ``` static TMParserMapEntry map_AUTOIT[] = { {'f', tm_tag_function_t}, {'r', tm_tag_other_t}, {'g', tm_tag_member_t}, {'l', tm_tag_member_t}, {'S', tm_tag_member_t}, }; ``` has to appear somewhere in ``` static TMParserMapGroup group_AUTOIT[] = { {_("Functions"), TM_ICON_METHOD, tm_tag_function_t}, {_("Regions"), TM_ICON_OTHER, tm_tag_other_t}, }; ``` In this case, you are missing the `tm_tag_member_t `. To solve this, you could create a separate root such as ``` {_("Members"), TM_ICON_OTHER, tm_tag_member_t}, ``` or add it to an existing root such as ``` {_("Functions"), TM_ICON_METHOD, tm_tag_function_t | tm_tag_member_t}, ``` (whatever makes sense for this language).
@techee , yes, I figured it out, I found your commits in upstream: I replaced `tm_tag_member_t` with `tm_tag_undef_t` and updated the `simple.au3.tags` file. but again I got an [error](https://github.com/geany/geany/actions/runs/3733542779/jobs/6334467745) (but no details now).
@Skif-off [this](https://github.com/geany/geany/commit/ad304cf79afbf4dd8080417abbdd27e904b521...) gotcha, the tag file format is pretty printed before `diff`ing.
@elextr , interesting, `simple.html.tags`, for example, contents the same characters, but without error... I will check manually, maybe just disable testing.
No `simple.html.tags` was changed [here](https://github.com/geany/geany/commit/aba66f07cca62b28d33534ec88c686b600fe25...) to match the new format.
Just process your reference tags file with [this](https://github.com/geany/geany/blob/master/scripts/print-tags.py) so it will match the test file that is also processed that way.
@Skif-off pushed 1 commit.
aaaed345031a08c1bcd7aaaa74e7078a45d2b960 Add AutoIt syntax highlighting and Ctags parser for AutoIt
@elextr , @techee , thanks! Now works fine.
@elextr , @techee , thanks! Now works fine.
Great!
We forgot to update the documentation with the pretty-printing script though - I created #3353. @elextr Does it look OK to you?
@Skif-off pushed 1 commit.
b7ccf84891f4653528acf60398da7326713b6f18 Add AutoIt syntax highlighting and Ctags parser for AutoIt
@b4n @techee are you both happy to merge?
Maybe a question - by just having a look at the parser (and not knowing the language), it seems that the parser supports scopes (i.e. nesting one tag inside other tag). The provided unit test only shows some simple script without this. But if scopes are supported, then it should be mentioned inside `tm_parser_has_full_scope()`. Also would be nice to have a unit test that covers scope generation.
I played with the provided unit test a bit and it seems that you can nest one function inside another - in this case the Symbols tree in Geany shows these tags separated by dot instead of displayed as a tree. Adding `TM_PARSER_AUTOIT` to `tm_parser_has_full_scope()` to indicate it has full scope info should fix that.
Second, very minor thing is that in https://github.com/geany/geany/pull/3428 we changed comments for `wordchars` and `comment_use_indent` in the filetype config files and they should be changed here too (but it's something we can do once this PR is merged).
Apart from these minor and trivial to fix problems everything seems to be present, syntax gets highlighted, tags are generated so I think it can be merged.
@Skif-off pushed 1 commit.
c598c9ead6fd919d8ef7e68840e717adef8d917f Improve some comments in filetypes.autoit
by just having a look at the parser (and not knowing the language), it seems that the parser supports scopes (i.e. nesting one tag inside other tag). ... it seems that you can nest one function inside another
It seems the language does not support such constructs.
Any part of code can be placed inside the `#Region ... #EndRegion`, but `#Region ... #EndRegion` is not a regular operator, macro or directive and does not participate in code execution in any way: this is just a visual cue (for the authors, not for the AutoIt), which allows to fold pieces of code. Usually these are some logically related parts of the script - group of functions and/or variables and so on. I'm not sure if I managed to explain correctly, I'm one of those who just use it :)
Second, very minor thing is that in https://github.com/geany/geany/pull/3428 we changed comments for wordchars and comment_use_indent in the filetype config files
Fixed.
It seems the language does not support such constructs.
OK, I mentioned this because I noticed the use of `nestingLevel...()` and `CORK` stuff in the parser which are used for scopes.
Any part of code can be placed inside the #Region ... #EndRegion, but #Region ... #EndRegion is not a regular operator, macro or directive and does not participate in code execution in any way: this is just a visual cue (for the authors, not for the AutoIt), which allows to fold pieces of code. Usually these are some logically related parts of the script - group of functions and/or variables and so on.
Yes, but these get parsed and the scope information gets reported for tags so this parser uses scopes. Even though in this case the scope has at most 2 members, I would suggest putting the parser into the group inside `tm_parser_has_full_scope()` that reports `TRUE` - the second group is more or less reserved for parsers that should return full scope but are a bit buggy which this parser isn't. This will help us keep track of which parsers report scopes and which don't - otherwise this change should have no effect on the unit tests or the symbol tree.
Second, very minor thing is that in https://github.com/geany/geany/pull/3428 we changed comments for wordchars and comment_use_indent in the filetype config files
Fixed.
Great, thanks.
@Skif-off pushed 1 commit.
e7225418b69f70d55119ef4f979ab1c767f92f99 Add TM_PARSER_AUTOIT to tm_parser_has_full_scope()
But if scopes are supported, then it should be mentioned inside `tm_parser_has_full_scope()`.
Done. To be honest, I don't see the difference between `TRUE` and `FALSE` :) ![2023-03-30](https://user-images.githubusercontent.com/6333198/228874594-c34ea718-ae54-44...)
Done.
Thanks. The PR looks good to go from my perspective.
To be honest, I don't see the difference between TRUE and FALSE :)
You won't in this case because the language itself supports only one level of nesting. The change is more for us so we know which languages support scope generation and which don't.
@b4n commented on this pull request.
Apart from the comment, and assuming the parsers and lexers are upstream's, LGTM (esp. if @techee likes it as well :))
- {'g', tm_tag_undef_t},
+ {'l', tm_tag_undef_t},
Don't we want to see at least global variables? And even local ones would be nice, esp. as IIUC they are now not shown but can still be used for autocompletion (@techee?)
@techee commented on this pull request.
- {'g', tm_tag_undef_t},
+ {'l', tm_tag_undef_t},
Yes, that would be nice I think (I didn't mention this because I thought they were disabled for some language-specific reason).
If you decide to enable local variables, please map them to `tm_tag_local_var_t` - this mapping is a bit special as it doesn't make the local variables appear in the sidebar (which is a bit too verbose with them) and only shows them in the autocompletion popup.
@techee commented on this pull request.
- {'g', tm_tag_undef_t},
+ {'l', tm_tag_undef_t},
Plus we want to have all the enabled tags covered by unit tests - I haven't checked if the provided unit test contains local and global tags.
@Skif-off commented on this pull request.
- {'g', tm_tag_undef_t},
+ {'l', tm_tag_undef_t},
I just wanted to add minimal guaranteed working AutoIt support and don't know all the ins and outs of how Geany works. And didn't want to bloat the list of symbols (maybe in the future if anyone wants to).
I.e. `tm_tag_variable_t` for global variables and `tm_tag_local_var_t` for local?
@techee commented on this pull request.
- {'g', tm_tag_undef_t},
+ {'l', tm_tag_undef_t},
I'd suggest that we address this in a separate PR (@b4n what do you think?). This PR works well as it is and I can prepare a PR for the global and local variables afterwards - it should be trivial.
@Skif-off pushed 1 commit.
44611e609c173549450d5d8dd75104ed95ac809f As in 5298f51
@b4n commented on this pull request.
- {'g', tm_tag_undef_t},
+ {'l', tm_tag_undef_t},
@techee sure, that'd be fine as well (although it'd probably get forgotten for a decade or two until somebody notices it from scratch again)
Merged #1752 into master.
OK, I've just merged this PR so we are finally done with it. @Skif-off thanks for your contribution and for your patience!
@techee sure, that'd be fine as well (although it'd probably get forgotten for a decade or two until somebody notices it from scratch again)
@b4n I'm going to do it right now so we don't forget.
github-comments@lists.geany.org