TextWrangler 2.3 Release Notes

This page documents all feature enhancements and bug fixes included in TextWrangler 2.3.

For details on changes made in previous versions, please see the release notes archive.

For complete information on TextWrangler’s features, please refer to the included PDF user manual, which you can access by choosing “User Manual” from the Help menu.


TextWrangler 2.3 requires Mac OS X 10.4 or later. If you’re still using Mac OS X 10.3.9, TextWrangler 2.1.3 is the most recent version you will be able to run.

This version is a Universal application: it runs natively on both Intel-based and PowerPC-based Macs.


  • Disk browsers now put files and folders in the drag, so you can (for example) drag a file from a disk browser to an editing window to insert it, or to any application that accepts file URLs, such as Terminal.
  • Disk Browsers get a contextual menu for the file list: if you right-click on items you get commands to open the selection, the same commands as on the “Copy Path” submenu, and, for single selections, a “Go Here in Terminal” command which will open a new Terminal window with the working directory set to the selected folder (or to the parent of the selected file).

By default, TextWrangler will use the Terminal application supplied with the system, but if you’re using an alternative terminal application such as iTerm, you can specify its bundle identifier and TextWrangler will use it, as follows:

defaults write com.barebones.textwrangler Misc:TerminalBundleIDOverride “com.apple.Terminal”p. replacing “com.apple.Terminal” with the bundle ID of your preferred terminal application.

  • Added a pair of new commands to the Insert submenu on the Edit menu: “Short Time Stamp” and “Full Time Stamp”, which insert short and long forms (respectively) of the current date and time.
  • Lua language support is now built-in.
  • This release contains an all-new Python language module, which adds an assortment of previously requested features and addresses previously reported bugs.
  • You can now drag items from FTP browser windows to other locations; for each selected item, its URL is placed in the drag in a form that is (hopefully) usable to other applications.
  • The scripting dictionary now contains a “build number” property.
  • The TeX module now recognizes: align, alignat, falign, gather and multiline as “math environments”, in addition to those it already supported.
  • Added support for JavaScript function declarations which use the rare form of:

foo = new Function( “function body string” )p. This is a very uncommon way of declaring functions, but it’s legal, had been omitted, and was requested.

  • In TeX (LaTeX) files, command and environment definitions are now parsed and syntax-colored properly. The affected commands include: \newcommand, \renewcommand, \providecommand, \newenvironment, and \renewenvironment. (Support for \def was added earlier.)
  • The Java module now fully supports annotations and annotation definitions. Annotation are treated as modifiers. Annotation definitions are treated like interfaces, except the entry in the function popup is prefixed with “annotation” instead of “interface”.
  • Language modules (codeless and otherwise) can now specify whether “code” runs (that is, anything that’s not a comment, string, or keyword) can be checked for spelling. NB: if you’ve written a language module of your own, you should probably add this key/value pair to your language module’s plist if your module is for a “markup” language as opposed to a “scripting” language (e.g. anything that’s not explicitly in a comment is probably text content, and not code).

<key>BBLMCanSpellCheckCodeRuns</key> <true/>

  • “New (with selection)” and “New (with clipboard)” now create the new document using the language of the selection or clipboard (respectively).


  • TextWrangler no longer natively supports reading PICT files. The QuickTime image translators handle this, and if that doesn’t work out, well, there’s always Preview.app or Xee. :-)
  • The first-run dialog now has just a single check box for installing the command-line tools: it will install both the edit and the diff tools (bbedit/bbdiff or edit/twdiff as appropriate).
  • The “Install Command Line Tools” button in the Application preferences has been moved to a menu item in the TextWrangler menu. It’s more visible there and makes room for a new option in the preferences.
  • Multi-file Find Differences: When “List Identical Files” is turned on, identical files are grayed out in the list; the bullet has been removed from non-identical files to reduce visual clutter.
  • The Find Differences results window gets an updated Reload button and some minor cosmetic adjustments.
  • FTP browsers get the new Reload icon
  • The “Tools” menu is now hidden unless compatible plug-ins are installed. This is a return to older behavior, and obviates the instructional “Why is this menu empty?” command that was previously placed on the Tools menu when no plug-ins were installed.
  • The Languages list shows the version numbers of installed language modules (including built-ins and factory modules).
  • The “Save Selection” contextual menu item now drops a sheet.
  • The following Search menu commands have been renamed:

