BBEdit 9.6 Feature Notes

This page presents an overview of the new features, enhancements and visible changes in BBEdit 9.

For detailed information about all the changes included in any specific version of BBEdit, please see the release notes archive.

For complete information on using any of BBEdit's features, please refer to the user manual (choose "User Manual" from BBEdit's Help menu).

Requirements

BBEdit 9 requires Mac OS X 10.5 or later (10.5.8 or later recommended).

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

Additions

  • The text views in browsing windows (disk browsers, search results, P4 opened, and similar) are now editable; rather than having to open a file into a new window from such a browser, you can just edit it right in the window.

  • There is a new command on the Window menu: Show Scratchpad

    The Scratchpad window's purpose is to be a space where you can manipulate text by performing transforms, manual edits, or batches of copy/paste.

    It is ideal for quickly beating text from one source into submission before pasting it elsewhere.

    The Scratchpad window automatically saves its content and state, eliminating those pesky "Save Untitled 237?" warnings when closing a window, or quitting BBEdit.

    The Scratchpad is also available from BBEdit's dock menu.

    Finally, there is a new item on BBEdit's Services menu: Append Selection to Scratchpad. This command will take the selected text, and place it at the end of the scratchpad, attempting to preserve any selection that was previously present. The Scratchpad window does NOT need to be open to use this command. Any text appended in this fashion will be present the next time the window is opened.

  • BBEdit now includes a copy of Consolas Regular, an excellent antialiased code editing font. This font is licensed from Ascender Corporation for use only with BBEdit. The 12-point size of this font is the factory default setting.

  • The internal FTP implementation has been rewritten to improve performance and reliability. Users with dual (or more) core machines may notice additional performance benefits.

    The "Passive" setting for FTP is no longer used. When transferring, BBEdit will first attempt a passive connection; if the server does not support passive transfers, BBEdit will then attempt a non-passive (PORT) connection. Thus, the "Passive" setting is gone from the FTP preferences, FTP browser, Save to FTP dialog, and the scripting terminology for FTP commands.

  • Added a missing Migration command (change column) to the clipping set for Ruby/Rails.

  • Added "Save as Styled Text" to the File menu, and "Copy as Styled Text" to the Edit menu. These function similarly to their HTML analogs, but the Save variant saves an RTF file, and the Copy variant copies styled text (which is more easily shared with other applications).

  • Added "Multi-File Search" command to the Find menu. This unconditionally opens the Find dialog with the "Multi-File Search" option turned on.

  • There is a new command on the File menu: "Reload from Disk". This command will examine the file on disk, and if it's different, reload the front document's contents from the file on disk. This is useful in situations where the file may have changed without BBEdit noticing, which will be the case if "Automatically refresh documents" is turned off in the Application preferences, or in the case of a document on a shared disk that gets modified by another workstation.

  • There is a new command on the Windows -> Palettes menu: "Colors". This command shows and hides the system color panel.

  • There's a new option in the "Insert Folder Listing" dialog: "Show invisible items". If turned on, the generated listing will include invisible files/folders and the contents of packages.

  • There's a new group of sources in the Find dialog's source list: "Xcode Projects". This group shows the projects in Xcode's Recent Projects menu; selecting one (or more) will instruct the multi-file search to search each text file in the project.

  • Find Differences now uses the system diff tool for generating the difference ranges displayed in the application. This should result in more usable results.

  • RCS keywords are canonicalized down to their unexpanded state for comparison.

    e.g. $Author: Jim Correia$ -> $Author$

    This means that "ignore RCS keywords" isn't literal, but it does what you'd expect.

    • changes in RCS keyword expansion state are not diff significant
    • adding new RCS keywords to a file/line is diff significant
    • any other changes on a line with RCS keywords is diff significant
  • Stuff copied to the clipboard carries a source language hint. Pasting into a document whose source language is unknown will cause the document to inherit the clipboard's hint.

  • Dragging text into an empty document from another editing view will now pick up the source language from the originating view.

  • The C/C++/Obj-C/Obj-C++ scanner now generates fold ranges for multi-line parenthesis blocks (including argument lists), subject to the MinimumLinesForBlockFold preference.

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

  • The Navigation bar has a document/state dirty indicator, so those inclined to disable the toolbar and ignore the close box indication have some way to see if a document is dirty or not.

  • The Ruby language support has been rewritten, with improvements as follows:

    • greatly improved function, class, and module detection.

    • more extensive support for text folding.

    • Better handles interpretive strings. The following:

      puts "d#{"rie"}w".reverse

      ... should show only "d#{"rie"}w" colored as a string when in a Ruby file (new module).

    • Better handles the optional then at the end of if or elsif statement.

  • Significant update to the JavaScript module. Better support for Prototype-style object definitions, more consistent throughout.

  • BBEdit's support for ctags files has been improved:

    • relative paths in tags files are now interpreted (relative to the tags file's location); there is no more need to go through all kinds of gyrations to generate absolute paths in tags files, just so that BBEdit can locate the symbol definition.

    • BBEdit now supports old-format tags files which contain a vi search string but no line number information.

    • When loading symbols for ctags syntax coloring, BBEdit will look for files named "tags" in each folder in the chain from the current document's folder up to the root of the file system. This improves symbol lookups for projects that aren't structured exactly like ours. :-)

    • You can now add tags files to specific locations to make symbols available as completion data sources when editing in desired languages. In particular:

      • When building a language module, place a file named "tags" in the language module's "Resources" directory, and those tags are used as completion sources.

      • You can generate a tags file (using exuberant ctags or bbedit --maketags) and place the resulting file in Application Support/BBEdit/Completion Data/<language name>/, where "<language name>" is the name of the language as it appears in the list of installed languages (or on the Languages popup menu).

        So, for example, if you were to generate a tags file for the 10.5 SDK so that you could add completion data when editing Objective-C files, the file would go in Application Support/BBEdit/Completion Data/Objective-C/.

        Tags files can be given any appropriate name, so you can have multiple tags files for a single language, and they will all be examined when generating completions.

  • The "New Document" dialog has been updated so that it's now possible to create documents using HTML5.

  • A syntax table is now in place for HTML5, so that Check Syntax, Tag Maker, and Edit Tag should now behave reasonably on HTML5 documents.

  • Added ObjectiveC 2.0 keywords to the Obj-C and Obj-C++ language modules.

  • Documents as a scriptable element of text window can now be accessed by name and unique ID. (Previously, only indexed access was supported.)

  • "Open Counterpart" can now be used for files which will be implictly created at save; for example, bbedit foo.h followed by an Open Counterpart command will open foo.cp if it can be found using the standard rules.

  • There's a new preference in Text Status Display: "Document statistics". When turned on, this will add an item to the window status bar, showing the number of characters, words, and lines in the document. There's also a document-icon indicator; when it's uncolored the stats represent the entire document; when it's colored the stats represent the selection range. (Click on the item to toggle between the modes.)

  • You can now double-click on a string delimiter to select the contents of a quoted string, in files with syntax coloring turned on. The selection range honors the "Include delimiter characters when balancing" setting in the Editing: General prefs. You can also double-click on an element's angle bracket in HTML/XML documents to select the contents of the element.

  • BBEdit can now transparently read and write text files compressed with bz2 (e.g. rolled system logs in 10.5) as easily as it reads and writes regular text documents (and, as a reminder, gzipped text files). For bonus points, try opening and changing a binary plist compressed with bz2. :-)

  • When "Make backup before saving" is turned on in the Text Files prefs, and you close a document with unsaved changes and elect to discard those changes ("Don't Save"), BBEdit will save a snapshot of the document's contents. Just in case. The snapshot will be written into the same directory as the document, and its name will follow the Emacs convention "#foo.txt#". If "Preserve file name extension" is turned on, the snapshot's name will be "#foo#.txt".

  • You can now use an Emacs variable to control whether or not a given file is backed up. There are two ways to do this:

    • Absolute: If the variable line/block contains a "make-backup-files" variable, that variable's value will override the global "Make Backup before saving" preference.

      -*- make-backup-files: 1; -*- --> always back up this file -*- make-backup-files: 0; -*- --> never back up this file

      If the first letter of the variable's value is "y", "t", or "1", the value is "yes", otherwise it's "no". These are all synonymous:

      make-backup-files: yes
      make-backup-files: y
      make-backup-files: true
      make-backup-files: t
      make-backup-files: 1
      
    • Inhibit: If the variable's line/block contains a "backup-inhibited" variable, and its value is true (see above), then the file will never be backed up, even if "Make backup before saving" is turned on in the global preferences.

      It really only makes sense to specify "backup-inhibited: 1", since otherwise the file would be backed up if the global pref is on, and not otherwise.

  • If a symbol lookup in a Python file fails, and it appears to be a method of a class, we'll try to look up the class.method as well.

  • Projects.

    A project is the modern expression of the old "File Group" feature, but much more useful, chiefly because project windows now include an editing view: click on a file in the list on the left, and it appears for editing in the pane on the right.

    To create a new project, choose File -> New -> Project... You will need to decide where to place your project on disk; thereafter, the project document will autosave as necessary.

    In the project window, you can hide the top toolbar as desired. If the toolbar is hidden, the action buttons in the lower left corner of the file list remain useful for manipulating the project's members.

  • BBEdit now handles the "txmt:" URL scheme. This allows properly formed "txmt:" URLs generated by the Ruby On Rails "FootNotes" plug-in (and some others) to open files in BBEdit and (optionally) select a requested line and column. (NB: If the system doesn't correctly recognize BBEdit as an allowable handler for such URLs, RCDefaultApp is a good tool for adjusting the bindings.)

  • There is now a "Close All" dynamic menu item on the action menu in the documents drawer. This is particularly useful for closing all the documents associated with a project window without closing the project itself.

    Also, option-clicking on a close widget in the documents drawer will close all the text documents in that window. (MDI text windows will also close as a side effect, but project windows will remain open.)

  • The Application menu sports a new item: Provide BBEdit Feedback. This command will bring up the tech support contact form on our website.

  • Selected items in project lists and disk browser lists are now exported to contextual menu plug-ins.

  • Added "Collapse Enclosing Fold" to the View menu; this command will collapse the auto-generated fold that most closely surrounds the current insertion point (or start of the selection range).

  • Changes to split views in results and disk browsers:

    There is a new command on the view menu "Show/Hide Editor" which can be used to toggle the embedded editor visibility in disk browsers and results browsers.

    The toggle editor button in the action bar at the bottom of the file list can also be used for this purpose.

    When hiding the embedded editor, the associated document will be removed from the window (and closed, after prompting you, if it was not open elsewhere.) Because of this potential need for user interaction, you cannot collape the editing view entirely by dragging the view splitter; you must use the button, menu command (or in the case of results browsers, a double click on the view splitter.)

  • Added a "Delete" command to the contextual menu and action menu in disk browsers.

  • Search Sources can be enabled/disabled via the Text Search preference pane.

  • Option-clicking the close widget in the windows palette will close all windows. (This matches the same conceptual change made to the documents drawer list, as well as the standard behavior for option-clicking the close widget in the titlebar of windows.)

  • Added rudimentary support for define_method to the Ruby module. Methods defined with it should be listed in the function popup. Yay, metaprogramming.

  • "Open Counterpart" will ask Xcode for the file's counterparts when possible.

  • The items in the "Saved Search Sets" source group (for multi-file searches) now have an "X" widget; clicking the X deletes the search set (after confirmation).

  • Items in the "Recent Folders" group in the multi-file search sources list now have an "X" widget; clicking the X will delete the recent item from the list (without disturbing the folder that it refers to).

  • Disk browsers get "New Text Document" and "New Folder" commands on the action and contextual menus. They work pretty much as one would expect.

  • Script tags in HTML files which DO NOT have a src attribute are now listed in the function popup (those with src are already listed in the "includes" popup). This is similar to the style entry for stylesheets: functions and objects added to the function popup as a result of the script tag are indented beneath the script tag's entry, to suggest containment.

  • New Find windows!

    There are new Find and Multi-file Search windows; where they overlap, they provide a consistent and modeless interface to BBEdit's legendary text search and replace capabilities.

    If you're familiar with the old Find dialog, you'll generally feel at home, but there are some important differences and additions of which you should be aware:

    • The Find dialog has been split in two, with one window for searching only the front document, and one window for searching more than one document (including folders, arbitrary open documents, BBEdit and Xcode projects, and so forth).

    • The (fairly confusing) collection of options to configure which text actually gets searched (for single-file searches) has been condensed down to a single pair of "Search in:" options: "Selected text only" and "Wrap around".

      "Selected text only" affects only the "Find All" and "Replace All" operations: if there is a selection range in the front document, this option will search only the selection range if turned on, or the entire document (starting from the top) if turned off.

      "Wrap around" affects only the "Next", "Previous", "Replace", and "Replace & Find" operations: if the search reaches the end of the document (or the beginning, if doing a "Previous"), then "Wrap around" will continue the search from the appropriate end of the document.

    • Keyboard navigation is radically different (as it must be, given the new windows' modeless nature).

      • Return or Enter in the "Find" field will do a "Next" in the single-Find window, or a "Find All" in the Multi-File Search window.

      • Striking the Escape key (not too hard!) will close the window.

      • The appropriate commands on the Search menu (Find Next, Find Previous, Replace, Replace All, Replace & Find Again, and a new "Find All") will trigger the corresponding action in the front Find window.

      • It's not possible to use the command-key equivalents from the old modal Find dialog for toggling items in the Find window, because those equivalents collide with factory keyboard equivalents (or system standards) for different menu commands. So there's a new group of keyboard equivalents for controlling Find and Multi-File Search window items. These keys can be set in Preferences -> Menus -> Find Windows.

        The factory defaults for these keys are as follows:

        Case sensitive Control-shift-N
        Entire word Control-Shift-E
        Grep Control-Shift-G
        Selected text only Control-Shift-S
        Wrap around Control-Shift-W
        Open search history Control-Shift-H (new)
        Open saved patterns Control-Shift-P (new)

        If you are in the habit of assigning keyboard equivalents to saved clippings, it's possible that these defaults may overlap with your clippings. If so, you can of course change the commands from the factory defaults.

    • In the Multi-file Search window, you can use the keyboard when the search sources list has focus, as follows:

      • Return/Enter starts the search;

      • Escape dismisses the window;

      • Type-to-select works in the list (when it has focus);

      • Space toggles the selected items;

      • Delete removes the selected items from the list (after confirmation, and only if they're eligible as indicated by the "X" widget).

    If you find yourself more comfortable with the old interface, there is an expert preference available:

    defaults write com.barebones.bbedit FindDialog:UseOldSk00lFindDialog -bool YES

  • Search and replace history is now persistent across runs of the application.

  • Image windows update their content when the backing file changes, making things like developing POVRay scripts a little bit easier.

  • Changes to the project list user interaction model.

    • Removed the anachronistic behavior where holding down option while opening project items opened them using their LS/Finder bindings.

    • Double clicking on a folder no longer opens a disk browser. Instead, it toggles the expansion state of that node.

    When the editor is hidden, the projects list works as it did in previous releases. That is

    • it accepts keyboard focus
    • return and double-click open the selected items

    When the project editor is visible, the project list can either work the same was as it does when the editor is hidden, or it can work in "single-click" mode.

    There are two additional secret preferences which control this behavior.

    Projects:ProjectsListCanAcquireKeyboardFocus -> BOOL -> NO
    Projects:OpenItemsOnSingleClick -> BOOL -> YES
    

    Having the list not accept keyboard focus, among other things, avoids "dancing focus" when opening items via single click.

    When the single click setting is set, most single clicks will open the associated document in the attached editor, and put keyboard focus in the editing view.

    Certain single clicks don't result in an open action. (I'm specifically not listing them all here, but the behavior has been carefully designed so that it will feel right in usage. Examples include clicks which would require we spawn a window, clicks which extend the selection, etc.)

  • Added a "Reveal in Finder" command to disk browser and project windows.

  • For compatibility with scripts written for pre-9.0 versions of BBEdit, the scripting interface now performs the following name mapping when changing the "text encoding" property of a document:

    • "Unicode™ (UTF-8)" = "Unicode (UTF-8)"
    • "Unicode™ (UTF-8, no BOM)" = "Unicode (UTF-8, no BOM)"
    • "Unicode™ (UTF-16)" = "Unicode (UTF-16)"
    • "Unicode™ (UTF-16, no BOM)" = "Unicode (UTF-16, no BOM)"
    • "Unicode™ (UTF-16 Little-Endian)" = "Unicode (UTF-16 Little-Endian)"
    • "Unicode™ (UTF-16 Little-Endian, no BOM)" = "Unicode (UTF-16 Little-Endian, no BOM)"

    Note that this transformation does not operate in the reverse direction; if you get the text encoding property and explicitly compare the name, you will need to update your script.

  • Integrated Jim's .ini language module.

  • C-language files (and all related languages, like Obj-C, C++ and header files) will now show FIXME and TODO items in the function popup. Only "//" comments are searched, and the comment must start with one of the following: "FIXME:" "FIXME!" "FIX-ME:" "FIX-ME!" "TODO:" "TODO!" "TO-DO:" or "TO-DO!". The text added to the function popup starts with the first character of the FIXME or TODO and ends with the last non-white character on the same line.

    Examples:

    • // FIXME This little bug could erase the intertubes.

    • // TODO! Add support for Apple's "Crash Only When Convenient"

  • The command formerly known as "Open in Separate Window" is now called "Move to New Window". It will move the current document (or selected documents when invoked from the documents drawer) into a new editing window (removing them from their current editing window.)

    There is an additional command "Open in Additional Window" which will open the current document (or selected documents when invoked from the documents drawer) in an additional window that can be edited side by side with the original document.

    Both commands are only available for text documents.

  • Ponies.

  • Attempting to bring up a contextual menu in the "dead" space at the bottom of a disk browser list now works, presenting you with "globally" available commands New Folder and New Text Document.

  • The application automatically saves its state (open documents and windows) once per minute, so if something bad happens to your machine, there's a pretty good chance that the next time you start up, things will be as they were when the event occurred.

  • Python function decorator names are now detected and colored.

  • You can drag stuff to the sources list for Text Factory configuration

  • The Text Factory sources list remembers selected items and twist state between invocations.

  • Text completion!

    BBEdit can now figure out completions for symbols as you're editing. The preference for controlling when this happens is in the "Editing: General" preferences:

    • After a delay in typing

      If you pause briefly while typing, BBEdit will figure out the completions for what you just typed, and display them.

      The delay can be adjusted from the command line if desired:

      defaults write com.barebones.bbedit Editor:AutoCompleteDelay -float 0.5 # sets the auto-complete delay to half a second

    • Only manually

      Completion will only take place when using a manual completion command (see below).

    Automatic completion can be turned on and off on a per-language basis (in the Languages preferences) if desired. It is off by default for the "Log File" and "Data File" languages.

    Completions can be derived from a variety of sources, including (in no particular order and without limitation):

    • clippings (both language-specific and universal);

    • ctags symbols computed by running the current document through 'ctags';

    • ctags symbols found in 'tags' files in the current document's hierarchy;

    • predefined names for the source code language at the point of completion;

    • language-specific completions;

    • completions provided by the system spelling system.

    Completion may be triggered at any time (whether or not automatic completion is enabled) by using the "Complete" menu command on the Edit menu. By default, F5 is assigned to this command; you can change this equivalent (as usual) by using the Menus preferences.

    Note: Text completion completes clippings in the same way that the "Insert Clipping" command used to (and still does). So, the behavior of F5 should be indistinguishable if you were used to using it to complete clippings.

    You can also use the Escape ("Esc") key to invoke text completion. This is off by default, and may be turned on using the command line, as follows:

    # allow the Escape key to invoke the "Complete" command defaults write com.barebones.bbedit Editor:UseEscapeKeyAsCompletionTrigger -bool YES

    Note: Because the Escape key has a special meaning when "Use Emacs key bindings" is turned on (Editing: Keyboard preferences), if you choose to use the Escape key as a completion trigger, you will have to press it twice to invoke completion in this case.

    Completions for HTML/XHTML documents are now generated contextually for tags and attributes, based on the doctype currently in use.

  • The tab key can now be overloaded to perform certain actions in addition to the traditional "insert a tab" (or the equivalent amount of spaces).

    When these actions are enabled, holding down the option key while pressing the tab key will bypass the special actions and insert a tab character.

    In all cases, if the special action is not appropriate in the current context, pressing the tab key will result in the default behavior (insert tab character).

    • The first of these new actions is "go to next placholder." (Hold down the Shift key to reverse the direction.) This is equivalent to the command on the Search menu. To control this behavior, use the "Use Tab key to navigate Placeholders" preference (Editing: Keyboard).

    • For refugees from Windows who are used to having Tab indent a line (or selected range of lines), there's a new preference in Editing: Keyboard: "Allow Tab key to indent text blocks." When turned on, this setting allows Tab to function as a synonym for Shift Right on the Edit menu (and Shift-Tab as a synonym for Shift Left).

  • There's a new color setting in the Text Colors preferences: "Predefined names". This symbol class is used for words which are not language keywords, but which are predefined by the language's reference implementation and/or are part of the language's standard library/framework support and/or have other "special" meaning to developers writing code in that language.

    The color may be changed on a per-language basis in the Languages preferences: double-click on the language's name in the list and examine the Colors tab in the resulting sheet.

  • Language module developers may use the following constructs to support predefined names:

    • If a BBLMPredefinedNameList key appears in the module's property list, it is an array of strings, each of which is a predefined name. (This key is mutually exclusive with BBLMPredefinedNameFileName; you may use one or the other but not both.)

    • If a BBLMPredefinedNameFileName key appears in the module's property list, it is a string which names a text file in the module's Resources bundle directory; the file contains one predefined name per line. (This key is mutually exclusive with BBLMPredefinedNameList; you may use one or the other but not both.)

    • If BBLMSupportsPredefinedNameLookups appears in the module's property list and is TRUE, BBEdit may call the module with the kBBLMMatchPredefinedNameMessage. The parameters for this message are the same as for kBBLMMatchKeywordWithCFStringMessage.

  • In the Languages prefs, the options sheet for Python now has a tab for Python-specific options, in which you can choose the color to use for decorators.

  • Reworked the existing entries in the CSS clipping set to use the placeholder mechanism.

    Added a couple of new useful entries to the CSS clipping set for media`,import` and rule sets.

  • Added .php5 to the factory default list of language mappings.

  • Clipping set auto-switching is now more context sensitive. The active clipping set will be picked based on the language of the insertion point. This is a significant improvement particularly when working with languages embedded in HTML. (CSS, JavaScript, Ruby, PHP, etc.)

  • The list of clippings generated for text completion or Insert Clipping is always language sensitive. Clippings will be picked from

    • all appropriate sets for the current language
    • additional sets appropriate for that language (e.g. HTML for Ruby in HTML or JSP)
    • possibly the active set (see below)
    • the universal set

    This makes it much more likely that you'll end up with a useful clipping in the completion set.

    The active set is always included for "Insert Clipping". It is only included in completion set if it is appropriate for the current language, or was a manual pick for the target document. (This avoids having PHP clippings appear in a Python file, for example, because you don't have a Python clipping set and the PHP set was the last one used.)

  • You can now review and apply sub-line differences individually in the results of Find Differences.

    Yeah, you heard that right.

  • New command on the Search menu: "Replace to End". This command provides the pre-9.0 behavior for anyone who needs it: everything is processed from the current insertion point or start of the selection range to the end of the document.

  • When setting up the default browser list for HTML previews, we now recognize application stubs created by VMWare 2.0's "Unity" feature, so that you can preview your documents in FireFox or Windows IE while running in VMWare 2.0.

    If you have an existing browser list, you can as always add these applications to the list in the "HTML Preview" preferences, either manually or by using the "Find All" button.

  • Added a new clippings placeholder: #selectionorplaceholder placeholder_name#.

    If the document has a selection when the clipping is inserted, the placeholder will be replaced with the selected text. If there is no selection, a placeholder named "placeholder_name" will be inserted into the document.

    This placeholder is particularly useful when building "dual-mode" clippings - that is clippings that are designed to be inserted via traditional means (the clippings palette, keybindings) or via the completion mechanism.

  • The file filtering interface supports a new term: "File Path". This is a simple string match against a given file's full path.

  • The Text Files preference pane carries a new option: "Trim trailing whitespace". If this preference is enabled, BBEdit will trim all trailing non-vertical whitespace from the file before writing it out.

  • The ASCII floater uses the "standard" names for NUL, BEL, etc. for characters below space (0x20).

  • If Perforce is installed, the bbedit command line tool will attempt to map depot specs and client specs into file paths.

  • You can now enter (or paste) a Perforce depot specification in the "Open File by Name" dialog and BBEdit will ask Perforce to resolve it. (You've been able to use Open Selection on a Perforce spec for a while now, so maybe this is more of a bug fix than a feature addition.)

  • Language modules may now be installed by double-clicking them (or by drag-and-drop to the application), and offer an "Install and Relaunch" option.

  • BBEdit now supports .ini-style preferences (primarily for setting Expert settings), as follows:

    The existing .plist is still the preferred preference storage.

    If a preference key does not exist in CFPreferences, we then look in ~/.bbedit for a matching preference key.

    Our two-stage namespace has been preserved, so if the old preference was was:

    <key>StatusBar:SGIButton</key>
    <true/>

    then the .bbedit file would have this data:

    [StatusBar]
    SGIButton = 1
    

    If neither preference system possesses a setting, the factory default is used.

    For those who feel the need to, you can create a section in your .bbedit file:

    [PreferINIPrefs]
    

    Which will cause BBEdit to ignore things set in the GUI, and prefer those settings.

    If you do this, note that the UI does not, and will never, track changes to the .bbedit file.

  • BBEdit now supports directory-specific settings. To use these, write a well-formed INI file (see above), whose keys and values are the same format as those in ~/.bbedit. The file may be named anything, as long as its name ends in ".bbeditSettings". The settings specified in that file will override all others and will apply to any file that is opened from the same directory as the settings file, as well as any file opened from a subdirectory of the settings file. So, given this arrangement of files:

    super.h
    folder/
        Foobar.bbeditSettings
        mumble.c
        misc/
            notes.txt
            scratch.h
    

    Any settings specified in Foobar.bbeditSettings will apply to mumble.c, as well as all of the files in misc, but not to super.h.

  • There's a new command on the View menu: "Go Here in Terminal". It's enabled when the active document exists on disk; choosing it will open a Terminal window with the current working directory set to the document's parent directory.

  • BBEdit now has a "Sleep" command. The menu command is on the application menu, and the application responds to kBBEditSuite/kAESleepApplication.

    Control over saving of existing documents is in place with an expert pref:

    defaults write com.barebones.bbedit Misc:SaveTitledDocumentsBeforeSleeping -bool YES

    If it's set to YES, then any document that exists on disk will be saved before sleeping. If set to NO (the default), the document gets an autosave which will be restored when the app comes up again. (Untitled unsaved documents are always autosaved, irrespective of the preference setting.)

    When BBEdit gets quit because of a system shutdown, restart, or user logout, it now does a "Sleep BBEdit" in order to restore as much of the application state as possible when starting back up. (This means that you may not be prompted to save new or unsaved documents, since they will be autosaved when the application sleeps.)

  • There's now an expert preference for disabling passive FTP, in order to deal with hosts that misbehave with given the "PASV" command.

    Passive FTP can be disabled per host, per domain, or globally:

    FTP:DisablePassiveFTP:foobar.example.com - only for "foobar.example.com" FTP:DisablePassiveFTP:example.com - only for servers in "example.com" FTP:DisablePassiveFTP - global preference

    Our recommendation is that you disable per host in preference to globally or per-domain, but at the end of the day, do whatever works. :-)

  • There's now an expert preference for controlling the use of ssh compression when using SFTP, in order to deal with hosts that can't handle ssh compression.

    SSH compression can be disabled per host, per domain, or globally:

    FTP:EnableSSHCompression:foobar.example.com - only for "foobar.example.com" FTP:EnableSSHCompression:example.com - only for servers in "example.com" FTP:EnableSSHCompression - global preference

    Our recommendation is that you disable per host in preference to globally or per-domain.

    (Note that ssh compression is on by default.)

  • There's greater control available over whether documents on remote servers (FTP/SFTP) or unmounted volumes are opened when automatically reopening documents at application startup. BBEdit will now prompt you if you have one or more documents opened via FTP/SFTP, and give you the opportunity to skip them or to reopen them.

    The following expert prefs may be used:

    Startup:AllowVolumeMount # If set to NO, BBEdit will not attempt to mount a volume # containing a document it wants to reopen. defaults to YES.

    Startup:ReopenRemoteDocuments # If set to NO, BBEdit will not attempt to open any # documents that were opened from FTP/SFTP servers. Defaults # to YES.

    Startup:PromptToReopenRemoteDocuments # If set to NO, BBEdit will open remote documents without # asking, if Startup:ReopenRemoteDocuments is set to YES. If # set to YES, BBEdit will prompt to give you the opportunity # to skip remote documents. Has no effect if # Startup:ReopenRemoteDocuments is set to NO. Defaults to YES.

  • Lasso is now a fully supported language, with syntax coloring, functions listed in the function popup, and automatically generated fold points.

  • By request, the Scratchpad window gets "Save a Copy".

  • The bbdiff command-line tool now supports an additional command form:

    bbdiff [options] file /path/to/some/folder

    If /path/to/some/folder/file exists, then file will be compared against /path/to/some/folder/file. Otherwise, an error is reported.

  • The command line tool can make BBEdit compatible ctags files:

    bbedit --maketags [optional list of dirs]

    This can be used as an express way to invoke exuberant ctags, as follows:

    # generate tags for the directory rooted at CWD # and write the "tags" file in CWD bbedit --maketags

    # generate tags for each of the supplied directory trees, and # create a "tags" file at the top of each directory tree bbedit --maketags /path/to/some/directory /path/to/some/other/directory

  • Language modules can now specify a default value for the "Reference URL Template" language-specific preference. This is specified in the plist as follows:

    <key>BBLMReferenceSearchURLTemplate</key> <string>http://www.example.com/foobar.cgi?__SYMBOLNAME__</string>

  • There's a new color setting in the Text Colors preference: "Numeric Constants". This can also be adjusted on a per-language basis in the appropriate language's settings (in the "Languages" preferences).

  • Next to the file path display in the editing view toolbar, there is a small menu control. Clicking this control displays a popup menu with commands to copy the file's name, path, or URL. (These commands are also available via Edit -> Copy Path.)

  • The Go To Line sheet can take relative input: Entering a value prefixed with +/- will add the value to the current line number. For example, with line 100 selected, "+75" will move to line 175; "-75" will go to line 25. An unsigned number will move to the specified line number, as before.

  • There's a new setting in the Windows preferences: "Cascade new windows". When turned ON (the factory default), new windows (or documents with no saved state) are cascaded down-and-right, beginning with the placement and size determined by "Save Default Window" (if such exists). When turned OFF, new windows (or documents without saved state) are placed in the same location every time.

  • Disk browsers and project windows get an "Open with Finder" command on the contextual menu and action (gear) menu. Choosing this command asks the system to open the selected items, which in turn may open them in an application other than BBEdit.

  • The contextual menu in text views gets a new command: "Move Selection to Scratchpad". This will append the selected text to the end of the Scratchpad, and delete it.

  • Added "Go Here in Disk Browser" to the View menu and to the contextual and action menus for disk browsers and project windows. Choosing it will open a disk browser on the selected item (if it's a folder) or selected item's directory (if it's a document or a file in a project list or disk browser).

  • Two new commands on the contextual menu in text views: "Find all .... in Selection" and "Replace all ... with ... in Selection". These commands use the current search state (same as what drives the commands on the Search menu). "Find All..." will create a results window. If the replace string is empty, then "Replace all" will change to "Delete all" to reflect the behavior.

  • There's a new command on the Search menu, which appears right below the "Multi-File Search" command: "Search in ...".

    If a project or disk browser is the front window, then this command's name reflects the name of the project, or the name of the directory that you're currently browsing in the disk browser.

    Choosing this command will open the Multi-File Search window with the project (or disk browser's current directory) selected as the source for the multi-file search. Make any desired adjustments to the search settings and then start the search (or just hit Return/Enter and you're off and running).

    If the Multi-File Search window is in front, the command will target the frontmost (Z-order) project or disk browser, whichever occurs first.

    The same command is available on the action ('gear') menu in projects and disk browsers as well.

  • Added a feature to the language module interface for giving the module control over resolution of include file references.

    If the language module has

    <key>BBLMCanResolveIncludeFiles</key>
    <true />

    in its plist, then BBEdit will send kBBLMResolveIncludeFileMessage for every include chosen off the includes menu. The param block will include a CFStringRef with the name, a CFURLRef to the document on disk (which may be NULL) and a place for you to put a CFURLRef when returning.

    If the module returns NULL and noErr, then BBEdit will assume that the module declined to do anything with the string and will look for the file as usual.

    If the module returns a non-NULL URL, BBEdit will resolve it, so the module can make a file://, http://, FTP or SFTP URL and the right thing will happen. If the module returns something other than noErr, BBEdit will not attempt anything else with the include and will report the error.

  • The Menus preferences now has a group of commands so that you can assign keyboard equivalents to operations in FTP/SFTP browsers, if desired.

  • New option in the Python language settings (Preferences -> Languages and then double-click on the Python item in the languages list): "Scan HTML strings for functions". When turned on (the default, and 9.0 behavior), items in HTML code in triple-quoted strings are shown on the function menu (as though the code existed in a freestanding HTML document); when turned off, they don't.

  • There is an option to suppress callouts embedded in comments from the function menu. See Preferences -> Text Status Display.

  • There's a new setting in the "Editing" tab for language-specific preferences (Preferences -> Languages): "Tab width". Edit the value here to set a language-specific value for the default tab width.

  • BBEdit now implements the necessary hooks so that the following JavaScript functions now work when using "Preview in BBEdit":

    window.alert
    window.confirm
    window.prompt
    window.onbeforeunload

    JavaScript user interaction is disabled during auto-reloads that BBEdit performs as you type or save your documents.

    window.onbeforeunload is not triggered for an auto-reloads, or on window close.

    Additionally, the "Choose" button for <input type="file"> elements is now functional.

  • If the list of a results browser is modified (by deleting items from the list), a confirmation is required to close the results window.

  • Disk browsers can now explore tarballs (.tar, .tar.gz, .tgz files). When an eligible file is in the listing, it will have a disclosure triangle next to it. Twist it open to reveal the files and directories within. As with other items displayed in disk browser listings, you can view files in the editor view, or double-click them to open in a separate window for editing.

  • Added an additional Apple Event parameter for programmatically determining a "fallback" encoding, in cases where the file's encoding could not be automatically determined:

    #define keyFallbackEncoding 'RdFB' // typeLongInteger, same semantics as keyReadEncodingValue

  • The "Run Unix Filter" action in text factories is now more flexible. Previously these required a unix executable (+x mode).

    Unix executables continue to work as they have in the past.

    If the chosen 'filter' is not an executable, but has a #! line, is it automatically run for you.

    All other 'filters' log a reasonable error.

  • When choosing "Don't Save" from the confirm save before Preview prompt (when preview is working in Ask mode), the document is previewed through a temporary file. (The previous action was identical to cancel; a no-op.)

  • The various "reveal in Finder" operations (explicit command, or click on the document's icon in an editing view toolbar) will now ask PathFinder to do the work, if it is running.

  • "Move to New Window" is enabled in for project windows containing only one document.

  • Added support for using 'space' (modified by at least the command or control key) as a keyboard shortcut.

  • Auto-save now works for all document classes for which auto-save is approprate (i.e. not projects, which are already autosaved), not just text documents. Untitled documents are now remembered with saved application state (including sleep) and restored to their correct content and position as necessary.

  • If writing a backup file requires elevated privileges, BBEdit can help you out.

  • Added support for Python 3 to the #! -> Check Syntax command.

  • You can now use the scripting interface to create new items in a project:

    tell application "BBEdit"
    
        tell project document 1
    
            -- add a file or folder:
            make new project item with properties {file:POSIX file "/Users/siegel/p4/trunk/BBEdit/dox/"}
    
            -- add a URL (with optional name):
            make new project item with properties {URL:"ftp://foo.example.com/", name:"Mumble"}
    
            -- add a collection (name required):
            make new project collection with properties {name:"fumble"}
    
        end tell
    
    end tell
    
  • BBEdit uses Growl to notify upon completion of some actions (Replace All, Compare Folders, Multi-file Search/Replace, and Text Factory execution).

  • The Enter key can optionally generate a CR (controlled in Editing:Keyboard preferences).

  • When pasting into an editing view, BBEdit will convert non-breaking spaces (Unicode 0x00A0) in the pasted text to ASCII spaces (Unicode 0x0020). To disable this conversion:

    defaults write com.barebones.bbedit Clipboard:ConvertNonBreakingSpacesWhenPasting -bool NO

  • The Clippings folder can now contain aliases to other folders, either at the top level or nested. This allows you to place clipping sets in other locations (for example, if you're updating clippings from source control systems that make it inconvenient to use the main Clippings folder), or to combine clippings sets by creating a new top-level folder and then placing aliases inside it to other clippings sets.

  • On Mac OS X 10.6 and later, you can now use QuickLook to examine the content of selected non-text files in disk browsers and project windows. It works pretty much as you'd expect: select the item and hit Space.

  • There's a new item in the Open dialog: "Show hidden items". This controls whether the dialog box shows invisible files and folders. The setting you choose will persist across runs of the application.

  • FTP browsers get a "New..." button, which when clicked allows you to create a new file or folder in the location to which you're currently connected. Creating a new file will open it; creating a new folder will navigate into it.

  • You can now use the extended hex notation in literal searches: \x{NNNN}, where N is any hexadecimal digit. You can use up to four hex digits; the following examples are equivalent:

    • \x{d}
    • \x{0d}
    • \x{00d}
    • \x{000d}
  • There is a new completion token which represents "optional" completions:

    <#?#>

    If a "Go to Next Placeholder" operation would select the optional token, BBEdit will remove the token text when performing the command.

  • "Open Selection" and "Open File by Name" now use the front document's default save location if one is available and the document isn't saved to disk. This makes it useful in the case of a file that will be implicitly created when saving but which doesn't exist yet, as in bbedit /path/to/some/new/file.

  • The about box now lists installed languages and versions.

  • When running a multi-file search, the results window appears immediately, and fills in with the search results as they are found. While the search is running, you can click the "Stop" button (the little "X") to stop the search in progress.

  • Search results now contain an additional property in the "Result Entry" scripting object type:

    match_string (text) : for Grep search results, contains the text matched by the pattern

  • There is an interface to simplify the creation and editing of Attached Menu Scripts.

  • Invisible character colors are settable from the Text Colors pref pane.

  • BBEdit will now honor the com.apple.TextEncoding extended file attribute, if present and appropriate. (The attribute will not override a BOM, explicit encoding specification, or Apple Event parameter, but is used if the file is not valid UTF-8, not pure ASCII, and no other hints are available.)

  • When saving a text document, BBEdit will now write the document's text encoding into a com.apple.TextEncoding extended file attribute, if the preferences allow it. (The factory default is to write extended attributes if the file system containing the file supports them, and not otherwise; see the Expert Preferences reference in BBEdit Help for the details.)

  • The contextual menu in editing views now contains an "Unlearn Spelling" item when appropriate, so that you can remove learned words from your user spelling dictionary as necessary.

  • There's a new built-in language, "Software Package Notes". This is a hook on which to hang internal mappings for the sorts of files that are typically included as additional documentation in Unix software package distributions. There is no syntax coloring or function navigation, but files mapped to this language are recognized as text and thus openable and searchable when text files are filtered for processing or display.

  • Language module for Make.

  • BBEdit offers a new behavior: when you ask it to open a folder, rather than creating a disk browser (which allows only one document open at a time), you can ask it to create a temporary project. (Such temporary projects are referred to as "insta-projects" at various points in the change notes.) This provides the multi-document behavior of projects, without requiring you to manage and save a project document anywhere.

    Note the limitation that the project is rooted at the folder you drop on the application; there's no "Go To..." for navigating outside of that folder, nor can you double-click on a folder to "drill down" into it. Nonetheless, for some purposes, the multi-document behavior may outweigh these considerations.

    There is no GUI for changing this behavior. If you want the old behavior back, use this command line:

    defaults write com.barebones.bbedit Misc:MakeTempProjectForFolderOpen -bool YES

  • There's a new command-line tool, bbfind. It provides a command-line interface for running multifile searches. Here is a quick summary of its usage and options:

    Usage: bbfind <options> <string> <path ...>

    -h, --help print help and exit -v, --version print detailed version information and exit -V, --short-version print abbreviated version information and exit -n, --case-sensitive search case sensitive (default: case insensitive) -g, --grep interprets "<string>" as a regular expression -w, --match-words only return matches that fall on word boundaries -R, --no-nested-folders suppress searching of nested folders -I, --search-invisible-folders search invisible folders --all-file-types search all file types (default: text files only) --name-pattern only search files whose names match the given pattern (may be used multiple times) --gui open a results window instead of returning results -c, --count only print number of matches found -Z, --null separate results lines with NUL instead of newline -S, --suppress-context only print file path and line number of match -E, --editor-commands print results in the form of "bbedit"/"edit" commands -0 interpret input separated with NUL instead of newline

    You can combine single-character switches. Thus,

    bbfind -ngw some-string ...

    is equivalent to

    bbfind -n -g -w some-string ...

    You can also use "--" to end the parsing of switches, in cases where you need to specify a search string or file path that begins with two hyphens:

    bbfind some-string -- --name-of-some-file

    It is possible to search more than one folder at a time by specifying multiple "path" arguments. Apart from the special case of using "--", the first non-hyphenated argument is interpreted as the search string (or pattern, if -g is specified) and all others are file paths. So, you could write:

    bbfind error /var/log /Library/Logs/

    and this will cause bbfind to search for the string "error" in two different folders.

    If no search paths are specified on the command line, bbfind will attempt to read them from standard input. This makes it an attractive target for the output of other tools such as find. For example:

    find . -name "*.py" -print | bbfind blah

    takes the paths printed by find and searches those files.

    The input is expected to be separated by Unix newlines (\n). In cases where standard input is generated programmatically and the paths are separated with a NUL, you can pass a -0 on the command line. Again using find as an example input source:

    find . -name "*.py" -print0 | bbfind blah -0

    A --name-pattern option is available for filtering files by name in the directory(ies) being searched. The wildcard syntax is the same as that used by the "Matches Wildcard" file filter term:

    '?' matches any single character;
    '#' matches any digit;
    '*' matches any run of characters;
    '\' is used to escape the next character (for matching literal '?', '#', or '*')

    so, bbfind foo . --name-pattern "*.py" will search for the string foo in the current working directory, in every file whose name ends in .py.

    Ordinarily, bbfind returns results in this form:

    /path/to/file:NN <line>

    where "NN" is the line number containing the match, and "<line>" is the text of the line where the match occurred. You can modify the output in a few different was: -S will suppress the line, which is a prerequisite if you want to use the output of bbfind as input to another tool (like xargs). (The output generated by -S is also useful in BBEdit shell worksheets: select the line and use "Open Selection" to open the match.)

    If you like, you can have bbfind generate output in the form of bbedit commands, each of which can be executed to open the file and select the line. Use -E. (Note that that this implies -S and will suppress the context.)

    Whether or not you use -S, the -Z switch modifies the output by using a NUL (ASCII 0) character to separate the lines of output, rather than a newline (ASCII 10). This can be useful for programmatically parsing the output, or running it through xargs -0.

    Using -c will suppress all of the output, and simply return the total number of matches that were found.

    It's also possible to use bbfind as a front end for the GUI multi-file search. Add --gui to the command line, and the search will start and present a Search Results window, rather than returning any text results to the tool. (This option causes the tool to exit as soon as the search is started.)

    Note also that using -h, -V, or -v will cause the tool to exit immediately without performing a search, even if there are valid search string and options provided.

  • Prefix/Suffix lines remembers recent choices. Prefix and Suffix keep separate histories, currently capped at 10 unique items. There is an Expert Preference to override this limit.

  • The ancillary PHP support has been extensively revised. The old PHP clipping set is gone, replaced by a set of PHP ctags, which provides a much better completion experience. (Among other things, eligible symbols are colored, and argument lists with placeholders are emitted when you do a completion.) The new PHP clipping set is minimal, and primarily contains control structures and other items which couldn't be represented in the tags file. The reduced PHP clipping set substantially reduces BBEdit's on-disk footprint and startup time.

    NOTE: We recommend that you obtain the default support folder contents from the BBEdit support page and integrate the updated components as desired.

  • Thanks to Ted Stresen-Reuter for his generous contribution.

  • The Quick Search window is gone, and has been replaced by an in-window Live Search bar. Choosing the "Live Search" menu command on the Search menu will open this bar.

    As you type in the search field, matches for the string get highlighted in the window's editing view. The search is always literal and case-insensitive. The "previous" and "next" arrows to the left of the field are useful for navigation; you can also type Return or Shift-Return in the search field to go forward or backward.

    The Emacs key bindings ctl-S and ctl-R will open the live search bar if necessary; if the search bar is already open, ctl-S will search forward, ctl-R will search backward (assuming that something is entered in the search field; and also that the Emacs keybinding support is turned on in the preferences).

  • BBEdit now offers enhanced script attachability. In addition to adding scripts to menu commands as has been possible for a long time, you can now attach scripts to certain application and document events.

    The attachment points (corresponding to the function names in your attachment scripts) are listed below. Except as noted, all of them share the following characteristics:

    • Every function takes a single argument, which is a reference to the object in question: the application for application entry points, or the document being opened/closed/saved/etc for document entry points.

    • Any attachment point whose name contains should is expected to return a Boolean result: true or false. If it returns true, the operation will continue. If it returns false or throws an error (see below) then the operation will be cancelled. So, for example, applicationShouldQuit returning true will allow the application to quit; returning false will not.

    • If an attachment script causes a scripting error and does not handle it within the script itself, BBEdit will report the error. In the case of functions which are used to allow a should action, this will prevent the action from occurring.

.
applicationDidFinishLaunching called when the application has completed startup
applicationShouldQuit called when the user has chosen "Quit" (or the application receives a quit event for some other reason
applicationDidQuit called when the application has finished shutting down and is about to exit
applicationWillSleep called when the user has chosen "Sleep BBEdit" from the application menu
applicationDidWakeFromSleep called when the application has completed restoring the sleep state saved by a previous "Sleep" command. Note: if the application restores a sleep state, it will not call applicationDidFinishLaunching. Conversely, if the application is launched and is not restoring a sleep state,it will not call applicationDidWakeFromSleep.
documentDidOpen called when a document has been opened and is ready for use. Note that BBEdit supports multiple types of documents, and so you should be prepared for the argument to be a document of any type.
documentShouldClose called when the application is preparing to close a document.
documentDidClose called when the application has closed a document.
documentShouldSave called when the application is trying to determine whether a given document should be saved.
documentWillSave called when the application is about to begin saving a document. note that this will only be called after a successful return from a documentShouldSave.
documentDidSave called after a document has been saved successfully.
documentWillUnlock called when BBEdit is going to make a document writeable (as when the pencil is clicked to unlock)
documentDidUnlock called when BBEdit has successfully made a document writeable
documentWillLock called when BBEdit is going to make a document read-only
documentDidLock called when BBEdit has successfully made a document read-only

There's a new folder in the BBEdit application support folder, "Attachment Scripts", which contains the script(s) to implement your custom event handlers. You can write one script to handle each attachment point, or you can write one script to handle the attachment points for an entire class of objects, or you can write one script to handle all of the attachment points for the entire application.

It's also possible to mix and match to specialize: for example, one script to implement a particular attachment point for documents, and one to handle the rest of them.

BBEdit handles the association of scripts to attachment points by means of the script's file name. There are three ways to specify a script's role:

  • <ObjectClass>.<entryPoint>
  • <ObjectClass>
  • <ApplicationName>

The first form is the most specific: the ObjectClass may be one of the following:

  • Document
  • Application

The entryPoint is one of the attachment points described above appropriate to the object class. So, for example, a script which implemented only the documentDidSave attachment point would have the file name Document.documentDidSave.scpt and contain a subroutine named documentDidSave, thus:

on documentDidSave

    --   do something useful and appropriate

end documentDidSave

Note that the file name suffix .scpt is not mandatory, but you should follow the current OS conventions as suggested when saving the script in the Apple script editor (or another script editor, such as the excellent Script Debugger).

The second form allows you to implement all of the attachment points for a single object class in a single script file, if desired. So, for the application (for example), create a script named Application.scpt, and it can contain subroutines for as many of the attachment points as you wish:

on applicationDidFinishLaunching

    -- do something relevant

end applicationDidFinishLaunching

on applicationDidWakeFromSleep

    -- do something useful

end applicationDidWakeFromSleep

on applicationShouldQuit

    -- hello world

    return (current date as string contains "day")

end applicationShouldQuit

To implement all of the attachment points for the Document class, you'd create a script named Document.scpt, and put subroutines in it for the document attachment points:

on documentDidSave

    ...

end documentDidSave

on documentWillClose

    ...

end documentWillClose

Finally, you can write one all-encompassing script which contains subroutines for all of the attachment points in the application. To do this, name the script BBEdit.scpt and put whatever subroutines in it you wish to implement:

on applicationShouldQuit

    -- hello world

    return (current date as string contains "day")

end applicationShouldQuit

on documentWillClose

    ...

end documentWillClose

When figuring out which script to run, BBEdit will first look for a script whose name exactly matches the attachment point, e.g. Document.documentShouldSave.scpt. If it is not found, BBEdit will then look for a script whose name matches the object class at the attachment point; e.g. Document.scpt. Finally, if neither an exact or a class match is found, BBEdit will look for an application-wide script: BBEdit.scpt.

Note that you do not have to implement attachment subroutines for all attachment points, or for all classes -- only the ones you need. If there is no attachment script or subroutine, BBEdit proceeds normally.

  • You can now put Automator workflows into ~/Library/Application Support/BBEdit/Scripts/, and they will appear on the Scripts menu (and in the Scripts palette).

  • There's a new option in the bbedit command-line tool: --project. Invoking the tool with this option will create a new synthetic project ("instaproject") containing all of the specified files. The project's name is derived from $CWD as of when the tool was invoked. Some examples:

    # create an instaproject containing /usr/local/bin and /usr/bin
    bbedit --project /usr/local/bin /usr/bin

    # create an instaproject containing Apache's httpd.conf and /etc/passwd:
    cd /etc;bbedit --project apache2/httpd.conf passwd

    In the special case of a single item being specified, the project's root is the item (if it was a directory) or the item's parent (if it was a file).

  • When "Auto-Expand Tabs" is turned on, and you are backspacing with an insertion point, BBEdit will delete a tab stop's worth of spaces if there are only spaces (and tabs) between the insertion point and the start of the line (or the first non-whitespace character on the line) on which you're editing.

  • When writing a #script# clipping expansion, you can now use POSIX-style absolute paths to refer to the script file, as in:

    #script /Users/me/example/folder/Script.scpt#

  • #bbpragma now supports an encoding attribute to specify an encoding hint to the syntax checker for document fragments. For example:

    <!-- #bbpragma doctype="-//W3C//DTD XHTML 1.0 Transitional//EN" root_element="body" encoding="utf-8" -->

  • a new field is supported in tags files: optional_args:(...). In the parentheses are three possible constructions: "-" indicates that no arguments are optional; "*" indicates that all arguments are optional; otherwise, the parentheses contain an ordered positional list of optional arguments. For example, optional_args(2, 3) indicates that the second and third arguments are optional.

    When an optional_args field is present, BBEdit will alter the construction of the argument placeholders when generating the function signature for text completion, so that it's easier to delete the optional arguments that you want to use.

  • If a file lives in a location "claimed" by multiple source control configurations (a Subversion checkout below a P4CONFIG file, for example) enable menu items for all claimed SCM styles, and let the user choose commands from the correct one.

  • Dropping a tarball on BBEdit, or double-clicking on one in a disk browser, will now browse into the tarball instead of opening it up in an editing window.

    If for some reason you liked it the old way:

    defaults write com.barebones.bbedit Misc:OpenDiskBrowserForTarballs -bool NO

  • There's a new placeholder format: <#* ... #>. This is used for optional arguments generated during completion. It can be selected in the usual fashion; and if you delete a selected optional-argument placeholder with the Backspace key, BBEdit will delete any leading whitespace, back to a preceding comma (if there is one).

  • The window scripting object class now has a property: "live search bar visible", which indicates whether the Live Search bar is currently displayed in that window.

  • BBEdit can now browse Zip archives (in the format as created by the "Compress" command in the Finder, or by using ditto -k from the command line). Drop a Zip archive on BBEdit to see it in action.

  • There's a new command on the View menu: "Reveal in Project List". When one or more projects are open, this command will locate the front project which contains the active document, and reveal the document's file in the project's file list.

  • The default behavior of the HTML updater has changed when running #! scripts. By default, STDERR is no longer inserted to the document unless the script exits with a non-zero exit code.

    To restore the previous behavior

    defaults write com.barebones.bbedit HTMLUpdater:AlwaysIncludeSTDERR -bool YES

  • Added support for enums to the Java language module. Enums now receive auto-fold points and are enumerated in the function popup.

  • BBEdit now uses the ctags files in ~/Library/Application Support/BBEdit/Completion Data/ for more than just completion: "Find Definition" (and the contextual menu) will now include definitions specified on those tags files (which is handy if you've built a tags file from a Mac OS X or iPhone SDK); and symbols defined in the central tags files will also appear in an appropriate color.

  • When saving a document with a shebang line, BBEdit will now make it executable (a+x, as modified by the umask).

  • Completion data dictionaries generated by language modules can now contain an additional key: AutoIndentCompletionText. It's optional, but if present signals the completion system that the completion text, if multi-line, should be auto-indented according to where the completion is inserted.

  • The "search here" command (third on the Search menu, after "Multi-File Search") is now enabled when a text document is active and exists on disk.

  • Edit -> Insert gets a new command: "Emacs Variable Block". This brings up a sheet for confirming the insertion of Emacs variables describing the option settings for the current document. (Using all of the options can result in a pretty verbose result; so you may find it useful to prune the resulting text as desired.) These variables are honored and have precedence over saved document state when BBEdit opens the document. (Inserting the explicit settings can be useful when sharing the document with others.)

  • BBEdit now remembers preview window positions on a per-document basis, keyed by the document's location (which also works for documents opened via the built-in FTP/SFTP interface) and screen layout. If there is no stored position, BBEdit will use the default location as saved by the "Save Default Window" command; failing that, it will arrange the window on the same display as the parent document window.

  • BBEdit can now generate completions for include file names in C/C++/ObjC/ObjC++ source files. (This applies when typing in an #include or #import directive.) The data is sourced from the active Xcode project, system headers and frameworks, and the directory containing the source file in which you're completing.

  • ObjectiveC 2.0 @property declarations now appear in the function menu.

  • Results lists get a contextual menu. Typically, "Copy" is the only item available; but if any of the selected files are in a Subversion working copy, the menu will contain some useful Subversion commands for those files.

  • The contextual menu in project lists now contains Subversion commands for appropriate items, and commands on the Subversion menu are enabled appropriately when the project list is the target of user events.

  • Disk browsers and project windows get a new menu button at the bottom of the file list. It shows the Subversion icon, and contains some Subversion commands that are usefully applied to selected items in the list.

    The visibility of this item is linked to the top-level Subversion command menu; so if you want to hide all things Subversion-related, go to the Menus preferences and turn the Subversion menu off. (Changes here will take effect the next time you make a new project window or disk browser.)

  • The contextual menu in project lists now contains Subversion commands for appropriate items, and commands on the Subversion menu are enabled appropriately when the project list is the target of user events.

  • When setting up ~/Library/Application Support/BBEdit/ for the first time, the folder skeleton contains a "Read Me.txt" file at the top level, with helpful information and pointers.

Changes

  • Revamped FTP/SFTP browser windows. The layout has been redone, the interactions have been remodeled, the directory popup is much more functional, and the file list now includes the modification date as reported by the server (and the sort order can be changed).

  • The "Save to FTP/SFTP Server" dialog has been rewritten and modernized. The changes here largely parallel the ones made for FTP browsers: freshened look and feel, sortable file list.

  • The default line break description for CR is "Classic Mac" to attempt to discourage people from choosing it inappropriately. Both the preference pane and the Save dialog now use the same wording.

  • Changed the default completion threshold for ctags from zero characters to three (so you won't see any ctags completions unless you've typed at least three characters).

  • Fixed misleading wording in the alert for running #! scripts with non-Unix line breaks.

  • New and improved software update checker, the same as the one used in Yojimbo 1.5.

  • When a browser has nothing selected, or has a deleted file selected (like in a P4 window), the combined text view is replaced with a status view, telling you so.

  • The mechanics that BBEdit uses to determine whether a file was changed on disk have been completely rewritten. Consequently, the group of "Verify open files after:" preferences (see Application prefs) has been replaced by a single setting: "Automatically refresh documents as they change on disk." If you wish, you may turn this off and reload a document manually at any time by choosing the "Reload from Disk" command on the File menu.

  • Document drawer side bias is no loner controllable from the prefs UI.

  • Expunged references to the "Open Here in Terminal" bundle override, since that feature is no longer supported.

  • Tightened up the layout of the disk browser window and dropped the focus ring around the file list.

  • The "Save As" and "Save a Copy" dialogs now run as sheets, as does the dialog for the "Save Selection" contextual menu item.

  • "Save As" for Find Differences results windows has been changed to "Export" for consistency with results browser windows.

  • The "Save As Selection" command has been consigned to the dustbin of history.

  • Support for the CodeWarrior IDE has been removed. If you are still using BBEdit as an external editor for CodeWarrior, you can run 8.7.2 alongside 9.0.

  • In a results browser, the Save command (or apple event) now works on the viewed document. The Export event or command can be used to write out a text file containing the results entries. (This was previously accomplished via the Save As command.)

  • When writing data to the pasteboard (clipboard or drag), BBEdit now also includes a UTF-8/NSStringPboardType copy of the data with LF line endings. This provides smoother interoperability with Cocoa applications which are not line ending agnostic. (Or more specifically, do not convert the pasteboard data to their native internal representation, often resulting in a mixed line ending document.)

    N.B. BBEdit has always been line ending agnostic when reading data from the pasteboard.

  • The window menu and windows palette are named differently, so multiple results browsers pointing at the same document are easier to distinguish from each other.

  • If the search terms are available at window construction time, Search Results windows include them in the base window name in preference to the instance number, so instead of getting "Search Results 42 (search term)", it's now just "Search Results (search term)".

  • The options and behavior for backing up files at save have changed, as follows:

    • "Make backup before saving" is now a global preference only, and is no longer controlled per file. The "Make Backup when Saving" and "Make Backup Now" options have been removed from the File menu.

    • The settings controlling backup location (in the Text Files prefs) have been removed. Backups are always made to a specific location, as follows:

      • If "Keep historical backups" is turned on, backups are kept in ~/Documents/BBEdit Backups/. Within that folder is one folder for each day's backups. The format of the dated folder name is static and non-localized: YYYY-MM-DD. Inside of each day's backup folder will be all of the backups made on that day, each named using the 8.7.x timestamp format.

        If you want the backups to live somewhere else, lay down a folder alias named "BBEdit Backups" in ~/Documents/ and BBEdit will follow the alias.

      • If "Keep historical backups" is turned off, BBEdit makes only a single backup, located in the same directory as the original, so "backup creep" is a thing of the past. The backup is named according to current OS conventions (which themselves follow the old Emacs convention): the backup file is named as the original file, with a tilde appended: "foo.html~" is the backup of "foo.html".

        If you want the backup to have the same file name extension as the original, turn on the "Preserve file name extension" in the Text Files prefs. This will cause BBEdit to place the tilde after the "base" name of the file: "foo~.html".

  • The machinery behind the Preferences window has been overhauled; this is not user-visible; however, the layout conventions for the prefs panels have changed, which does affect the overall look of the Preferences window. This will affect screen shots.

  • Wildcard mappings for filename extensions to source code languages now work the way they were originally intended to; a suffix mapping of "php*" will now match any file whose filename extension begins with "php" and ends with anything, rather than attempting to apply the wildcard against the entire file name.

  • The dialog used for adding and editing filename extension-to-language mappings (in the Languages prefs) has been modernized.

  • Modernized the options dialog for multi-file Replace All.

  • The "Add..." button for adding Grep patterns in the Text Search preferences has been consigned to the dustbin of history. The "Change" button has been renamed to "Rename" to reflect that it now simply renames the selected pattern.

  • The Application menu and Help menu have been reorganized to follow the conventions established by Apple's current iLife applications.

  • "Check for Updates" is now on the application menu.

  • BBEdit no longer loads CFM (Code Fragment Manager, the Mac OS 9 executable format) language modules. If you have such a language module installed, a message will be logged to the system console.

  • After careful consideration, the "Remember Find dialog's "Start at Top" setting" checkbox has been shot, and tossed in a ditch. (The setting is still stored in preferences, and honored if present.)

  • Significant look-and-feel work on the disk browser: the top bar is gone; the action gear in the lower-left corner has some useful commands on it (a strict superset of what's on the contextual menu), and file filtering control is on the filter popup next to it.

  • Modernized the Save Workspace and Delete Workspace dialogs. (And the Delete Workspace dialog lets you delete more than one workspace.)

  • The file filtering options in the Open... dialog have been simplified to present the following items:

    • All BBEdit Documents

      Anything that BBEdit can usefully open into a document window will be enabled for selection. (This is equivalent to the "All Readable Files" setting in previous versions.)

    • Text Files Only

      Only files that are quickly recognizable as text files (without inspecting their contents) will be enabled for selection. (This is equivalent to the "Text Files" setting in previous versions.)

    • Everything

      Enables all files for selection, regardless of type. (This is equivalent to the "All Files" setting in previous versions.)

  • The file filtering popup in disk browser windows has been reworked to be close to the browser's primary purpose (browsing text files on disk). It now consists of just two items (in addition to user-defined file filters):

    • Text Files Only
    • Invisible Items

    "Text Files Only" will limit the display to items which pass the text-file test (without examining their content). "Invisible Items", if turned off, will limit the display to items which would be visible in the Finder (and also filters out CVS, Subversion, and package directories).

  • The factory default keystroke for "Open Counterpart" has been changed to Command+Option Up-Arrow.

  • The factory default keyboard shortcuts for "Go to Next/Previous Error" have been changed to Command+Control Up/Down-Arrow.

  • The gesture for switching focus from a text view (which normally accepts Tab as an input character) has been changed from Option-Tab to Control-Tab.

  • Moved File Filters to the main find dialog, as it was in BBEdit 7.x.

  • Collapse All Folds now behaves more usefully in documents where there is a single top-level fold (such as HTML or XML documents, as well as in a few other situations).

  • Updated Application Support Folder/Readme.txt with information on backups, and syncing.

  • Adjusted the layout of the Find dialog, eliminating the Saved Sources popup menu (since they are expressed in the sources list directly), and adding a Save Set button instead.

  • Saving Search Sets is done in a sheet, instead of application modal dialog.

  • The separate history popups for search and replace strings have been condensed into one.

  • The term lists for file filters have been buffed a bit.

  • The popup menu used for file filtering in the modal Find dialog, Find Differences, the Multi-file Find window, and Text Factory options has been rearranged. In those locations, the separate "Use File Filter:" check box has been removed; filtering is completely controlled from the menu. (Choose "None" to turn off filtering.)

  • The search history item in the modal Find dialog has sharp corners, just like the one in the modeless dialogs.

  • The command to save Grep patterns from the Find dialog (modal or modeless) is now called "Save" and it's at the end of the pattern popup in the respective dialog.

  • The window stacking preference has been retired.

  • New windows always stack down and right 20px. If you have saved a default window size, and the window is screen height, new windows will just stack to the right, and preserve their saved height.

  • "Find Selected Text (backwards)" is now "Find Previous Selected Text". (There's really no good wording for it that doesn't make the menu wide. Really, it's "Find the previous occurrence of the selected text".)

  • The MDI preference no longer has an internal vs. external distinction.

  • The list of actions in a Text Factory is now sorted alphabetically.

  • The "+" and "-" buttons in Text Factory windows have been adjusted to account for metrics changes in the system.

  • "Replace All" in the old modal Find dialog now replaces every occurrence in the document (or in the selected range, if there is one and "Search Selection Only" is checked), rather than from the insertion point to the end of the document. This makes its behavior consistent with the modeless Find window and the "Replace All" menu command.

  • Updated the "Clear Markers" dialog.

  • "Preview in BBEdit" now factory defaults to Cmd-Control-P (was previously assigned to "Preview in <default web browser>".

  • BBEdit projects (formerly File Groups) are now packages (directories that appear to the Finder and other interested parties as a single file). Inside the package there is one file containing the project data, and another containing the project settings (expanded items, file filter settings, etc). The settings file is unique for each user of the project.

    This organization allows a project to be checked in to source control, and each user can have their own settings and remembered state without affecting the project data itself, which used to require unnecessary commits.

    Project documents in the new format have the filename extension "bbprojectd". File group and project documents created by previous versions of BBEdit will be upgraded (with a backup first), as before.

  • The internal mechanics and UI presentation for recent items have been overhauled. The "Recent Files & Favorites" and "Recent Folders & Favorites" folders in ~/Library/Preferences/com.barebones.bbedit.PreferenceData/ are no longer used and may be deleted.

    The "Open Recent" menu now shows all recently opened documents, grouped by document type, and sorted by name within each group. Folders are now included, so you can open a disk browser on a recently used folder by choosing it from this menu (something which was not possible before). Text and project documents are grouped before other types. The first grouping in the menu consists of the six most recently used items (of all types), sorted in descending order (most recently used first), for quick access.

    The "Clear Menu" item at the end of the menu has been changed to "Clear History", to more accurately reflect its function: if you choose it, all recent items will be cleared. Note that since recent folders are available as sources for multi-file search/replace and Text Factory operation, clearing the history will remove the folders from those operations as well.

    The application preference controlling how many recent items BBEdit will remember applies to each type of item. So, if it's set to 15, BBEdit will remember 15 text documents, 15 folders, 15 projects, 15 images, 15 movies, and so on. If you want finer control, you can construct an expert pref using the name of the document type as it appears in the menu (and if that name contains spaces, you'll need to quote it). So, for example, if you only wanted to remember the five most recent projects:

    # remember only the five most recent projects defaults write com.barebones.bbedit NSRecentDocumentsLimit:Projects -int 5

    Or the ten most recent folders:

    # remember only the ten most recent folders defaults write com.barebones.bbedit NSRecentDocumentsLimit:Folders -int 10

    Or only the most recent shell worksheet:

    # remember only the most recent worksheet defaults write com.barebones.bbedit "NSRecentDocumentsLimit:Shell Worksheets" -int 1

    If you don't want to remember any recent documents of a particular type (they won't appear in the menu, either), you can set its limit to zero:

    # don't remember any images or movies defaults write com.barebones.bbedit NSRecentDocumentsLimit:Images -int 0 defaults write com.barebones.bbedit NSRecentDocumentsLimit:Movies -int 0

    Note that when setting the recent items limit, you must set it as an integer, using "-int <some number>".

  • The popup menus in the Find Differences dialog have been retooled, and now present currently open items and recent items on the same menu.

  • The status bar in editing views is now below the horizontal scrollbar.

  • When completing or inserting a clipping, the clipping file is always read from disk - if you have the clipping's file open and have unsaved changes, the changes will not be inserted.

  • The following text encodings are no longer presented as options in the "If file's encoding can't be guessed, use" popup menu in the Text Encodings preferences, because our best guess has already eliminated them as possibilities: UTF-8, UTF-8 (no BOM), UTF-16-BE, and UTF-16-LE.

  • Made some changes so that documents that were opened directly (versus auto-reopen at startup) are added to the Open Recent list when they are saved or closed.

  • The default value for "chdir to Script's folder" when running a #! script is now True. The state can be changed from the "Run..." or "Run File..." dialogs and the change will be persistent.

  • Changed the way BBEdit searches for unix executables. This should reduce/eliminate the instances of an unexpected version of a binary being used when someone has installed a custom version of svn/python/etc.

    Today you can override this for svn, p4 and cvs with the expert preference. This change should make use of the expert pref unnecessary in most cases.

  • When "Selected Text Only" is turned on, only "Find All" and "Replace All" are enabled, to reinforce the reminder that you can only batch find when searching in the selection.

  • Contextual menu items for searching in text views are now turned on by default, in order to expose the new commands. If you wish, you may turn these off in Preferences -> Menus.

  • The "Search" commands on the contextual menu now use the same nomenclature as their counterparts in the menu bar.

  • For the convenience of user scripts (run from the shebang menu) BBEdit sets some runtime environment variables to reflect the front-document state as it is when the script is about to be run:

    BB_DOC_LANGUAGE Name of the document's current language (not set if language is "none") BB_DOC_MODE Emacs mode of the document's current language BB_DOC_NAME name of the document BB_DOC_PATH path of the document (not set if doc is unsaved) BB_DOC_SELEND (zero-based) end of the selection range (not set if not text document) BB_DOC_SELEND_COLUMN (one-based) de-tabbed column number of BB_DOC_SELEND BB_DOC_SELEND_LINE (one-based) line number of BB_DOC_SELEND BB_DOC_SELSTART (zero-based) start of the selection range (not set if not text document) BB_DOC_SELSTART_COLUMN (one-based) de-tabbed column number of BB_DOC_SELSTART BB_DOC_SELSTART_LINE (one-based) line number of BB_DOC_SELSTART

    NB: selection ranges and other offsets are expressed in characters, not bytes.

  • The popup menus in the Find Differences dialog (for quick access to open and recent documents/folders) have been retooled. This also fixes a reported cosmetic glitch.

  • The preferences key to control whether BBEdit ignores RCS keyword variances when comparing is now "Diff:IgnoreRCSKeywords", as in:

    # pay attention to changes in RCS keywords when comparing files defaults write com.barebones.bbedit Diff:IgnoreRCSKeywords -bool NO

  • The "Smart Quotes" option has been renamed to "Use Typographer’s Quotes" where it appears in the preferences (Editor Defaults, Languages -> options), and editing controls (options menu in the toolbar, "Text Options" command).

  • When saving a text document, BBEdit will look for a mismatch between the text encoding setting in the status bar, and any explicit encoding specification in the document's contents (HTML/XML meta tag or PI, or an Emacs variable). If a mismatch is found, an alert is presented so that you can avoid saving the document in this condition.

    The warning includes an option to compare the open document against what's on disk, in cases where you are saving a text document.

  • The "Color Grep patterns in Find dialog" setting has been removed from the Text Search preferences. The Expert Prefs help has been updated with the secret formula for changing this setting.

  • "MARK" callout for comments now generates the same function entry type as a "#pragma mark" or "bbmark" directive elsewhere.

  • Closing a multi-file Find Differences result window will now prompt you to confirm, if you have applied any differences.

  • The internal format of saved document state has been reworked, as well as the behaviors for saving and loading it. The most important visible changes are as follows:

    • When saving state, BBEdit captures only those settings which are fundamental to the document (window position, selection range, folds, splitter setting), or settings which vary from the global preferences. The latter ensures that changes to the global preferences are never inappropriately overridden by document state.

      So, for example, if the default document font is Consolas when you save the document, and the document uses that font, but you change the global preference to Menlo before the next time you open that same document, the document's font will be set to Menlo. (Note that this behavior applies to any document setting which takes its default from the prefs; the font is used only to illustrate.)

      This change should resolve lots of confusion surrounding the question of "I changed my prefs, how come my document settings don't reflect that?"

    The internal data format of the state has changed to accommodate this new behavior. Documents with existing saved state will exhibit the old behavior when they are opened; this is not a bug. BBEdit will write out the new state format the next time you save the document.

    Note that the new format is not backward-compatible; so if you open the document with an older version of BBEdit, the new format state will be ignored.

    Also:

    • If you are using the expert preference to save state in the document's resource fork (rather than in a central location), please note that the new format state data is not actually saved in a resource anymore - it is now written into an extended attribute, which you can verify from the command line using xattr -l /path/to/some/file.

    And finally:

    • A new "Normalize Options" command is available on the Edit menu. This command will reset the front document's display and editing options to the current defaults established by your preferences (including any language-specific overrides), and clear the document's saved state. This can be useful in situations where previously saved state is restored and contains undesired variances from your preferences.
  • The following UI changes have been made to text encoding selection:

    • "Unicode (UTF-8, no BOM)" has been renamed to "Unicode (UTF-8)".

    • "Unicode (UTF-8)" has been renamed to "Unicode (UTF-8, with BOM)".

    • The text encodings menu (as used in the status bar, preferences, and other locations) has been rearranged so that the most commonly used Unicode variants (UTF-8 and UTF-16-BE+BOM) are at the top of the menu, with a separator between them and the rest.

  • A fresh install of BBEdit will no longer populate the Application Support/BBEdit folder; instead it will simply create empty placeholder folders so that you know where stuff goes.

  • The "Open Hidden" command has been removed from the File menu, since the "Show Hidden Items" check box is available on all supported systems now (and it works).

  • When saving a document to a mounted file system (not FTP/SFTP), the application now does a "safe save" so that the existing data on disk is not replaced until the new document data has successfully been written.

  • "Replace All" text factory operations no longer generate a results entry so a results window should no longer appear at the end of a factory run containing Replace All actions, unless errors occurred.

  • Support for "source format profiles" has been dropped. (This affects the "HTML Markup" prefs pane, and the Markup -> Utilities -> Format... dialog, as well as the scripting interface.)

  • The on-disk storage format for file filters has been changed to something more future-friendly; the saved filters are now located in "File Filters.filefilters" in ~/Library/Preferences/com.barebones.bbedit.PreferenceData/. (Note that although the file is readily human-readable, the internal structure is undocumented and subject to change; modifications made without using the application's UI are not supported...)

    Existing filters will be converted (nondestructively) to the new format. Note that the new format cannot be used with older versions of the application.

  • The application has undergone extensive internal rework, in order to improve performance, remove some longstanding limitations, and pave the way for new features. By and large, the internal changes should be invisible, but the following top-level changes deserve mention:

    • Support for BBXT plug-ins has been removed. This means that the "Plug-Ins" window is gone from the Palettes menu, the plug-in summaries are gone from the About box, and the Tools menu is gone (if you didn't see it before, you won't notice any difference). If you drop a BBXT plug-in on the application, you'll get an alert to the effect that plug-ins aren't supported.

    • Automatic import of pre-8.0 format Grep pattern data is no longer supported. If you have such a file, please write to support for assistance.

    • It is now possible to open files significantly larger than before; the ceiling isn't unlimited, but it is no longer limited by the previously extant constraints in the OS.

    • The following large-scale text transformations are significantly faster and/or require less transient memory:

      • Multi-file search (and replace)
      • single-file Find All
      • Process Lines Containing
      • Sort Lines
      • Process Duplicate lines
      • Prefix/Suffix Lines
  • The options for the markup formatter (Markup -> Utilities -> Format) have been renamed: "Gentle Hierarchical" is now "Pretty Print", and "Hierarchical" is now "Strict Hierarchical". This is closer to the actual intended use of each. In addition, the ordering of the options has been changed, so that "Pretty Print" is at the top of the list. (By default, it's a better choice for pretty-printing code than Strict Hierarchical.)

  • For text documents whose size exceeds a certain threshold (expressed in bytes, factory default 1MB), BBEdit will ignore the Soft Wrap Text preference and leave wrapping off in order to improve the performance of opening very large files. The threshold may be adjusted if desired:

    defaults write com.barebones.bbedit Editor:SoftWrapLengthThreshold -int 1048576

    If you set the limit to zero, BBEdit will always honor the Soft Wrap Text preference, even in situations where soft-wrapping a large file may cause it to take a very long time to open.

  • Since "Find All Misspelled Words" is pretty much pointless on files over a certain size, the maximum amount of text checked by this command is now limited to 1M (1024 squared) characters. This may be adjusted with an expert preference:

    defaults write com.barebones.bbedit Editor:SpellCheckLengthLimit -int NN

    where "NN" is some decimal value. Use -int 0 to suppress the limit check altogether.

  • The "When generating markup in unspecified documents" preference has been removed from the "HTML Markup" preferences. It was confusing, and a consistent set of rules is now in place: If the document does not have an explicit DOCTYPE declaration, BBEdit will treat it as XML when appropriate if its content looks like XML (or XHTML), and like HTML otherwise. If it can't determine, BBEdit will use the document's language setting to decide.

  • The PageMill, GoLive, and Claris HomePage code cleaners have been removed from the markup tools and scripting interface.

  • The "Misc" menu on the Markup menu, and the commands on it, have outlived their usefulness and been removed.

  • The modal dialogs for Document Type and Character Set markup generation are gone; instead, simply choose the desired doctype or character set from the appropriate submenu on the Markup menu.

  • The "Don't Process" (or equivalent) buttons have been removed from the following commands' dialog boxes:

    • Add/Remove Line Numbers
    • Change Case
    • Find and Mark All
    • Hard Wrap
    • Hex Dump
    • Prefix/Suffix Lines
    • Process Duplicate Lines
    • Process Lines Containing
    • Rewrap Quoted Text
    • Sort Lines
    • Zap Gremlins
  • Markup -> Inline -> Convert to Client Side Map has been consigned to the dustbin of history (like the NCSA image map format was, long ago).

  • The "Pretty print" option for Markup -> Utilities -> Format is now implemented internally using a Dreamweaver-style source format profile. This affords slightly prettier output than was possible before. Advanced users can override the factory format profile by placing an appropriately constructed file at ~/Library/Application Support/BBEdit/SourceFormat.profile.

  • The markup tools with file panels (Anchor, Image, and many many others) now run the file panels window-modal (as sheets), rather than application-modal.

  • The internal representation of the tables used by the HTML/XHTML syntax checker has been radically reworked. In general this should not be user-visible, but it paves the way for future enhancements.

  • When you are backspacing with an insertion point, BBEdit will delete a tab stop's worth of spaces if there are only spaces (and tabs) between the insertion point and the start of the line on which you're editing. This may be disabled by an expert preference if desired:

    defaults write com.barebones.bbedit Editor:DeleteIndentationWhitespaceToTabStop -bool NO

fin