aboutsummaryrefslogtreecommitdiffhomepage
AgeCommit message (Collapse)AuthorFilesLines
2017-03-05updated TODO: some research into savepoints and memory limitingRobin Haberkorn1-12/+22
2017-03-03updated copyright to 2017Robin Haberkorn55-56/+56
2017-03-03build system portability fixesRobin Haberkorn10-28/+1122
* especially to improve building on FreeBSD 11 * We need GNU Make, yet alone because Scintilla/Scinterm needs it. We now document that dependency and added an Autoconf check from the autoconf-archive. We make sure that the build process is invoked with GNU make by generating only GNUmakefiles. The Makefile.am files have not been renamed, so this change can be rolled back easily. * Some GNU-Make-specific autoreconf warnings have still been resolved. But not all of them, as this would have been unelegant and we need GNU Make anyway. * Declare ACLOCAL_AMFLAGS to appease autoreconf * Added an explicit check for C++11 from the autoconf-archives. In general we should support building with every C++11 compiler that is sufficiently GNU-like. * Do not use `sed` for inplace editing, as different sed-implementations have mutually incompatible syntax for this. Instead of declaring and checking a dependency on GNU sed, we simply use SciTECO for the editing task. This improves code portability on BSDs. * Similarily, BSD/POSIX `cmp` is supported now. This fixes the test suite on BSD without declaring a dependency on the GNU coreutils. * Simplified sciteco-wrapper generation.
2017-02-26more fixes for groff v1.19Robin Haberkorn2-5/+5
* fixes manpages, Groff warnings and building womanpages for older Groff versions. Groff v1.19 is in use eg. on FreeBSD 11. * tbl v1.19 has different column specifiers than on later versions. `X` cannot be used for expanded columns in these Groff versions.
2017-02-26fixup to 733e0126: fixed if-then-else in sciteco.tmacRobin Haberkorn1-1/+1
2017-02-23print all warnings when invoking GroffRobin Haberkorn1-2/+2
2017-02-22grosciteco: added support for the `F` commandRobin Haberkorn1-0/+3
* equivalent to `xF` and currently ignored by grosciteco. * older versions of Groff use `F` instead of `xF`, even though it is not documented. Therefore this fixes building on systems with slightly outdated versions of Groff like Haiku and OS X.
2017-02-22fixed womanpage-generation for Groff < v1.20Robin Haberkorn1-0/+14
* we had an undocumented dependency on Groff v1.20, since this version introduced the .device request. * this broke the womanpage generation e.g. on OS X 10.6. Even newer versions of OS X only appear to ship Groff v1.19. * Since it makes sense to support the Groff shipping with OS X, we work around this issue by reimplementing .device on platforms that lack it. * The fallback implementation still has subtle differences to the real .device, but they are acceptable for the time being.
2016-12-06updated README: added link to SciTECO presentation and new manpagesRobin Haberkorn1-4/+7
2016-12-06htbl.tes: clean up and added support for boxed tables with separator linesRobin Haberkorn1-48/+82
* fixes formatting of sciteco.7.html * it is still not ideal since tables with rule="none" can only get row borders by adding them to the table cells. Perhaps the entire border handling should be done with CSS.
2016-11-30allow dollar sign as another variant of ^[ (discard all arguments or return)Robin Haberkorn3-24/+53
* some classic TECOs have this * just like ^[, dollar works as a command only, not as a string terminator * it improves the readability of macros using printable characters only * it closes a gap in the language by allowing $$ (double-dollar) and ^[$ as printable ways to write the return from macro command. ^[^[ was not and is not possible. * since command line termination is a regular interactive return-command in SciTECO, double-dollar will also terminate the command line now. This will be allowed unless it turns out to be a cause of trouble. * The handling of unterminated commands has been cleaned up by introducing State::end_of_macro(). Most commands (and thus states) except the start state cannot be valid at the end of a macro since this indicates an unterminated/incomplete command. All lookahead-commands (currently only ^[) will end implicitly at the end of a macro and so will need a way to perform their action. The virtual method allows these actions to be defined with the rest of the state's implementation.
2016-11-27fixed rubout of the first command after command line termination ($$)Robin Haberkorn2-6/+6
* The $$ would leave the current state pointing to the "escape" state which was manually fixed up in macro return handling but not in command line return (ie. termination) handling. Therefore the initial state at the start of the command line after $$ was the "escape" state. The rubout-last-command immediate editing command would consequently end up in an infinite loop trying to reach the start state. * This has been fixed by setting the state before throwing Return(). Some additional paranoia assertions have been added to prevent this bug in the future.
2016-11-22womanpage lexer: fixed popup stylingRobin Haberkorn1-1/+1
* the ESSTYLECLEARALL$$ was resetting the STYLE_CALLTIP (and others) resulting in wrongly-styled popups. * We now only change STYLE_DEFAULT for Gtk UIs and use `color.init` to reinitialize the other styles (not very elegant).
2016-11-22Gtk interface: make sure that the default display is openedRobin Haberkorn1-2/+10
* this has been broken since cb5e08b40d
2016-11-22save some bytes per Q-Register creation on the undo stackRobin Haberkorn2-21/+47
* a table reference was stored in the UndoToken. * since there are only two tables at a given moment, this can be avoided by having two different undo tokens, one for globals and one for locals. * Practically, undo tokens for locals are only created for the top-level local Q-Reg table since macro calls with locals with set must_undo to false since the local table is destroyed with the macro return.
2016-11-22avoid the non-standard \e escape sequenceRobin Haberkorn2-5/+8
* shouldn't really be an issue but since we already have CTL_KEY_ESC_STR as a character literal, we may as well use it.
2016-11-22fixed local Q-Register management on certain broken platformsRobin Haberkorn4-23/+42
* on MSVCRT/MinGW, space allocated with alloca()/g_newa() was apparently freed once the first exception was caught. This prevented the proper destruction of local Q-Reg tables and broke the Windows port. * Since all alternatives to alloca() like VLAs are not practical, the default Q-Register initialization has been moved out of the QRegisterTable constructor into QRegisterTable::insert_defaults(). * The remaining QRegisterTable initialization and destruction is very cheap, so we simply reserve an empty QRegisterTable for local registers on every Execute::macro() call. The default registers are only initialized when required, though. * All of this has to change anyway once we replace the C++ call-stack approach to macro calls with our own macro call frame memory management.
2016-11-22optimized QRegisterTable cleanupRobin Haberkorn5-5/+10
* we can use root() instead of min() which is faster
2016-11-22partially reversed/fixed-up b7ff56db631: avoid g_slice allocators and ↵Robin Haberkorn7-14/+47
performance issues with memory measurements * Fixed build problems on Windows * g_slice on Windows has been shown to be of little use either and it does not work well with the GetProcessMemoryInfo() measurements. Also, it brings the same problem as on Glibc: Not even command-line termination returns the memory to the OS. Therefore, we don't use g_slice at all and commented on it. * The custom Linux and Windows memory measurement approaches have been shown to be inefficient. As a workaround, scripts disable memory limiting. * A better approach -- but it will only work on Glibc -- might be to hook into malloc(), realloc() and free() globally and use the malloc_usable_size() of a heap object for memory measurements. This will be relatively precise and cheap. * We still need the "Object" base class in order to measure memory usage as a fallback approach.
2016-11-21fixed compilation of the PDCurses frontendRobin Haberkorn1-1/+1
* a simple cast was missing due to C++ aliasing rules
2016-11-20updated sample.teco_ini: 2EJ now sets a more or less global memory limitRobin Haberkorn1-2/+2
2016-11-20fixed glib warnings about using g_mem_set_vtable() and revised memory limitingRobin Haberkorn26-296/+358
* we were basing the glib allocators on throwing std::bad_alloc just like the C++ operators. However, this always was unsafe since we were throwing exceptions across plain-C frames (Glib). Also, the memory vtable has been deprecated in Glib, resulting in ugly warnings. * Instead, we now let the C++ new/delete operators work like Glib by basing them on g_malloc/g_slice. This means they will assert and the application will terminate abnormally in case of OOM. OOMs cannot be handled properly anyway, so it is more important to have a good memory limiting mechanism. * Memory limiting has been completely revised. Instead of approximating undo stack sizes using virtual methods (which is unprecise and comes with a performance penalty), we now use a common base class SciTECO::Object to count the memory required by all objects allocated within SciTECO. This is less precise than using global replacement new/deletes which would allow us to control allocations in all C++ code including Scintilla, but they are only supported as of C++14 (GCC 5) and adding compile-time checks would be cumbersome. In any case, we're missing Glib allocations (esp. strings). * As a platform-specific extension, on Linux/glibc we use mallinfo() to count the exact memory usage of the process. On Windows, we use GetProcessMemoryInfo() -- the latter implementation is currently UNTESTED. * We use g_malloc() for new/delete operators when there is malloc_trim() since g_slice does not free heap chunks properly (probably does its own mmap()ing), rendering malloc_trim() ineffective. We've also benchmarked g_slice on Linux/glib (malloc_trim() shouldn't be available elsewhere) and found that it brings no significant performance benefit. On all other platforms, we use g_slice since it is assumed that it at least does not hurt. The new g_slice based allocators should be tested on MSVCRT since I assume that they bring a significant performance benefit on Windows. * Memory limiting does now work in batch mode as well and is still enabled by default. * The old UndoTokenWithSize CRTP hack could be removed. UndoStack operations should be a bit faster now. But on the other hand, there will be an overhead due to repeated memory limit checking on every processed character.
2016-11-20fixup to 19675a1a4899: fixed crash after rubbing out creation of global registerRobin Haberkorn1-1/+1
* test case: rubout 1U[foo] * this probably also leaked memory if it didn't crash * a missing cast from RBTree::remove() was missing. This cast is necessary since QRegister uses multiple inheritance. The offset of RBEntryString might not be 0 in QRegister. Also, since the base class is no longer virtual, a cast to the virtual QRegister class is necessary to ensure that subclass destructors get called. This might have not caused problems before since RBEntry was virtual or the compiler just happened to reorder the instance structures.
2016-11-20optimized RBTree: avoid unnecessary virtual RBTree and RBEntry ↵Robin Haberkorn7-26/+42
implementation classes * whenever the implementation class was not exactly RBEntryType, it had to have a virtual destructor since RBTree cared about cleanup and had to delete its members. * Since it does not allocate them, it is consistent to remove RBTree::clear(). The destructor now only checks that subclasses have cleaned up. Implementing cleanup in the subclasses is trivial. * Consequently, RBEntryString no longer has to be virtual. HelpIndex and GotoTables are completely non-virtual now which saves memory (and a bit of cleanup speed). For QRegister, not much changes, though.
2016-11-20updated README: new featuresRobin Haberkorn1-9/+18
2016-11-20fixed interpretation of the Q-Register specification ".."Robin Haberkorn1-3/+6
* From what the documentation says, a dot may only be used once to introduce a local Q-Register specification. The parser was accepting arbitrarily many dots though. * Now, ".." will refer to the local register ".".
2016-11-20auto-completion of Q-Register names, goto labels and help topicsRobin Haberkorn10-12/+251
* Using a common implementation in RBTreeString::auto_complete(). This is very efficient even for very huge tables since only an O(log(n)) lookup is required and then all entries with a matching prefix are iterated. Worst-case complexity is still O(n), since all entries may be legitimate completions. If necessary, the number of matching entries could be restricted, though. * Auto completes short and long Q-Reg names. Short names are "case-insensitive" (since they are upper-cased). Long specs are terminated with a closing bracket. * Long spec completions may have problems with names containing funny characters since they may be misinterpreted as string building characters or contain braces. All the auto-completions suffered from this problem already (see TODO). * This greatly simplifies investigating the Q-Register name spaces interactively and e.g. calling macros with long names, inserting environment registers etc. * Goto labels are terminated with commas since they may be part of a computed goto. * Help topics are matched case insensitive (just like the topic lookup itself) and are terminated with the escape character. This greatly simplifies navigating womanpages and looking up topics with long names.
2016-11-20optimized red-black trees and common base class for string-keyed RB treesRobin Haberkorn9-143/+218
* the old implementation tried to avoid template programming by making the entry comparison function virtual. * The new RBTree implementation takes a template argument with the implementation of RBEntry. It is now partially conventional that the template argument must be actually derived from RBTree::RBEntry and must define a "compare" method. * As an advantage we now get static polymorphism (avoiding virtual calls and allowing for more compiler optimizations) and the the RBEntry implementation no longer has to be virtual. * The only RB-Trees actually used are string-keyed, though. Therefore there's a common base class RBTreeString now which defines two synonymous "key" and "name" attributes. * The entry base class RBEntryString is virtual again because we do not want to propagate the RBEntryType template parameter even further and the RBTree base class needs to destroy entries. This might be avoided by not defining a RBTree::clear() method, leaving this task to the implementations. At least QRegisters have to be virtual, though. * RBTreeString only depends on the strcmp() and strncmp() functions used now and only case-sensitive and case-insensitive versions are actually required, so we instantiate these templates statically in rbtree.cpp. This means there are still only two instantiations of the RBTree in the binary. * RBTreeString defines convenient wrappers for find() and nfind() to look up by string. This uses the RBEntryString base class, so no allocations whatsover are required for lookups and less space is wasted on the call stack. * A RBEntryOwnString base class is also provided which frees the implementations from memory managing the tree keys. * RBTreeString can now be used to add other common functionality like auto-completions for Q-Registers, goto labels and help topics. * some minor optimizations * updated TODO
2016-11-18updated .gitignoreRobin Haberkorn1-2/+7
2016-11-18the manual generator (generator-docs.tes) has been cleaned up and is now ↵Robin Haberkorn17-242/+366
called tedoc.tes * some code simplifications * it now supports command line arguments via getopt.tes. * the -C flag enabled C/C++ mode. By default tedoc parses SciTECO code which means it can be used to document macro packages as well. * Therefore it is installed as a separate tool now. It may be used as a Groff preprocessor for third-party macro authors to generate (wo)man pages. * there's a man page tedoc.tes(1) * The troff placeholder macro is now called ".TEDOC". * Help topics can now be specified after the starting comment /*$ or !*$. Topics have been defined for all built-in commands.
2016-11-18standard lib: added getopt.tes for parsing command line options in scriptsRobin Haberkorn7-28/+93
* this uses an optstring compatible with getopt(3). * It does not use repeated getopt calls to iterate options, though but places the results in registers beginning with "getopt.". E.g. option "C" will result in "getopt.C" being set after the call to setopt. String arguments are supported and are placed in the string part of the getopt registers. * The grosciteco.tes and symbols-extract.tes scripts make use of getopt now, to simplify and clean up their command line handling.
2016-11-18improved command line option handlingRobin Haberkorn13-49/+149
* it turns out that option-like arguments could not be reliably passed to SciTECO scripts for two reasons: a) "--" arguments are not removed from argv by GOption if it detects and following option-like argument. "--" would thus be passed as a script argument which will disable option parsing in scripts that interpret "--". b) A script run via the Hash-Bang line "#!...sciteco -m" would require an explicit "--" to turn of GOption parsing. However it is __impossible__ to insert after the script file name on UNIX. * Therefore, SciTECO now removes leading "--" arguments left over by GOption. * If possible (Glib >= 2.44), option parsing is performed in strict POSIX mode which inhibits parsing after the first non-option argument. This reduces the number of cases where an explicit "--" is required. * --mung no longer takes an argument. Instead, the first non-option argument is expected to be the script file name. This looks weird at first but is more consistent with how other interpeters work. Once we revise argument passing to scripts, the script name can also be passed to the script which is more consistent with it being the first non-option argument. Also, with strict POSIX parsing, this fixed Hash-Bang lines since the script file name constructed by the kernel will automatically switch off option parsing, passing all option-like script arguments uninterpreted to the script. * Since we're supporting Glib < 2.44, the Hash-Bang lines are still broken for certain builds. Therefore, a wrapper script is installed to libexecdir (it never has to be executed by users and Hash-Bang lines need absolute paths anyway) which transparently inserts "--" into the SciTECO command line and should be used as the interpreter in portable SciTECO scripts. The wrapper script is generated and points to the exact SciTECO binary installed. This is important when doing parallel installs of Curses and Gtk binaries since each one will get its own working wrapper script. The wrapper-script workaround can be removed once we depend on Glib >= 2.44 (some day...). * The default /usr/bin/env Hash-Bang lines are no longer used in the scripts since they are broken anyway (UNIX incl. Linux cannot pass multiple arguments to the interpreter!). Scripts that get installed will get a fixed-up Hash-Bang line referring to the installed SciTECO binary anyway. * Interface::main() has been renamed to Interface::init() and is optional now. The Interface::main() method was introduced because of the misconception that interfaces will find their options in the argv array and have to do their own parsing. This is wrong, since their option group already cares about parsing. Therefore, gtk_init() does not have to called explicitly, too.
2016-11-18implemented self-documenting (online) help systemRobin Haberkorn20-64/+1319
* the new "?" (help) command can be used to look up help topics. * help topics are index from $SCITECOPATH/women/*.woman.tec files. * looking up a help topic opens the corresponding "womanpage" and jumps to the position of the topic (it acts like an anchor into the document). * styling is performed by *.woman.tec files. * Setting up the Scintilla view and munging the *.tec file is performed by the new "woman.tes" lexer. On supporting UIs (Gtk), womanpages are shown in a variable-width font. * Woman pages are usually not hand-written, but generated from manpages. A special Groff post-processor grosciteco has been introduced for this purpose. It is much like grotty, but can output SciTECO macros for styling the document (ie. the *.woman.tec files). It is documented in its own man-page. * grosciteco also introduces sciteco.tmac - special Troff macros for controlling the formatting of the document in SciTECO. It also defines .SCITECO_TOPIC which can be used to mark up help topics/terms in Troff markup. * Woman pages are generated/formatted by grosciteco at compile-time, so they will work on platforms without Groff (ie. as on windows). * Groff has been added as a hard compile-time requirement. * The sciteco(1) and sciteco(7) man pages have been augmented with help topic anchors.
2016-11-16fixed segfault when munging empty scriptsRobin Haberkorn1-3/+10
* empty scripts are SciTECO scripts with an Hash-Bang line but no EOL characters. They are simply ignored now. * A test case cannot be added since 1) it's hard to create the test script with AT_DATA - we'd have to add it to the repo instead. 2) If the bug is not occurring, SciTECO starts into interactive mode which cannot be inhibited unless the script is __not__ empty. * Skipping the Hash-Bang line is optimized now, saving one iteration of the macro just to find out it contains no CR (which is the most common case).
2016-11-01sciteco(7) man page: revised subsection naming in FLOW CONTROL sectionRobin Haberkorn1-3/+3
* uses the same cases as all the other subsections now
2016-11-01globbing supports character classes now and ^EN string building construct to ↵Robin Haberkorn9-50/+302
escape glob patterns * globbing is fnmatch(3) compatible, now on every supported platform. * which means that escaping of glob patterns is possible now. ^ENq has been introduced to ease this task. * This finally allows you to pass unmodified filenames to EB. Previously it was impossible to open file names containing glob wildcards. * this was achieved by moving from GPattern to GRegex as the underlying implementation. * The glob pattern is converted to a regular expression before being compiled to a GRegex. This turned out to be trickier than anticipated (~140 lines of code) and has a runtime penalty of course (complexity is O(2*n) over the pattern length). It is IMHO still better than the alternatives, like importing external code from libiberty, which is potentially non-cross-platform. * Using GRegex also opens the potential of supporting brace "expansions" later in the form of glob pattern constructs (they won't actually expand but match alternatives). * is_glob_pattern() has been simplified and moved to Globber::is_pattern(). It makes sense to reuse the Globber class namespace instead of using plain functions for functions working on glob patterns. * The documentation has a new subsection on glob patterns now. * Testsuite extended with glob pattern test cases
2016-11-01simplify bootstrap.am and avoid warning about GNU make $(shell) functionRobin Haberkorn1-4/+8
* the `date` utility is now invoked by SciTECO which avoids automake warnings because of $(shell). The command line should work on Windows as well when SciTECO executes using cmd.exe (hopefully).
2016-11-01updated TODORobin Haberkorn1-0/+42
2016-08-19added test group for SciTECO's EOL normalisation featureRobin Haberkorn5-0/+21
2016-08-19Integrated clipboard supportRobin Haberkorn20-441/+1460
* mapped to different registers beginning with "~" * on supported platforms accessing the clipboard is as easy as X~ or G~. Naturally this also allows clipboards to be pasted in string arguments/insertions (^EQ~). * Currently, Gtk+, PDCurses and ncurses/XTerm are supported. For XTerm clipboard support, users must set 0,256ED to enable it since we cannot check for XTerm window ops programmatically (at least without libX11). * When clipboard regs exist, the clipboard can also be deemed functional. This allows macros to fall back to xclip(1) if necessary. * EOL handling has been moved into a new file eol.c and eol.h. EOL translation no longer depends on GIOChannels but can be memory-backed as well.
2016-08-19updated README: mention some more design features of SciTECORobin Haberkorn1-2/+16
2016-06-04added ^E@ string building characterRobin Haberkorn3-11/+42
* allows expansion of Q-Register contents with UNIX shell quoting * This especially improves the usefulness of the EC/EG commands as we can reliably determine that a TECO string (ie. Q-Register) will end up as a single argument to the spawned process. A previous workaround was to enclose ^EQ in quotes, but it does not work e.g. if the register contains the wrong kind of quotes or other magic shell characters. * NOTE: In order to be absolutely sure about the runtime behaviour of EC plus ^E@, you will have to enable UNIX98 shell emulation in portable macros.
2016-04-06updated Scintilla to v3.6.4 and Scinterm to v1.7Robin Haberkorn2-2/+2
* the Github mirrors contain crucial patches not yet contributed upstream, so people will currently rely on my Github mirror repositories in order to build SciTECO
2016-04-05session.tes: save and restore the working directory as part of the sessionRobin Haberkorn1-3/+11
* turned out to be a very handy feature * can be turned off by setting register `session.savedir` to false * also fixed the line endings in .teco_session files to line-feed (ie. native)
2016-03-25fixed rubout and reinsertion of the loop end command (>)Robin Haberkorn1-2/+11
* the loop counter wasn't properly restored when rubbing out the loop end command, so when it was reinserted again, it would still be 1 (since that's the abortion criteria) and no additional loop iteration was performed. * simple test case: Try typing 5<%a> then rubout and reinsert ">". * Fixed by saving the loop counter before modifying it. There are arguably more efficient ways to do this like only creating one undo token at the end of the loop -- but that would require storing the initial loop counter in the LoopContext and would generally be more tricky. * The case of infinite loops has been optimized in interactive mode: Since the loop counter never actually changes, we do not have to create an undo token per loop iteration.
2016-02-24EG and EC use $SHELL and $COMSPEC as the default command interpreters nowRobin Haberkorn3-17/+43
* The default command interpreter will thus be inherited from the operating system. In the case of UNIX from the user's passwd entry. E.g. if bash is used, bash extensions can be used immediately if flag 128 is not set in the ED flags. * On DOS-like systems there are also alternative interpreters (e.g. 4NT, 4OS2) that are configurable now. * At least on UNIX with $SHELL it is not guaranteed that the interpreter supports the standard command line arguments like "-c". If they don't, this will cause problems with EC. Since $SHELL is mapped to a Q-Register, it can however always be easily customized for SciTECO sessions in the user's .teco_ini.
2016-02-19fixed Objective C++ lexing: it is now handled by cpp.tesRobin Haberkorn2-11/+14
* the *.mm extension is for Objective C++. Therefore cpp.tes should be responsible. * Objective C keywords have been added to lexer.c.basekeywords. It does not hurt adding them to all C descendants.
2016-02-18replace custom Gob2 check with GOB2_CHECK() from gob2.m4Robin Haberkorn2-4/+60
* Allows us to check for the Gob2 version at ./configure time * this file ships with Gob2 installations, so in most cases it could be found without shipping it with SciTECO. * Autoconf is built such that source distributions will contain all additional external macros compiled in aclocal.m4. * However if somebody builds from Git, he/she would still expect the ./configure checks to produce meaningful results even if not all dependencies are installed properly. It therefore seems to be good practice to include all external M4 macros (gob2.m4) as a fallback with the source tree. * /usr/share/aclocal contains many more useful m4 macros. However since we can depend on pkg-config e.g. for finding Gtk+ and Glib, I won't use those macros as else I would have to bundle them to achieve the same kind of ./configure robustness.
2016-02-17added lexing support for Gob2 (GObject Builder)Robin Haberkorn2-0/+37
* this assumes that Gob2 produces plain-C output (no C++ keywords are added) and all Gob keywords are real keywords - even though they might be used in function bodies or %{ %} enclosed blocks.
2016-02-17The "cpp" lexer configuration has been split into "c.tes" and "cpp.tes"Robin Haberkorn3-23/+64
* The keyword list is too different in C when compared to C++. The many additional keywords are annoying when editing plain C files. * Underscored C99 and C11 keywords (like _Bool) have been added to the "c.tes" lexer configuration. The C++ language does not contain these keywords. However, C has stdbool.h to define bool which is part of standard C++. * Therefore a macro "lexer.c.basekeywords" has been defined for all languages __directly__ derived (more or less supersets) of C. It contains most of the C99/C11 standard header shortcuts. * Objective C lexing is set up by c.tes since Objective C is a relatively strict superset of C. All Objective C keywords are handled by c.tes. Since they begin with "@", this should not cause problems when editing plain C files.