Enter Search String → Use Selection for Find Enter Search Pattern → Use Selection for Find (grep) Enter Replace String → Use Selection for Replace Enter Replace Pattern → Use Selection for Replace (grep)

  • In FTP browser windows, hitting the Return or Enter key while the keyboard focus is in one of the edit fields will attempt a connection, as long as there is a host name in the “Server:” field. The “Connect” button will throb to indicate this. The old behavior of advancing to the next field when hitting Return or Enter is gone. When the focus is on a selected item in the list, Return/Enter opens the selected item as before; now the “Open” button throbs to indicate this.
  • The “Find” button in the Quick Search window now throbs to indicate that hitting Return or Enter will perform a Find.
  • If there is no selection, “Find Definition” will drop a sheet (prefilled with its best guess, like “Find in Reference” does) rather than always trying to guess based on the insertion point.
  • Under Mac OS X 10.5 or later, you can scroll background windows with the scroll wheel or trackpad as appropriate.


  • Fixed bug in which certain Control-key combinations would end up being inserted into the editing window when used as menu command equivalents.
  • Fixed bug in which the Java function scanner didn’t correctly handle backslash escapes in strings.
  • Paths containing ; are now properly escaped when restoring the saved working directory.
  • Fixed regression: “Find in Reference” didn’t do pydoc/perldoc lookups in TextWrangler.
  • In blockquotes spanning multiple lines in Markdown, the last quote marker(s) is not colored as a keyword if the blockquote falls near the end of the file.
  • Fixed a bug where “Check Spelling as You Type” didn’t correctly handle contractions which used a smart apostrophe.
  • Fixed a typo in the JavaScript keyword list: isNaN not isNan
  • When skipping over comment tokens (generally when seeking the name of something for the function popup), skip #mark tokens as well.
  • Fixed a crash in the TeX scanner.
  • Fixed some TeX rescan issues.
  • When generating names for entries in the function popup in Markdown files, make sure the names are at least one character long.
  • Added support for the TeX “sectioning” commands \paragraph and \subparagraph. They work just like all of the other section-like commands, but they are the lowest in the hierarchy.
  • Fixed a regression where the factory default language mappings for HTML/XML were incomplete. This resulted in among other things, malfunctioning of the batch HTML updater, syntax checker and link checker.
