[Back to Free Stuff] - [Back to Mike's Home]


Just let me download.

TextExtras is a bundle that gets loaded into all Cocoa applications. It adds cool features to the text handling of all Cocoa applications.

Below is a description of the changes between releases of TextExtras, starting with the most recent release. See the README.rtf file in the release for details on all the features.

TextExtras 1.8.1

TextExtras 1.8.1 fixes a bug where TextExtras could cause a crash when bringing up its preferences panel.

TextExtras 1.8

TextExtras 1.8 is now a Universal binary. Also, for those who build TextExtras from source, its project has been completely upgraded to Xcode 2.3 and the build targets have been upgraded to modern targets. All remnants of the old build style support have been removed and build configurations have been set up instead.

Although this is not directly related to a TextExtras change, but rather to a change in Mac OS X, it is worth noting that in Mac OS X 10.4, the Mail application no longer uses the Cocoa text system (it uses Cocoa's HTML editing support instead). Because of this, most of TextExtras' features no longer work in Mail. This is a situation I hope to revisit at some point.

Notable bug fixes

TextExtras was not creating its Application Support folder when needed. This would cause certain settings to be lost because creating files in folders that do not exist does not work. TextExtras will now create this folder if necessary.

The target for producing the distribution disk images is now a Legacy target instead of a Tool target with a script phase. Among other things, this means there's no longer a dangling product reference for the "tool" that never gets built.


Font panel preview drawer removed: Because of the addition of a similar feature in the standard Jaguar font panel, TextExtras' implementation of this has been removed.

Toggle Non-ASCII Characters: A menu item has been added to make TextExtras mark any non-ascii characters in a text view with a colored background. This can be useful when writing content that must have no special characters in it to make it obvious where unwanted special characters appear.

Completion support re-worked: TextExtras no longer implements the -complete: method on NSTextView. Since NSTextView now supports its own form of dictionary-based completion, this category override was sometimes blocking the built in behavior and sometimes not. The TextExtras completion feature is still available and has been reworked. To use TextExtra's implementation of completion, you should bind your chosen completion key to -TE_complete: instead of -complete: (as shown in the example DefaultKeyBinding.dict that comes with TextExtras.) If you have a key binding for -TE_complete: then TextExtras will always consult the completion dictionary first. If the current completion prefix is not in the completion dictionary, then if the "Fancy escape completion" default is turned on, TextExtras will uses its own cycling completion behavior. Otherwise it will invoke the built-in dictionary-based completion of NSTextView.

User Scripts: Script menus added vusing TextExtras' support for a startup script and the SetMenu utility have been improved. Scripts which take no input and do not send output into the active text object can now be executed whether or not there is an active text object. Also, error handling is a bit more robust which should help address some of the stability issues seen in prior releases.

Debug environment variable: TextExtras will now look for a special environment variable "TEDebug". If this variable is set to YES then TextExtras will be a bit more verbose about certain things (at this point, mainly about the interaction of TextExtras with the SetMenu script while TextExtras runs startup scripts.) This will be mainly of interest to developers who want to get some information about what is going on inside TYextExtras for debugging purposes.

Other Changes

The preferences panel and other uses of defaults have been reworked to go use Cocoa Bindings where appropriate, reducing the amount of code for prefs handling significantly.

TextExtras 1.7

TextExtras 1.7 has some new features. It also has fixes for several annoying bugs. Full details about the new features and bug fixes can be found in the Release Notes that are included with the download. A summary of new features is included below.

Note: TextExtras no longer requires the MOKit framework. Having MOKit installed is, of course, fine, but it is no longer necessary for TextExtras to function.


Font Panel Preview: There's a new checkbox in the General preferences tab that controls whether TextExtras will add a drawer to the standard font panel.  The drawer shows a sample of the font that is selected in the font panel at all times.

Text Attributes Inspector: A new floating panel that allows inspection and modification of a wide range of text attributes is now available.  The panel can be brought up from the TextExtras menu with the Show Text Attributes menu command.  The panel has two major sections labeled "Character Attributes" and "Paragraph Attributes".  This panel exposes pretty much the full range of formatting attributes supported by the Cocoa text system.  Not all these attributes are supported for reading and writing by Cocoa's RTF parser, so some kinds of changes will not be persistent in RTF files.  Most of them are, though.

This panel is useful for getting an idea of how the text system works when it comes to attributes, attributed strings, and the layout and typesetting mechanism.  It is also great for making adjustments that are really inconvenient through the standard Font and Text menus.  In particular, kerning adjustments and baseline adjustments are much easier with the panel.

Old (pre-Jaguar) double-click rules preference: In Mac OS X 10.2, Cocoa started using very different double-click and word breaking rules.  Many people would not notice this, but for programmers, some of the changes are quite annoying.  This version of TextExtras has a new preference that allows you to make Cocoa go back to using the pre-Jaguar double-click rules.  It is unclear whether this feature will work forever, since it depends on the fact that the old behavior is still available in Cocoa, and that might not be true forever.  But for now, you can get the old behavior back with this new preference.

Hierarchical outline movement helpers: It is common to have a text file that represents an outline through indenting.  Similarly, source code tends to be structured by indent levels.  This version of TextExtras adds several new key binding selectors that can help navigate around in hierarchically indented text like this.  The motivation for these methods was a desire to more easily jump around in the output of the command line tool sample, but the methods are useful for other situations as well.

Pipes panel improvements (and more): See the release notes for more details. The changes to the pipes panel and related stuff is the biggest feature in this release of TextExtras.

Support Files Moved: Several support files that used to be stored as "dot" files in the user's home directory have either been made obsolete or have been moved to ~/Library/Application Support/TextExtras.

Windows Support Code Removed: All windows-specific code has been removed from this release. TextExtras 1.6 dropped support for OpenStep Enterprise OpenStep on Windows), but various parts of the implementation were left in place. In this release, all that code has been removed.

TextExtras 1.6

TextExtras 1.6 has a few new features.

Note: Most of the TextExtras defaults have been renamed in 1.6 to add a "TE" prefix.  This was done to avoid naming collisions since TextExtras writes defaults into any app's domain.  You may have to reset your defaults if you used a previous version.

TextExtras has been converted to a new Project Builder project. Another minor change is that all TextExtras source code is now stored in UTF-8 format. In this release, the only place that this is noticeable as being different from ASCII is in the file header comments where the copyright symbol is used. The project is set up such that all source files have UTF-8 set as their explicit file encodings, so handling should be completely automatic under Project Builder. Opening the source files in TextEdit or other editors may cause the copyright symbols to become corrupted if you do not explicitly open the files as UTF-8 encoding.

Sadly, this is the first version of TextExtras that does not support Windows. TextExtras 1.6 is for Mac OS X only.

As usual, the latest TextExtras (1.6) requires the latest MOKit (2.6).


Uses Tabs Preference: There is now a "Uses Tabs" preference which is used to determine whether TextExtras will ever insert tabs through its various features that act on the leading whitespace of a line.

New tab key binding method: There's a new key binding method that can replace insertTab: as the binding for Tab which will insert indent levels when you hit Tab in the leading whitespace of a line.  This is basically the opposite of TE_indentFriendlyDeleteBackward:.  It is called TE_indentFriendlyInsertTab:.

New property list functionality: The Parse As Property List menu command has gained a few friends and there is now a whole submenu of property list commands.

Manual writing of application preferences: There's a new menu item that allows manual immediate writing of any changed defaults in an app.  Many applications do not write out modified preferences until you quit.  If the app happens to crash you lose the changes.  This command is useful to force changes to be saved if you've just spent a lot of time setting up your preferences.

Pipe panel more flexible: The Pipes panel has been reworked a bit to use a real shell to parse and execute the command.  This means that argument parsing will be done by the shell which will do it much better than the old implementation used to.  It also means you can now use more complex constructs like pipes or redirection.

TextExtras 1.5

TextExtras 1.5 has a bunch new stuff.


Special Characters Panel: This new panel can be used to input characters available in the Symbol font and the Zapf Dingbats font. It can be customized to provide any number of named sets of arbitrary Unicodes which are displayed in the panel and can be entered in the currently active text object in any app just by clicking on them.

Parse as Property List: This new menu item allows you to syntax check a property list. If you create property lists in TextEdit, this menu command is great. It makes sure your current file can be parsed and, if it can't, it tells you where the error probably is.

Control over TextExtras menu behavior: There is now a pane in the Preferences panel which allows you to set preferences (either per-app or globally) to control whether the TextExtras menu will be inserted into an application's menu bar. Be careful, since if the menu is not inserted, you won't be able to easily get back to the Preferences panel to turn it back on. You can set the menu to be inserted always, never, or only in a Format menu. You can also control whether the Debug submenu appears.

Control over Windows NT Modifier Key Mapping: There is a new Preferences pane which appears only on Windows. It allows you to set the NSModifierFlagMapping default and the NSMnemonicsWorkInText default. These defaults can be used on Windows NT to customize the Yellow Box key handling to be a little more bearable to emacs-jockeys.

Sample KeyBindings file: TextExtras now includes a custom DefaultKeyBinding.dict which you can either just use or use as an example for how to customize your key bindings.

Miscellaneous: A bunch of little stuff was added. New selectors have been provided for key bindings which bring up most of TextExtras' interesting panels. These can be useful if you don't have the menu installed. Unicode Line Separator is now treated as a line end character. Various additional methods are provided to reflect this. TE_insertNewlineAndIndent: has been made much more friendly to apps that override the insertNewline: method for funky purposes. It should now be possible to use the auto-indent selector reasonably in ProjectBuilder, Shell.app, and other such applications where it did not work too well before. The TE_reindentWrappedLines: method has been provided as a stop-gap until I can figure out why the wrapped line indent sometimes does not "take" when you first open a file.

TextExtras 1.4

TextExtras 1.4 has some new stuff.


Completion Dictionary: Now, in addition to previously-seen completion (plain or fancy), there is a user-defined completion dictionary which can be configured from the Preferences panel. The completion dictionary is consulted first when completion is invoked. If there is no match in the dictionary then the original previously-seen completion behavior is used.

Open Quickly Paths: For the last release or two there has been a default to specify a list of paths to use as the base paths for relative paths in the Open Quickly panel. Now these paths can be set in the Preferences panel. The current base path is still consulted first (this is determined by the path of the main window's file, if any, or the last path used). If a relative path name cannot be found with that base path, the base paths from the Preferences panel are tried, in order, until the file is found. Some good paths to put into this preference include the Header directories for frameworks, common source directories for your own projects, etc...

Localization issues: TextExtras 1.4 had so many nib changes that I had to revert the French localization back to English. My apologies to French-speaking people everywhere. If you know French, German, or Japanese (or even Italian, Spanish, or Swedish) and you would like to translate TextExtras' resources to that language, I would be more than willing to incorporate the translations in the next version (for as long as I don't make major interface changes again). Just take the English.lproj directory and translate everything inside. Partial translations would be OK too.

TextExtras 1.4 is built to run on Rhapsody/YellowBox For Windows Developer Release 2.

TextExtras 1.3

TextExtras 1.3 adds a few more minor features. See the README for details. Starting with this version, TextExtras is being built for Rhapsody/YellowBox. This doesn't change the code much, but it is definitely a change to the available binary versions.

TextExtras 1.3 is built to run on Rhapsody/YellowBox For Windows Developer Release 1.

TextExtras 1.2

TextExtras 1.2 adds even more features. This version of TextExtras was developed mostly on OPENSTEP version 4.2, but it will probably work with 4.1 as well.


Pipes Panel and User Pipes: This panel is accessible through the TextExtras menu. It allows you to type simple command line to execute and let's you choose where to get the command's input and what to do with its output from several options. There is also support for a set of pre-defined user pipes which can be executed directly from the TextExtras menu.

Enforce Tab Stops: Not all programs set tab stops in plain text text systems to conform with your TabWidth default. Using this feature you can make sure that tab stops will be set every TabWidth spaces in plain text text objects.

Toggle Control Characters: A new menu item allows you to toggle the active text object between showing and not showing control characters visibly. This can be useful for binary files or for finding those (sometimes) pesky carriage returns in Windows-mangled text files.

Standardize EOL: New menu items allows you to canonicalize the line breaks in a text document. You can make all line breaks use linefeed only (LF) or carriage return followed by linefeed (CRLF).

Debug menu: Heavy-duty text system programmers can arrange to have an extra menu item added to the TextExtras menu that allows you to log all kinds of useful diagnostic info from the active text object.

TextExtras 1.1

TextExtras 1.1 adds a few cool new features. PLEASE NOTE: This version of TextExtras will only build on OPENSTEP for Mach or Windows version 4.1! The compiled versions may or may not work on 4.0.


Open Quickly: This panel is accessible through the TextExtras menu. It allows you to type a path for a file to open. The field you type in does file path completion. If you specify a directory path and the application can't open it, TextExtras will open it itself into a directory listing window. Directory listing windows show all the files in the directory. Double-clicking a file in a directory listing window opens that file.

Fancy Escape Completion: The TextExtras bundle implements the complete: method in a category on NSTextView. This will add escape-completion to any new text object that doesn't already have it (on Windows the default key binding for complete: is actually F2, not Escape, but this can be changed). It won't interfere with subclasses that already do completion in their own way or with text objects whose delegates provide escape completion. It will interfere with other NSTextView category implementations of complete:, but then overriding standard methods in a category is not a good idea generally (he says while describing his category override of a standard method). The completion provided by this feature is pretty good. If there are multiple matches for a completion consecutive escapes will cycle through them. Fancy completion must be turned on in the TextExtras Preferences panel. If it is turned off then escape completion works as it did in TextExtras 1.0.

TextExtras 1.0

TextExtras is an InputManager bundle for OPENSTEP. It works on Windows and Mach. While the bundle uses the InputManager support to get itself loaded, it isn't really an InputManager. What it really does is extend the new text system's features in any OPENSTEP application. Wherever any OPENSTEP appication uses the new text system, this bundle can extend it. Having said that I should mention that I mostly use it with TextEdit, and have not tried it in a lot of apps. Also note, this bundle duplicates a fair amount of functionality already present in ProjectBuilder, so it's probably best to leave all the preference checkboxes turned off in PB.

Usually, when the bundle is loaded it tries to insert a new menu into the applications main menu structure. It places this menu in the Format submenu of the main menu. If there is no such menu, the bundle does not add its menu at all. The menu is called TextExtras and it contains a few text commands, an Info panel, and a Preferences panel.

Some of the features are turned off by default, but you can use the preferences panel to turn them on. Your preferences are remembered per application. The features which can be turned on and off are, for the most part, the ones that work all the time without you having to explicitly invoke them. Some of these add considerable overhead to the performance of the text system.

Regardless of which features are turned on, the bundle is well-behaved. It does not need to become any object's delegate. Anything it needs to know it gleans from being an unnoticed observer.


Goto Panel: This panel is accessible through the TextExtras menu. It allows you to find and select line ranges or character ranges by number in the active text object. It can also be set to track selection changes in the active text object and display the current selection as a character or line range. This auto-update feature does not work for field editors.

Nest/Unnest: These two new commands are accessible through the TextExtras menu. They will, respectively, increase or decrease the indent level of the lines in the selection of the active text object by one indent level. This feature uses the Tab Width and Indent Width preferences in its calculations.

Indent Wrapped Lines: (aka Scott-wrap) This feature must be turned on in the Preferences panel. This feature does not work with multi-layout or multi-view text objects. Itdoes not work with rich text objects, field editors, or non-editable text objects. When it is enabled, all wrapped lines indented specially. The Wrapped Line Indent Width preference determines how much extra indentation the wrapped lines have beyond the indentation of the original line.

Select to Matching Brace: This feature must be turned on in the Preferences panel. When it is enabled, double-clicking on a brace-like character will extend the selection to the well-balanced matching brace (if any). Brace-like characters include such as parenthesis, braces, and square brackets. If there is no matching brace (perhaps because of unbalanced pairs of internal braces), the single brace is left selected.

Show Matching Brace: This feature must be turned on in the Preferences panel. When it is enabled, typing a closing brace will cause its matching open brace to be momentarily highlighted. If there is no matching opening brace there is no momentary highlight. Unfortunately, the opening brace might also not be on screen to highlight. Because of the unobtrusiveness of this bundle, it was necessary to implement this feature in a slightly roundabout way, with one little side effect being that right-arrowing past a closing brace will also flash the opening counterpart.

Auto-indent: This feature isn't accesible unless you add a key binding for it. This feature does not work in field editors. When invoked this inserts and newline into the active text object followed by enough indentation to match the previous line. The selector to bind to for this feature is "insertNewlineAndIndent:" To find out how to add a binding for it, see the OPENSTEP release note on Text System Defaults and Bindings.

Simple Escape Completion: The TextExtras bundle implements the complete: method in a category on NSTextView. This will add escape-completion to any new text object that doesn't already have it (on Windows the default key binding for complete: is actually F2, not Escape, but this can be changed). It won't interfere with subclasses that already do completion in their own way or with text objects whose delegates provide escape completion. It will interfere with other NSTextView category implementations of complete:, but then overriding standard methods in a category is not a good idea generally (he says while describing his category override of a standard method). The completion provided by this feature is dirt-simple. It will complete only to the first found match. It looks backwards from the selection to the beginning of the document first, then forwards from the selection to the end, if necessary. If there are multiple possible matches, the first is used and there is no way to cycle through any others.


Releases are organized from the most recent to the oldest.

Recent releases are Disk Copy disk image files. After downloading, double-click the resulting file to mount it in Finder.

Source Code Binary Distribution
Mac OS X
TextExtras 1.8.1 (for Mac OS X 10.4 Tiger) smallFile Download smallFile Download
TextExtras 1.7 (for Mac OS X 10.2 Jaguar) smallFile Download smallFile Download
TextExtras 1.6 (for Mac OS X 10.0) smallFile Download smallFile Download

All files from releases below this point are tarred and gzipped.

Source Code Binary Distribution
Mac OS X Server Windows
TextExtras 1.5 (for Mac OS X Server 1.1) smallFile Download smallFile Download smallFile Download
TextExtras 1.4 (for Rhapsody DR2) smallFile Download smallFile Download smallFile Download
TextExtras 1.3 (for Rhapsody DR1) smallFile Download smallFile Download smallFile Download

Source Code Binary Distribution
OPENSTEP Mach Windows
TextExtras 1.2 (for OPENSTEP 4.2) smallFile Download smallFile Download smallFile Download
TextExtras 1.1 (for OPENSTEP 4.1) smallFile Download smallFile Download smallFile Download
TextExtras 1.0 (for OPENSTEP 4.0) smallFile Download smallFile Download smallFile Download

[Back to Free Stuff] - [Back to Mike's Home]

Mail Send mail to Mike Ferris