Important: To restore normal operation, you may need to use the “Reset All” button in the Languages preferences to reload the factory default suffix mappings. This will discard any customizations you have made.
  • Fix for “Compare Two Front Documents” not ordering the new/old docs correctly.
  • Fix for Codeless Language Modules where if a comment pattern was specified but a string pattern was not, comments were colored as strings.
  • When using the “Make Backup Now…” command, the sheet that drops down now points to the preferred backup directory.
  • Fixed bug in which cancelling an “Open Counterpart” operation was impossible.
  • Fixed bug in which the password wasn’t correctly looked up when opening FTP/SFTP files from the Open Recent menu.
  • “Save Default Window” now saves splitter position in browser windows, and no longer works at cross purposes with auto-saved positions.
  • Fix for a problem with rescanning Math string runs in TeX.
  • Fix for the issue that \begin*{something} should not match \end{something}, because \begin* is not a valid beginning to an environment. In other words, the fix in 8.6.1 for starred commands was too aggressive.
  • Fix for stuck squiggle ranges after applying Learn Word or Ignore Word.
  • Added additional PHP predefined symbols. Thanks as always to Carsten Blüm.
  • Java language module now supports generics and anonymous classes.
  • Fixed bug in Markdown syntax coloring when a list item contained a link reference and the list item content was edited after (to the right of) the link reference.
  • “Color Math Strings” (for TeX) is now on by default.
  • Fixed math error when computing width of the line-number column during printing.
  • Long names are truncated in the search progress window rather than running off the edge of the window.
  • Made a couple of cosmetic fixes to the list used in FTP browsers and dialogs: symlinks now use the composited system alias icon, and there’s a bit more breathing room in the lists at the default spacing.
  • Fixed an off-by-1 bug in the drawing of the navbar in the disk browser.
  • Fixed some off by 1 positioning bugs in the navigation bar and status bar at the bottom of the text view.
  • Fixed a bug where if a codeless language module specified a comment pattern but not a string pattern, comments were colored as strings.
  • Fixed a bug where popping up a navigation bar or status bar item via the keyboard would intermittently pop up the menu in the wrong screen location.
  • Made a change to significantly reduce the transient memory requirements for reading a file during multi-file search and text factory execution.
  • Made a change to reduce transient memory requirements when performing text transformations in a Text Factory.
  • Fixed a bug where the initial properties (i.e. make new <xxx> with properties {bounds:<yyy>}) weren’t honored for ftp browsers and disk browsers.
  • Fixed a bug where text factory files which lacked an HFS type but had a valid extension were not recognized as such when their name was > 31 characters long.
  • When activating the Quick Find window, its internal state is now set so that Return or Enter will search for the string already in the window, and typing any other character will clear the string before entering your typed character. (This behavior was already in place for the case in which the Quick Find window had been closed.) In this way, there is no need to explicitly clear the Quick Find window when activating it – just start typing.
  • Made various fixes and improvements to the image viewing window, including better behavior with small images, a reasonable minimum window size, and scroll bars for easier viewing of large images.
  • Adjusted things such that extensions on folder names which are used as items in places such as the Script Menu are no longer stripped from the string used for the menu item text.
  • Script menu items of the form “3. Test” will no longer have the “. Test” trimmed as if it were a filename extension.
  • Changed the text factory/multi-file search engine so as to throttle transient memory usage. This retains some measure of machine-wide performance and usability during processing of very very large (100MB+ files).
  • the factory suffix mapping of “.cgi” to Perl has been removed. If you have existing language settings and this has caused a problem for you, you can remove it by hand in the Language preferences.
  • Fixed bug in which customizations to the language comment strings (used by the Un/Comment command) were lost when moving between machine architectures. Please note that as a result of this fix, you will need to reapply any customizations if you are running on an Intel machine. Sorry for the inconvenience.
  • If you opt out of installing the command-line tools at first run time, the application will no longer prompt you to install them each time you start up. If you subsequently manually install the tools, update checking at app start will resume; also, if you perform an authenticated open or save, the edit tool is mandatory and will be installed at that time.
  • Array indicators in method signatures (like “public foo[] bar()”) no longer confuse the function parser.
  • Commas in class signatures no longer confuse the Java function scanner.
  • Tweaked the “Strings” language guesser so that it is much less likely to generate false positives.
  • Fixed hang which would occur when encountering an XML PI in a Markdown document.
  • Markdown module no longer imagines that it sees list items or Setext-style headers in the middle of inline (non-block) html tags, such as* blah.
  • Inline link references in Markdown can now have line breaks (but no blank lines) and nested, matched pairs of square brackets within the link text, and will be syntax colored appropriately.
  • The direct parameter to the find event is now correctly marked required. This fixes the problem where scripting bridge generated the wrong glue code.
  • Fixed headerdoc tag typo which prevented correct parsing of file.
  • Fixed hang which occurred when parsing with headerdoc for @function declaration with no matching macro.
  • Fixed charset issues with headerdoc output.
  • Misc. cleanup to the headerdoc stuff; removed stray<#placeholder#>(s) and fixed entity encoding.
  • The default “From” page range is now {1, 1} when printing. This is consistent with other applications on Mac OS X.
  • Java “type parameters” containing commas, e.g. “new Foo<String, Boolean>”, were not properly parsed.
  • Java array initializers like ‘new String[] {"abc"}’ could break the function popup.
  • Made some performance improvements to the TeX language module.
  • TeX: Starred math environment names are now better supported, and must match. (So, \begin{align*} can only be closed by a matching \end{align*}).
  • Fixed bug in which using “Find All” with multi-file search turned off would always search the entire front window, even if “Search Selection Only” had been turned on.
  • In Java files, ‘new’ followed immediately by a closing parenthesis could cause a hang.
  • Fixed bug in which case-sensitive file systems weren’t taken into account when examining open documents by name.
  • Implemented a workaround for the Learn and Forget buttons being disabled at times in the spelling panel. Bug reported to apple.
  • The TeX scanner has been thoroughly schooled on the concept of ‘interval notation’, e.g. [1,\infinity), in TeX files. It promises not to get it wrong any more. We’ll keep our eyes on it, but it seems to have learned its lesson.
  • Corrected the flags passed to Launch Services for a —background launch.
  • Added some more missing PHP keywords
  • In TeX (LaTeX) files, use of the \def macro to create an alias to a math environment would inevitably confuse the syntax coloring. Now you can use \def to do something like this:

\def\be{\begin{equation}}p. without TextWrangler seeing that line as the start of an equation.

  • The tab width used in the “Entab” and “Detab” sheet now defaults to the editing view’s tab width, and never to a stored preference.
  • Fixed bug in which the application would look up the wrong password in the keychain in fairly rare situations (specifically, when you had the same account name on the same server for both FTP and SFTP logins, but different passwords).
  • Fixed bug in which using a scripted multi-file search or Apply Text Factory would fail if the items to search were specified as the result of an object-specifier expression that resolved to a list of items.
  • Fixed bug in which Java class methods with no modifiers (such as some constructors) would sometimes confuse the parser such that the function popup would list the method before the class which contained it.
  • Fixed bug in the Java module’s function scanner related to parsing nested class instance creation expressions such

new Foo( new Bar( new Bat() ), baz )p. Such a construction could cause an incomplete function popup.

  • Fixed a bug in the Markdown module, wherein em (or em) and strong (or strong) elements, followed by a tab, would cause the rest of the line/paragraph to be treated as a code section.
  • Running scripts from the script menu is now re-entrant.
  • Fixed bug in which typing certain keyboard equivalents in the file dialog sheets would invoke the corresponding menu command rather than operating as expected in the dialog itself (e.g. Cmd-D for “Desktop”).
  • If for some reason the subprocess supporting sftp file transfers exits, you’ll now get notified in any affected FTP Browser window(s), rather than just having sftp file transfers mysteriously start failing.
  • “Open Counterpart” should be a lot faster now, in cases where a file search is necessary to locate the counterpart file.
  • The function scanner for JavaScripts could be confused by backslash-escaped string delimiters within strings. This is fixed.
  • Fixed a longstanding oversight in the About box. :-)
  • Tightened up the guesser for Strings files. It’s now a lot more difficult for it to guess incorrectly.
  • Ruby’s %W-style “interpreted string-based array constructor” is now detected and syntax-colored appropriately.
  • Fixed a bug in the Java language module which caused the function popup to be incomplete when class instance creation expressions were followed by some unexpected syntax.

Fixed a bug in the java module that caused items to have the wrong names in the function popup when the items were modified with an Annotation, and that annotation included parenthetical arguments. For example, the following method named Foo:

Tatr (bird=1) public void Foo() { return; } ... would have been named "Tatr" in the function popup, instead of “Foo”.

  • In JavaScript files which make use of Prototype-style Object.extend() calls, if the object being extended is assigned to something, that something is now listed in the function popup.

In the following example, ‘foo’ will now show in the popup:

var foo = Object.extend( new bar.bat(), { … } )

  • In JavaScript files, functions which are both enclosed in parentheses and which have assigned names will appear correctly in the function popup, rather than being listed as [anonymous].

Example: var foo = (function() { … })();

  • Fixed regression in the JavaScript module, introduced in 8.7, wherein Function.prototype would be listed in the function popup as [anonymous]

Also, the recognition of Prototype-style Object.extend now works with functions as the second argument to extend(), even if the function is wrapped in parentheses. (Thinking we should rewrite TextWrangler in JavaScript.)

  • Fix for incorrect handling of ‘A’ keystroke events in key_translate when the modifier key was down.
  • Fix for bug where “Save a Copy” (n.b. only “Save a Copy”, not “Save As”) would generate an empty file when saving over the original file.
  • Fix for bug where the wrong values were passed to menu scripts for the menu title and item title when choosing Preferences or Quit from the application menu.
  • Fixed a bug where a scripted multi-file search or replace would display the “not found” sheet when the script was run from the script menu regardless of the “showing results” flag.
  • Fixed a bug where Exchange Words did not work correctly if the right-hand word was at the end of a line.
  • Fixed bug where Process Lines Containing factory engines indicated they were not configured, even though they were.
  • Since we cannot auth save to server volumes, don’t bother trying.
  • Fixed a bug where empty nodes in Disk Browsers could get their disclosure triangles stuck in the open position.
  • The title of the FTP put dialog reflects whether we are putting a copy, or not.
  • When guessing languages from file names, if the filename ends in .gz or .gzip, guess based on the base filename instead of the compressed name.
  • If an SFTP connection fails because the host key changes, give the user the option of editing the known_hosts file directly, instead of making them find it themselves, and having to guess at the line containing the stale key.
  • After restoring disk browser windows, restore their titles as well so Disk Browser 1 still points to the same directory it did when you quit.
  • Made it possible for Text Factories to operate on single line selection ranges.
  • Add/Remove Line Numbers works on a single line selection. (I’m not sure why this would be useful, but there you have it.)
  • Fixed a bug where grep patterns added or removed in the Text Searching pref pane were not reflected in the Find dialog until the application had been recycled.
  • Write out documents in Z-order, so when they are restored (in reverse order) the correct item is selected/active.
  • If you cancel the admin authorization for installing the command line tools, TextWrangler won’t try to automatically install them again. As before, you can use the “Install Command-Line Tools” command on the TextWrangler menu to install the tools at some later point.
  • Fixed bug in which perldoc/pydoc/ri results windows ignored the position and size requested by a previous invocation of “Save Default Window”.
  • When scanning Pascal source files, TextWrangler will stop scanning a string if it encounters a line break in the middle of the string; this prevents subsequent eligible functions from being missed.
  • Fixed crash which would occur when trying to run a Text Factory containing one or more operations which had comments, but which were not otherwise set up.
  • Fixed bug in which “#script#” placeholders in clippings would fail to expand if the script name was longer than 32 characters.
  • Fixed bug in which the Cursor Position display didn’t show up if it was the only visible item in the Status Bar.
  • Fixed bug in which content in JSP files was not checked by “Find All Misspelled Words”.
  • Fixed a problem where the initial state of the backup settings were getting clobbered if you had previously configured a backup directory.
  • use CFAbsoluteTime to track modification dates to prevent timezone drift
  • Document state includes an MD5 of the in-memory text at the time state is written out. On open, we make sure the document wasn’t changed by another editor before applying state. This eliminates drift in selections.
  • Fixed bug in which intra-line diff highlighting didn’t work on lines that had non-ASCII characters.
  • Fixed a bug in the Java function parser related to parsing <dotted.type> parameters in class instantiation expressions.
  • Fixed bug in which the operands to the “Language” file filter test weren’t properly loaded when editing a filter containing such a test.
  • Text Factories are included in “All Readable Files” in the open dialog. There is now a “Text Factories” filter menu item.
  • Fix for documents in “Startup Items” being reopened with the wrong screen position.
  • Sort FTP browsers using the same rules as the document drawer and menu.
  • Shift-double-click on an item in the Clipping floater reveals it in the Finder, just like Scripts and friends.
  • Fixed bug in which PHP function declarations were ignored if more than one comment followed the declaration.
  • Suppress the menu annotation for FTP browser windows not connected to servers, instead of showing an empty pair of parentheses.
  • Fixed a bug in regex based codeless language modules which would causing function parsing to prematurely stop after finding a one-line function.
  • * Fixed a bug where the verify host key dialog could end up stuck between the progress dialog when connecting to an sftp host.
  • If asked, the ssh askpass helper will store the password credentials in the keychain after they were supplied by the user.

This improves the user interaction where you open a recent item, or handle a get url event for an sftp url: after prompting for the password once, subsequent reopens will use the keychain, which is the identicial user experience to ftp reopens, as well as the sftp/ftp browser.

  • Edit fields now correctly draw their frame when enabled and active. The edit fields in the ftp browser disable/lock while the connection is active.
  • Secondary sort order for same-named documents is full path, instead of creation date.
  • Fixed a broken format string when prompting for an FTP password
  • Made a change to avoid creating keychain items when no password was supplied
  • Added a new hack to force alias resolution in the code paths that Save takes. This resolves issues with -35 errors being returned while saving a file to an unmounted (but reachable) AFP volume.
  • Fixed -10000 error when cancelling the authorization dialog for installation of the command-line tools.
  • Made some changes to the SFTP code which should help (though not completely address) the bad behavior when a host pointed to by an open browser goes AWOL due to connectivity issues.
  • The SFTP code timeout for no data on an open request has been reduced from 90 seconds to 20 seconds.

This timeout is adjustable through the secret preference:

defaults write com.barebones.textwrangler FTP:SFTPConnectionTimeout 20p. where the timeout is in seconds.

  • If an FTP/SFTP connection times out, we disconnect from the server, so you only need to click “Connect” to resume, instead of issuing the redundant “Disconnect” first.
  • Fixed a regression where caused the emacs arrow key emulation (Control-N,P,B,F) to stop working.
  • Corrected a regression which resulted in an error alert when trying to print a specific page range of the document.
  • Dragging the document icon out of the toolbar no longer drags a blank square.
  • Typing "// #mark " at the end of a JavaScript file could cause a hang. Also, pragma marks (“// #mark”) in JavaScript files would sometimes have the last character clipped from the name in the function popup.
  • The HTML function and color scanners now correctly recognize the currently allowed MIME types for embedded JavaScript.
  • Fixed off-by-one in generation of search results strings when the match ended on the last character of a file.
  • Fixed bug in which a -1700 error would be reported when bringing up the Find Differences dialog, “Use File Filter” was turned on, and the saved filter had no terms.
  • Fixed bug in which the wrong date/time was displayed in the info dialog for FTP items.
  • The Help Book can install the command line tools for you.
  • The TeX module now correctly handles the commands \big, \bigg, and \Bigg (previously, they could cause incorrect coloring of math environments). If there are other standard commands that don’t take parameters and instead just act on the next character, please tell us about them.
  • Fixed a bug where if you tried to hard wrap a document at a width narrower than your tab width, TextWrangler would hang (and eventually crash).
  • Fixed a bug in the TeX module which caused it to miss the closing of math environments in certain circumstances, which would in turn cause it to miss the closing of any “parent” environments. The result was incorrect indentation in the function popup.
  • In TeX files, math delimiters ($) within \command {parameters} were sometimes ignored or misunderstood (poor things).
  • Fixed -1701 which would occur when asking TextWrangler to open a URL without a path component (e.g. “sftp://localhost”)
  • Fixed crash which would occur when clicking the “Add” button after having deleted a collection that was selected during a previous invocation of that button.
  • Fixed bug in which the PHP function scanner would be confused by more than one “extends” or “implements” qualifier.
  • Fixed bug in which the wrong URL template was used for “Find in Reference” when the lookup symbol was in an embedded language run (e.g. PHP in HTML).
  • Fixed bug in which the “Change Line Endings” text factory action had no effect on documents that were open when the text factory started running.
  • Fixed bug in which the “Ends With” filter term would incorrectly fail when the suffix string used for the match occurred in the middle of the string being tested (as well as at the end).
  • Fixed bug in which no file filtering (including “Text Files Only” testing as well as more advanced file filters) took place for text factories run from the Text Factory menu.
  • Fixed crash which could occur when saving a very large document.
  • Fixed occasional crash which would occur when closing an FTP browser window.
  • Fixed a bug which could cause a crash when clicking the close widget on the last document in the documents drawer, or dragging the last document out of the documents drawer into another window.
  • Changed the collating order in FTP browser windows so that items whose names begin with a period will float to the top of the list.
  • Fixed bug in which the date printed was incorrect when printing page headers for the “Date Last Saved” option.
  • Fixed bug in which TeX syntax coloring would get out of whack if “Color Math Strings” was turned off and the scanner encountered certain constructs in the document.