2021-10-12 (v2.0.23)
- Miscellaneous improvements, see changes since v2.0.22 on GitHub
atomicSave
in ~/.tm_properties
, see further down in these release notes for potential values.FLT_MAX
).The Clipboard History dialogs (Edit → Paste → Show History and Edit → Find → Show Find History) now allow you to flag entries. This can be done either by clicking the flag button or using ⌘F2 (the shortcut normally used to toggle bookmarks).
Flagged entries will not be removed from history neither automatically nor when using “Clear History”. All flagged entries can be seen by selecting the Flagged source (note: dialogs with a “source selector” support normal tab navigation keys such as ⌘{ / ⌘} for previous/next and ⌘1-⌘n to select the nth source).
It is now possible to select multiple entires in the clipboard history dialogs. If you paste with multiple entries selected then it will insert the items with newlines in between. If you search, it will construct a regular expression matching any of the selected items.
Note that the latter can also be achieved by using ⌘E (Edit → Find → Use Selection for Find) when there are multiple selections. It may sound like a novelty, but I use this feature close to daily.
Multiple selections are now stored on the clipboard as multiple strings, this may improve compatibility with other applications that also support multiple selections. Previously they were stored as a single newline-delimited string. This also means that copy/paste of multiple selections work even when the selections include newlines (this would previously lead to newlines being lost due to how we stored a single combined string on the clipboard).
Clipboard history is now stored in a sqlite database (~/Library/Application Support/TextMate/PasteboardHistory.db
) instead of using CoreData. This means old history has been lost (no good way to migrate this data).
If you have disabled persistent history (via the disablePersistentClipboardHistory
defaults key) then the sqlite database is memory backed, and history (including flagged items) will be lost if you quit TextMate.
TextMate should now always pick up clipboard changes: Previously it could miss updates that happened while TextMate was active, as the system occasionally will forget to bump the change count of the clipboard in this situation, so we no longer rely on the clipboard’s change count.
"$DIALOG" nib --dispose «token»
would not close the nib’s window.After far too long, there is no longer any qualifier suffix in the version string, so it is now finally just “TextMate 2.0”.
I am grateful to everybody who has submitted a pull request, but the following people deserve a special mention:
Not everything on the wishlist made it into 2.0, but TextMate remains a work in progress, so don’t despair :)
— Allan Odgaard
001_file.txt
will become 002_file.txt
when duplicated in the file browser, instead of 001_file copy.txt
.Add debug output when TextMate is activated via mate
.
The debug output from this build may help shed some light on a reported issue where there is a noticeable delay from calling mate
in a terminal and until TextMate is brought to front.
If you have this issue first run mate --version
to ensure that TextMate auto-updated it to 2.13.1-beta
(if not, go to Preferences → Terminal and uninstall/install it).
When the problem occurs, immediately run date
in your terminal to get a timestamp to correlate with the debug log.
Then run this command to obtain the log:
log show --predicate 'subsystem = "com.macromates.TextMate" && category = "BringToFront"'
See man log
for options such as --start date/time
(to limit the query to e.g. the last 10 minutes).
Send the log (with as many details as possible) to support, or preferably (if you are on the mailing list): Follow up in the current thread about the issue.
Relevant information is whether or not you are using spaces and/or multiple screens.
TextMate has been using exchangedata
for atomic saving. This API allows writing an updated file to a new location and then swap the data part atomically with the old file’s. This ensures that the saved file is never in a partially written state, it preserves all file metadata (of which there is a lot), it preserves the file’s inode, so any potential hardlinks are not broken, etc.
Unfortunately APFS, the new default file system for macOS, does not support exchangedata
.
TextMate falls back on rename
when exchangedata
is unavailable.
This require that all metadata of the old file be copied to the new one, but there is no way to preserve the inode, so hardlinks will break, furthermore, as this is effectively a completely new file, the date of its parent diretory will be updated. Some software will monitor directories for new files and do a rescan each time the directory is updated, which previously would only be when files were created or deleted, but now each save may also trigger such rescan.
For this reason, there is a new setting to control when and how TextMate should use atomic saving. It can be controlled by setting atomicSave
in .tm_properties
to one of the following values:
always
: This is the default, it uses NSFileManager
API (so no inode preservation even on HFS+).externalVolumes
: Disable atomic saving only for internal disks.remoteVolumes
: Use atomic saving only for remote drives (e.g. network mounts).never
: Never use atomic saving.legacy
: This will use exchangedata
when available and fallback on rename
. This option will be removed in the future.$1-n
available in the replacement (format) string. If this format string does further replacements with optional captures (e.g. ${1/(foo)?|(bar)?/…/g}
) then $1-n
would be inherited from the parent search for the non-matching optional captures.defaults write com.macromates.TextMate statusBarFontSize 13
.defaults write com.macromates.TextMate changeThemeBasedOnAppearance -bool YES
then TextMate will switch theme based on appearance (light/dark). The themes used can be controlled using the darkModeThemeUUID
and universalThemeUUID
defaults keys. Ronald WamplerexcludeSCMDeleted = true
in a .tm_properties
file to hide the “ghost” items that appear after deleting a file on disk which is still tracked by your version control system. Ian Gregorydefaults write com.macromates.TextMate allowExpandingPackages -bool YES
. If you do work with a lot of file packages be aware that it is also possible to hold option (⌥) when you either double-click the item’s label or single click the icon, to descend into the file package.defaults write com.macromates.TextMate defaultFindInFolderGlobs '( "{*,.tm_properties}", "*" )'
. Be aware that unique history is kept per folder, to clear your existing history run: defaults delete com.macromates.TextMate 'Find in Folder Globs'
.foo‸(bar);
would move the insertion point past the braces, i.e.: foo(bar)‸;
. This is no longer the case, and the keys will always move to the opening/closing character of the current pair that the insertion point is inside.mate
could cause TextMate to crash.public.data
(files without extension). The idea was to support previewing files like README
but a side-effect was that TextMate’s QuickLook plug-in became responsible for generating thumbnails for all binary files without a dedicated QuickLook plug-in (e.g. disk images or zip archives). There appears to be no way to dynamically opt out of thumbnail generation, therefor we’ve had to remove support for previewing files without extension.tabTitle
in .tm_properties
to change the title of tabs (defaults to $TM_DISPLAYNAME
) Jake KirshnerdisableJavaScriptAPI
to true
in their tmCommand
property list to disable the JavaScript API normally exposed in the HTML output window. This is set for HTML → Show Preview.dirname
nor basename
.TextMate’s bundle identifier has been changed to com.macromates.TextMate
(previously it had a preview
suffix). This is the same bundle identifier as TextMate 1.x so if you still have TextMate 1.x installed then we recommend to simply delete it.
The changed bundle identifier may cause a compatibility issue with third party software, particularly software that offers an “Open in TextMate 2”, there is unfortunately no nice solution to this problem other than request that the software is updated to use the new (old) bundle identifier.
The mate
command line tool is among such software, but it should automatically update to version 2.11, if not, go to Preferences → Terminal and select to Uninstall and then Install mate
(the automatic updating of mate
only works if TextMate can figure out where it was previously installed).
volumeSettings
user defaults key has been replaced with disableExtendedAttributes
that can be set in ~/.tm_properties
. If you had disabled extended attributes for specific volumes, your settings should automatically appear in ~/Library/Application Support/TextMate/Global.tmProperties
.Commands can be set to run again for certain events, for example both HTML → Show Preview and Markdown → Show Preview now update the preview on document changes. To enable this for a command you currently need to edit the property list for the tmCommand
file and insert something like this:
<key>autoRefresh</key>
<array>
<string>DocumentChanged</string> <!-- Run whenever document is changed -->
<string>DocumentSaved</string> <!-- Run if any document is saved -->
<string>DocumentClosed</string> <!-- Run when the document is closed -->
</array>
When TextMate runs your command as a result of any of the above actions then the TM_REFRESH
environment variable will be set to the event that triggered the execution.
If the command has HTML output then the HTML output view will be tied to the command/document, so closing the HTML output will stop running the command, and closing the document will cause the HTML output to also close (unless the command is only running on DocumentSaved
, in this case, the HTML output will close when the window is closed, as the DocumentSaved
event monitors saving of any document).
If the command does not have HTML output and its name matches ^(\w+) / (\w+) (.*)
then TextMate will show it as $1 $3
by default and $2 $3
when the command has been run, furthermore, if the user selects a command that has already been run, TextMate will stop running this command.
For example we could name our command “Enable / Disable Live Errors” and make it show a tool tip or gutter icon on each document change. The user will see it as “Enable Live Errors” unless it is already running, in which case it will be “Disable Live Errors”.
Format strings now support ${«var»:/titlecase}
as alias for ${«var»:/capitalize}
.
The find and replace text fields in the search dialog now have syntax highlight. By default they are using the Mac Classic theme but this can be changed using the UIThemeUUID
defaults key. The grammars used for the fields are the Regular Expressions (Oniguruma) and Format String grammars from the TextMate bundle.
CoreText CTLine objects are now limited to about 2048 bytes of text which improve performance significantly for documents with extremely long lines but it may cause minor unicode incorrectness, mainly right-to-left text rendering would be affected, though officially right-to-left is still not fully supported by TextMate.
callback.document.did-change-scm-status
which is used by the SCM Gutter command to trigger after a commit/revert.The callback.mouse-click
“semantic class” has been changed to callback.single-click
and there is now also callback.double-click
and callback.triple-click
.
Add callback.document.will/did-reload
which is triggered when the document is reloaded due to external changes. This is relevant for commands that update the gutter based on document content.
Add Copy Replacements to the Find dialog’s action menu. After a regular expression search this can be used to copy all matches, but transformed by the replacement (format) string. For example search for obj->(\w+)\(
and put $1
in the Replace field before selecting Copy Replacements and you’ll get a list of just the member function name itself copied to the clipboard.
When duplicating files in the file browser, we now open the new file if the duplicated file was the selected tab.
Introduce exit_insert_snippet_no_indent
to change a command’s output to a snippet but without adding indent.
It is now possible to use protocol-relative URLs (like //apple.com
) in HTML output. By default we redirect these to https
(even though they are technically loaded via the file:
protocol). The default protocol can be changed via the defaultURLProtocol
defaults key.
When setting fontStyle
in a theme it is now possible to use plain
with the other styles to reset all but the listed styles. E.g. plain bold
to disable potential italic and underline.
A theme can now set strikethrough
in fontStyle
to get strikethrough text.
The fontName
and fontSize
settings in .tm_properties
can now be set in a file type section to use different fonts for different file types or locations.
The search results font can be changed using the searchResultsFontName
and searchResultsFontSize
keys, e.g.:
defaults write com.macromates.TextMate.preview searchResultsFontName Menlo
defaults write com.macromates.TextMate.preview searchResultsFontSize -float 12
I normally do not mention fixes in the release notes but since this is a regular release primarily meant to address some reported issues, I am making an exemption.
Package.swift
file now get the attr.project.swift
scope. Ronald Wamplermate
would cause an issue with the tab bar..tm_properties
and wasn’t using the canonical name (e.g. spaces were inserted), TextMate would ignore it.Inserting type identifiable information on first line of a document will now change the document’s type to match. For example in a new plain text document you can use py⇥, rb⇥, pl⇥, php⇥ or similar (at the top) to insert a “shebang” line, and now TextMate will update the document’s type to reflect it.
Copying multiple selections to the find clipboard (⌘E) will construct a regular expression that matches any of the items copied. For example if you select both “foo” and “bar” then using ⌘E will put foo|bar
on the find clipboard.
Bundle items can now use callback.document.did-open
as semantic class to run when a document is loaded (e.g. to set initial gutter marks).
Theme can now be changed per document type or folder by setting theme
to the desired theme’s UUID in .tm_properties
in the appropriate section, e.g. [ *.md ]
or [ build/** ]
.
You can change the font used for line numbers by setting lineNumberFontName
via the defaults
command. Mike Meyer
Only bundle items with ⌘ in their key equivalent will be executed when the window’s text view is not active.
When opening a file with unknown type we no longer present a sheet forcing you to select what type to use. Instead, if the type of the document can be handled by a remote bundle, we suggest installing this bundle using a non-modal dialog above your document. Here you can hold down option (⌥) to change the “Not Now” button to “Never”.
The “Add byte order mark” checkbox has been removed from the save panel and so has the useBOM
setting. Instead byte order mark (BOM) is now part of the encoding name, so via the save panel you need to select “Unicode — UTF-8 (BOM)” to include a BOM or set encoding = "UTF-8//BOM"
in .tm_properties
. For UTF-16/32 you also need to append //BOM
to the encoding name (if you set this via .tm_properties
).
Monochrome gutter images should be suffixed with “Template” to be drawn as using the color of the current theme. Without this prefix, they are drawn as regular images.
mate
: If the «mark» argument given to --clear-mark
has a trailing slash then all marks with this prefix will be removed.
Normally paragraph selection, as implicitly used by actions like Reformat Paragraph, will select lines up/down until there is an empty line. You can now indicate that a line should be a paragraph break by setting the excludeFromParagraphSelection
scoped setting to true
. The Source bundle sets it to true
for the comment.line
scope so that one can run “paragraph actions” on text with comments above/below and no separating empty line. Adam Strzelecki
Folding indented blocks no longer include trailing empty lines.
When we lookup settings for untitled documents we compare the file pattern of targeted settings to the project (or target) folder including a trailing slash, that way, a file created in folder
will be targeted by a folder/**
file pattern.
The precedence of targeted settings (.tm_properties
) has been changed, probably easiest to explain with an example, as there are 3 different “types” of ways to target a document:
# .tm_properties
setting = «value» # 1. Untargeted
[ text ]
setting = «value» # 2a. Scope selector match
[ text.plain ] # 2b. More specific scope selector match
setting = «value»
[ *.txt ]
setting = «value» # 3. File type match
After the change, settings in the most local .tm_properties
file will always take precedence over anything in a parent folder. So if you put: tabSize = 4
in /path/to/project
then all your project files will use a tab size of four (regardless of their type and more global settings). Within a .tm_properties
file the settings are ranked in the order shown in the example above, i.e. a file type specific match will win over a scope selector match, and if there are multiple scope selectors, the one which is most specific will win, finally the untargeted settings will apply.
It is worth mentioning though that all settings are actually evaluated, this is mainly useful for variables, for example we can do:
# .tm_properties
Foo = "This is $Foo"
[ text ]
Foo = "a text file"
[ source ]
Foo = "source code"
If you press ⌃R on a line containing echo $foo
it should show either “This is a text file” or “This is source code”.
Hint: To see the value of all settings for your current document you can either press ⌃R on a line containing "$TM_QUERY"
or you can use Bundles → Select Bundle Item… (⌃⌘T) and switch to Settings (⌘}). The latter will show how the settings are ordered.
Improve folder search performance for large documents with few newlines and lots of matches.
You can change the min/max width of tab items by using the tabItemMinWidth
and tabItemMaxWidth
user defaults keys. Default minimum width is 120 and maximum width is 250.
How to truncate the file names can also be set with tabItemLineBreakStyle
which is an integer from NSParagraphStyle.h which currently has the following options (default is NSLineBreakByTruncatingMiddle
):
NSLineBreakByWordWrapping = 0 // Wrap at word boundaries
NSLineBreakByCharWrapping = 1 // Wrap at character boundaries
NSLineBreakByClipping = 2 // Simply clip
NSLineBreakByTruncatingHead = 3 // Truncate at head of line: "...wxyz"
NSLineBreakByTruncatingTail = 4 // Truncate at tail of line: "abcd..."
NSLineBreakByTruncatingMiddle = 5 // Truncate middle of line: "ab...yz"
The release version of the Emmet TextMate plug-in crashes on launch and has done so for years, so it is now blacklisted by default. There is a new version linked to from this GitHub issue which does work. If you are using that version, you can clear TextMate’s blacklist by setting it to an empty array done by running this in a terminal:
defaults write com.macromates.TextMate.preview disabledPlugIns -array
If git
or svn
is found in /usr/bin
then we check if Xcode is installed (by calling /usr/bin/xcode-select -p
) and if not, we ignore the executable. This is because it is a shim that prompts the user to install Xcode, which has lead to some user confusion. Note though that we do not call git
or svn
unless we actually find a .git
or .svn
folder in your project.
mate --project $(uuidgen) file.txt
. Now only a zero-UUID will trigger this behavior, e.g.: mate --project $(uuidgen|tr -C $'\n-' 0) file.txt
.theme
. The managed themes all indicate light and dark in their semantic class.attr.project.cargo
).lineNumberScaleFactor
user defaults key. It defaults to 0.8. If you want line numbers to be same size as main text, run the following in a terminal: defaults write com.macromates.TextMate.preview lineNumberScaleFactor -float 1
.findWithOptions:
command and there are no find or replace string (among its arguments), TextMate will now use values from the find/replace clipboards (i.e. current string). This is useful if your macro copies content to the find or replace clipboard.seq 100
(assuming there are less than 100 carets/selections). Feature prompted by this mailing list post.YYYY-MM-DD
), and if so, update that to today’s date instead of adding “copy” to the name.defaults write com.macromates.TextMate.preview showFavoritesInsteadOfUntitled -bool YES
Anton~/Library/KeyBindings/DefaultKeyBinding.dict
).defaults write com.macromates.TextMate.preview disableTabAutoClose -bool YES
."$TM_MATE" --set-mark «mark»:«value»
. The value is shown if you click the gutter image. You can also use --clear-mark
together with --set-mark
. This avoids the potential flash that would show if having to call mate
twice to update marks.note
.mate
using the new --set-mark
and --clear-mark
options. The name of the mark should be one of the predefined images which currently are: bookmark
, error
, warning
, and search
. The first one is what is used for bookmarks (and if using it, you are changing the document’s bookmarks). Alternatively one can specify a full path, which should point to the image used for the mark. Ideally this should be in PDF format since the size of the gutter images is not fixed. For an example see the Git Diff Gutter bundle which adds gutter marks for added/modified lines (on save). This bundle can also be installed from Bundles → Preferences. Another example is the TextMate::Executor
support library which now add warning and error badges, see this commit.scmStatus
are now: enable
, enableIfSystemDisk
, enableIfLocalDisk
(default), and disable
. Ryan Gouldenmate
via the MATEFLAGS
environment variable. I didn’t bump the version of mate
so you need to manually go to Preferences → Terminal and click uninstall/install to update..tm_properties
are now shown in the bundle item chooser (under settings). Eclipsed settings/variables are shown with an overstrike, although in practice the effective value may be derived from multiple eclipsed ones, e.g. in the case of updating PATH
to $HOME/bin:$PATH
. Long-term the expanded and non-expanded values should also be shown in this window.${«var»:/asciify}
format string/snippet transformation now does a better job at stripping diacritics and combining marks..tm_properties
or from the settings window. The Other source is currently language grammars and themes but might become Styles with a more fine-grained view of what rules/themes are responsible for the current context.mate
are now added to the recent menu by default unless the file is a dot-file (hidden), --wait
or --no-recent
is specified, or the file is in the system’s temporary folder. Also cleaned up the command options a bit, e.g. --async
is now --no-wait
, run mate -h
for more info.defaults write com.macromates.TextMate.preview enableLoopFilterList -bool YES
Zete LuiinvisiblesMap
option in .tm_properties
. Add either \n
, \t
, or a space to the string, followed by the glyph that should be used to render the character, or prefix it with ~
to disable rendering of that character. For example to disable rendering of spaces and render tabs as ┊
add this to .tm_properties
: invisiblesMap = "~ \t┊"
. Steven ClukeyfindInSelectionByDefault
was set). This is no longer the case, but can be brought back by running: defaults write alwaysFindInDocument -bool YES
. Jeremy Whitlockfi
drawn as fi
then update to Mensch version 2.0.PATH
variable would contain a trailing zero byte and thus everything appended to it was ignored.You can now set saveOnBlur
in .tm_properties
to make TextMate save files when focus is lost. Previously the recommended way was to create a command set to “Save Modified Files” with a semantic class of callback.application.did-deactivate
, though incase of a save error, such command would bring up UI where saveOnBlur
will ignore errors. Using .tm_properties
also allows to easily target specific file types, for example one could use:
[ ui/**.php ]
saveOnBlur = true
This would then only have .php
files in the ui
folder auto-save when focus is lost.
Two new project scopes have been introduced:
attr.project.vagrant
is set when your project has a Vagrantfile
and a corresponding Vagrant bundle can be installed from Preferences → Bundles to start up and shut down your vagrant environment.
attr.project.jekyll
is set when your project has a _config.yml
file (in lack of a better indicator). There are a few jekyll bundles on GitHub, but we haven’t yet added any of them to the index (shown in Preferences → Bundles).
Allow searching Open Files in the Find in Folder dialog. Ronald Wampler
~
) and bang (!
) operators both indicate that what follows must not match the file path. For example: *.{c,h}~vendor/**
will match .c
and .h
files except when under the vendor/
directory. It’s possible to specify multiple exclusion patterns and also to start the pattern with the exclude operator, e.g. !build/*!cache/*
will match anything not in build/
or cache/
. If the operator is used inside brace expansion (e.g. {Icon\r,*~.nib}
) then it’ll be treated as a literal match, similarly when used last in the pattern (e.g. *.txt~
).defaults write com.macromates.TextMate.preview hideStatusBar -bool YES
. Be aware that currently not all of the status bar actions have menu equivalents.With VoiceOver the current item will be announced in the various item choosers: File → Open Favorites… (⇧⌘O), Go → Go to File… (⌘T), and Navigate → Go to Symbol… (⇧⌘T). If you want to hear the first result (which is not automatically spoken), first press arrow up to hear it, then you can use arrows down/up as usual. If you want to browse the results without entering a search string, quickly type any letter and delete it to suppress VoiceOver information about menu command and current window. Boris Dušek
Commands with HTML output can decide how TextMate should act if the same command was previously run and its output window is still showing. This is done by setting the reuseOutput
key in the tmCommand
property list. Possible values are:
reuseAvailable
— re-use existing window unless command is running (default).reuseNone
— always open a new window.reuseBusy
— re-use existing window even if command is running, but warn the user first.reuseBusyAutoAbort
— re-use existing window, killing the running command (if any).The third option is suited for something like a build command where you are unlikely to want multiple simultaneous instances running.
The browser used for clipboard and search history, available using Edit → Paste → Show History (⌃⌥⌘V) and Edit → Find → Show History (⌃⌥⌘F), now support “type to filter”.
It is now possible to set the disableIndentCorrections
to emptyLines
. This will disable the indent corrections only when typing on empty lines, which has been made default for HTML.
Various fixes and improvements, click link above for full details.
If you want the file browser to show symbolic links as expandable items then select Preferences → Projects → Show links as expandable.
If you want the current document to always be selected in the file browser then select Preferences → Projects → Keep current document selected. Torsten Trautwein
If you dislike how TextMate moves tabs to be “right of current” when opening an already open document then disable Preferences → Projects → Re-order when opening a file.
TextMate will now remember open tabs for “project folders”. This means that if you run mate «folder»
, open a few tabs and close the window, then if you later open the same folder, TextMate will restore the open tabs (and file browser state).
You can see which folders TextMate has stored state for via File → Open Favorites… (⇧⌘O) — probably soon to be renamed “Open Project…”.
The feature can be disabled using:
defaults write com.macromates.TextMate.preview disableFolderStateRestore -bool YES
Commands executed by TextMate can now be interrupted by pressing ⌘. or ⌃C.
Added an --uuid
option to the mate
shell command which allows referencing untitled documents. If mate
is called from a TextMate command without any file argument then the UUID defaults to that of the current document, meaning a command can use something like "$TM_MATE" -l10-10:5
to select the first four characters on line 10.
The Bundles page in this about window would not show changes for 2014. This is now fixed.
If the Go to File filter string contains an asterisk (*
) it will be considered a file glob. Support for extension matching (by using a period in the filter string) has been removed. It did more harm than good, and the same can now be achieved by using an explicit glob string.
The zoom animation shown when opening items can now be disabled by running this in a terminal: defaults write com.macromates.TextMate.preview fileBrowserOpenAnimationDisabled -bool YES
You can now define word characters similar to 1.x by creating a new setting in the bundle editor with this content:
{ wordCharacters = «value»; }
The «value»
is a string of which characters should be considered word characters. You can set the scope selector if you wish to limit the scope in which the characters should be considered a word character.
Units for word movement/selection, completion, etc. are defined using a different system, see this FAQ item.
Opening files in the file browser can be done by single-clicking the icon. If you think the click-target is too small, you can make it open by clicking the text instead, this is activated by running the following in a terminal:
defaults write com.macromates.TextMate.preview fileBrowserSingleClickToOpen -bool true
If you wish to select items you either need to click to the left of the text, or hold down command (⌘) when clicking the item’s text.
Fix missing transparent backgrounds on 10.9.
seq 100
(no need to count how many lines are actually selected).invisiblesMap
option to the .tm_properties
file. This can be set to a string which is used to control which glyphs are used for invisible characters. Add either \n
, \t
, or a space to the string, followed by the glyph that should be used to render the character, or prefix it with ~
to disable rendering of that character. For example to disable rendering of spaces and render tabs as ┊
add this to .tm_properties
: invisiblesMap = "~ \t┊"
. Steven Clukey\x{HHHH}
for unicode code points and \xHH
for raw byte values (normally you would only use the former syntax).Support ${var}
in regexp part of format string transformations. For example if you wish the file name in the window title to be relative to $CWD
(current directory of the .tm_properties
file) then you can now add:
windowTitle = '${TM_FILEPATH:?${TM_FILEPATH/${CWD}.//}:$TM_DISPLAYNAME}$windowTitleProject$windowTitleSCM'
The example makes use of two constructs, the outer being ${var:?«if set»:«if not set»}
and the inner being the regexp substitution. I used .
to match the trailing slash that we also want to remove, mainly to avoid having to use escapes (if we wanted to use a literal slash).
Using ⌃T has been improved for the case where two “things” are selected delimited by some operator. It will now swap the two “things” rather than reverse the characters. You can see examples in the test file.
Miscellaneous fixes and improvements — as usual, click the link above for full commit history.
rmate
connections via IPv6 meaning that if you are using an ssh tunnel, you should use localhost
instead of 127.0.0.1
. Also worth mentioning that rmate
is once again a standalone script that can be installed without needing rubygems.public.source-code
. Jacob Bandes-Storchencoding
set in .tm_properties
(in a attr.file.unknown-encoding
section). Jasmin Lapalmedefaults write com.macromates.TextMate.preview fileBrowserStyle SourceList
and relaunch TextMate to enable. Jacob CarlborgIf a tab is sticky (settable via its context menu) then it will not close when using the batch close actions like holding option when opening a file via file chooser or file browser, etc.
The highlightPairs
setting now support regular expressions. To indicate a value is a regular expression, surround it with slashes, e.g. /<\w+.*?>/
. This setting is used for highlighting counterparts when caret moves over characters but you can also jump to the next/previous paired character (with same nesting level) via ⌃↓/⌃↑ and you can select the content with ⇧⌘B. The HTML bundle has been updated to declare start/end tags as pairs (HTML → Settings → Miscellaneous).
The file used for Go → Go to Related File (⌥⌘↑) can be set using a relatedFilePath
setting in .tm_properties
. If the file does not exist, TextMate will try its built-in search (which looks for files with same base name) and if nothing is found, it will create a new tab using the path specified via relatedFilePath
. The default properties have added the following settings to allow switching between test and regular *.go
files:
[ *.go ]
relatedFilePath = "${TM_FILEPATH/(?=\.go$)/_test/}"
[ *_test.go ]
relatedFilePath = "${TM_FILEPATH/_test(?=\.go$)//}"
A folder search can now be stopped via the stop button next to the status text or by pressing ⌘.. David Howden
followSymbolicLinks = true
to .tm_properties
.defaults write findInSelectionByDefault -bool YES
info.plist
can now use the requiredCommands
key. All items in the bundle will inherit the requirements, though they are presently only checked for commands and drag commands..tm_properties
). This matters when you want to override or augment variables. For example, if you want to setup commenting style variables, you previously had to edit the existing variables found in the language’s bundle. You can now place the variables in .tm_properties
in a group with the proper scope selector — although presently scope selectors in .tm_properties
are matched against the file’s scope, not that of the caret (so for languages that are likely embedded, it’s still best to set the variables via a bundle item).requiredCommands
bundle item key (to specify required shell commands) can now be used for completion commands as well. Long-term this will be usable with all types of bundle items (e.g. a snippet or macro may also require the presence of certain shell commands).TM_PROJECT_DIRECTORY
) then you should set it yourself.TextMate.system
(JavaScript in HTML output) no longer support being an inline shebang-script.TextMate.system
no longer source TM_SUPPORT_PATH/lib/bash_init.sh
.By default “font smoothing” is now disabled for dark themes. Font smoothing often makes light text on dark backgrounds look bolder than desired, should you however wish to have font smoothing enabled (for dark themes) you can run:
defaults write com.macromates.TextMate.preview fontSmoothing 1
The table showing bundles in preferences now use sortable columns. Steven Clukey
Added API to OakTextView to support the Emmet plug-in. Sergey Chikuyonok
Improve accessibility of various aspects of TextMate. Boris Dušek
Setup document scope attr.project.lein
for Leiningen projects. Dirk Geurs
Auto-paired characters can now be globally disabled using:
defaults write com.macromates.TextMate.preview disableTypingPairs -bool YES
$
in a scope selector we anchor the match to the content scope’s end. For example string $
will match source string attr.scm.git
because the last part (attr.scm.git
) is not part of the content scope. Joachim Mårtensson~/Library/Caches/com.macromates.TextMate/BundlesIndex.plist
and relaunch TextMate to have it re-index your Bundles
folders. Normally local file systems do generate file system events but problems appear to exist.Add Filter Through Command bound to ⌘|. I am aware that this keybinding might not work for all users. For now you will have to rebind manually via System Preferences → Keyboard → Keyboard Shortcuts.
The dialog doesn’t include all the options of 1.x, but I think most of that wasn’t being used, and by keeping the choices limited, we can improve keyboard usability. A few options are however likely going to appear, like indication of the input unit (which presently is selection and falling back on document) and outputting to a new window. Jacob Bandes-Storch + Allan Odgaard
rmate
has been turned into a ruby gem and can be installed with gem install rmate
on servers that have gem
available.POSIX_SPAWN_CLOEXEC_DEFAULT
on 10.7 to avoid kernel panic. Thanks to squatch for debugging this.rmate
listen port in Preferences → Terminal. If this value shows with a thousand separator you need to manually remove the separator character and press return to get rid of the old (bad) value.r
prefix on the build number to a
. Previously it was short for “revision”, but since I may reset the counter once we go from alpha → beta → release, it should use the build’s status as prefix.zeroIndentPattern
. Lines matches by this pattern get zero indent but does not affect the indent of following lines. Probably only useful for C preprocessor lines, maybe also code lines in template languages that support a “begin of line” character as an alternative to wrapping the code in special syntax.TM_MATE
environment variable which bundle commands should use when they wish to call mate
(previously the convention was to use "$TM_SUPPORT_PATH/bin/mate"
).Assign ⌃⌘↩ to View → Enter / Exit Full Screen.
Rework find dialog: This is work in progress but I don’t think any functionality is missing compared to previous build, although some functionality might be less polished, e.g. the action buttons don’t properly enable/disable and the height of the results list gets lost when hiding it.
Some of the stuff that has changed / improved:
requiredCommands
key (in the tmCommand
property list) and specify a variable will now always have that variable set. Previously it was only set if the required executable was not found via PATH
.Themes can now specify they want to use the sRGB color profile. This is done by adding the following to the theme:
colorSpaceName = sRGB;
This color profile is a better choice for interoperability so new themes should use it (and we will likely convert the old themes).
The menu
dialog command would return wrong items for menus with separators or headings.
Add line, type, and display name flags to rmate
. Toby Butzon
mate -w
would hang forever. The ‘New Document’ file browser action will now create a document on disk in addition to a new tab. The type of this document (and thereby the file extension) is taken from Preferences → Files → New document type but you can set it per-folder via .tm_properties
, e.g.:
[ attr.untitled ]
fileType = 'source.objc++'
The Edit → Select → None action bound to ⇧⌘A can now be used to deselect all in the file browser. It does not require focus to be in the file browser.
When focus is not in the text view then the Go → Back/Forward menu items get ⌘[ and ⌘] as key equivalents. Additionally 10.8 users should now (also) be able to use the two-finger swipe gesture for back/forward in file browser and command output (HTML).
file
links in HTML output that link to directories will now open the potentially contained index.html
(this is mainly for documentation commands).
Introduce TM_PROPERTIES_PATH
. This variable contains a colon-separated list of .tm_properties
files that have been read (to create the current “environment”). This is mainly meant as a debug aid.
Starting with this build, the summary for each update is going to be shorter so if you want all the details visit GitHub by clicking the link in the heading above.
When you change the spelling language via Edit → Spelling then we record your preference as:
We no longer store the preference for documents with same type (e.g. text.html
) as that wasn’t useful.
Add bottom tool bar to file browser. The current “New Document” action is likely to change.
Relaunching as part of an software update will restore your open documents even if you disabled that option in preferences.
When moving focus to file browser via Navigate → Move Focus to File Browser (⌥⌘⇥) and there is no selection, we now select the first item (mainly to give an indication of successfully having moved focus, as there is no focus ring for this view).
On 10.8 TextMate will now show a notification when posting a crash report to macromates.com
. This way the notification center provides a list of recent crashes that can be clicked to view the online version.
When closing other tabs (either right-clicking a tab and selecting that action or option-clicking a tab’s close button) documents which are modified but untitled are left open (rather than asking you about what to do).
When TextMate run commands it creates a “clean” environment, only inheriting a select few variables from its parent process. You can now alter the whitelist via the environmentWhitelist
defaults key. This is a colon-separated list of variables to inherit. If an item in the list contains an asterisk, then it is treated as a glob.
Example:
defaults write com.macromates.TextMate.preview environmentWhitelist '$default:MANPATH:*EDITOR'
Here ‘$default’ will expand to TextMate’s default whitelist.
Normally TextMate will setup HOME
, PATH
, TMPDIR
, LOGNAME
, and USER
. If you whitelist any of these, then the variable (if set) will instead be inherited from the parent process.
TextMate now respect setting disableAutoIndent
and disableOutputAutoIndent
in snippet and command bundle items.
When inserting identical paired characters (like straight quotes), we now check the entire line to see if it’s unbalanced, rather than only what’s to the left of the caret.
If you check “keep bundles updated” in Preferences → Software Update then we no longer update the installed bundles. The index is however still kept up-to-date and it’s not recommended to disable bundle updates.
Fix issue where entering a file suffix in the file chooser (⌘T) would get a too high rank.
Fix searching for case-sensitive regular expressions. Previously the search would always be case insensitive.
.less
files. Bob Rockefeller.js
) be a subset of the file’s (e.g. foo.js.erb
). This subset must however match the entire sub-extension. E.g. .m
as filter string will still have .md
files excluded..tm_properties
now also match folders (e.g. file browser looks up settings with just a folder rather than file, as “key”).TextMate.app
for r9351 wasn’t timestamped. This may have been the reason some users had Finder report that the program was broken. I have re-enabled timestamps.<NUL>
characters then these can now be pasted into TextMate.Rework file chooser (⌘T): It now show document icons (with potential SCM status) and close buttons for open documents. Filtering has also seen some minor improvements, mainly related to “full path” filtering (which you activate by putting a slash in the filter string). Performance should be better when dealing with large directories (try e.g. ⌘↑ to move to the parent of your current folder), this mainly relates to not stalling the application (the scanning itself could likely be a little faster). Presently though a few things are missing:
@
to descend into a file and see its symbols (will be added back).Opening multiple documents at once will now select the last one so that ⌘W can be used to go through them. Try e.g. holding down shift when using arrow keys in the file chooser.
When you open documents and select to “close other” then it leaves modified documents open rather than ask about saving them. Try e.g. holding down option (⌥) when you hit ↩ in the file chooser.
When you open the file chooser, we look at the find clipboard to see if it contains something of the form «file»:«line»
and if so, uses that as the default filter string. This “matching” now also works if the file contains slashes. The idea is that when you have “error output” e.g. in your terminal, you can select it, hit ⌘E and switch to TextMate where you hit ⌘T + ↩ to go directly to the file + line. If you find yourself doing it a lot, you may like the automator workflow described in issue #665.
Restyle navigation bar to be more in line with Lion. Michael Sheets
We now download software updates to the system’s cache folder (instead of temporary folder). This should hopefully fix the problem some ware having with the “temp cleaner” waking up before the update got installed. If you still get this warning, let me know.
The encoding pop-up in Preferences → Files would reset itself to UTF-8 after a relaunch (which really should have been viewed as a feature :) ).
Fix crash introduced in r9345.
git stash
/rebase
) and you opened the file again (e.g. via mate
) then TextMate would open a new tab, even though the file was already open.File browser has a new navigation bar. This is work in progress. You can find most actions of the old bar in the Go menu (where you can also see the key equivalents). Presently missing is “Show Hidden Items”, a toolbar below the file browser will soon appear.
Improve QuickLook support: When the preview panel is showing (activated by pressing space with focus in the file browser or using a file’s context menu to select Show Preview) then you can use arrow up/down to move between the files in the file browser.
Improve full screen support: If you quit with windows in full screen mode, these are restored in that mode. Opening windows while a window is in full screen mode no longer re-uses the (huge) dimensions of the full screen window, likewise windows opened directly in full screen mode will have a more useful size when leaving full screen mode.
Fixed file chooser’s abbreviation matcher (⌘T): If you had multiple “corrections” stored for an abbreviation, all but the first of these would actually go to the bottom of the list, the opposite of what was desired.
Using Go → Current Document (⌃⌘R) will no longer have the file browser switch away from your project folder but instead expand folders to make the current document visible. Jacob Bandes-Storch
Using Go → Enclosing Folder will select the item we came from (like Finder).
Previously the file browser would remember the selection state of all visited folders. This is now cleared during relaunch (except the folder currently showing) and also when using various actions that request a selection, e.g. the two previous items mentioned.
Using exit_discard
in a command with HTML output will now close the output view (like 1.x did).
Find in Folder will now (also) use excludeDirectories
and excludeFiles
settings (it previously would only use those with an InFolderSearch
-prefix).
Running commands with no document windows open (or in the responder chain) would miss a few essential variables from the environment (such as TM_SUPPORT_PATH
).
Tweaked the SCM status gathering code so there should hopefully be less overhead. People who have previously disabled SCM badges because of poor performance may wish to give them another try.
Various fixes to improve stability.
mate
, open -a TextMate
, dragging the folder to TextMate, using the favorites (⇧⌘O), open dialog, txmt:
URL scheme, or what have you), your project no longer requires a .tm_properties
file setting projectDirectory
for Find in Folder (⇧⌘F), Go to File (⌘T), and similar to work as desired. Additionally the default properties now set a window title that includes the project folder’s name (and SCM branch when available), so most projects can now also drop setting windowTitle
. Note that windows restored from a session created prior to r9339 will not have a default project folder, so you should close and re-open the project folder, after this, the project folder will be preserved in the session save data.open
command used with the txmt:
URL scheme now supports an uuid
parameter. This is for command runners that work with untitled documents (the current document’s UUID is available as the TM_DOCUMENT_UUID
environment variable).url
parameter used with the txmt
URL scheme. Also allow tilde to be used in the URL (mainly to be 100% compatible with TextMate 1.x).*.tmPlugIn
file will now install it (hold down ⌥ to open as folder). It’s no longer required that the bundle identifier of the plug-in starts with com.macromates
but instead the plug-in’s Info.plist
must have TMPlugInAPIVersion
set to 2
. Despite this change, there is still no formal support for plug-ins and the internal API hasn’t stabilized, if you wish to extend TextMate (beyond what can be done via bundles) then the current way is to dig into the source.TM_SOFT_TABS
variable. Michael SheetsAdd filepanel
dialog command. For details use ⌃R (execute current line) on a line containing: "$DIALOG" help filepanel
. Hans-Jörg Bibiko
The contributions page in the About window now list the commits from contributors. Brad Choate
When the file browser is showing a lot of items, delays can happen when opening, closing, saving, or changing a file (when it goes from unmodified to modified) so as a temporary workaround you can now disable the file browser status by adding the following to .tm_properties
:
fileBrowserDocumentStatus = false
Long-term the goal is of course to improve the slow file browser refreshing. Josh Goebel
Command input and the TM_SELECTED_TEXT
variable now work correctly with column selections.
If no theme is selected, the gutter now get a default set of colors. Robert Hencke
The command properties drawer in the bundle editor has been made less wide by wrapping a few lines. Adam Strzelecki
Using “Transpose” (⌃T) with a discontinuous selection will now swap the selected strings. If pressed repeatedly, and more than two strings are selected, it will cycle through all possible permutations.
The scope now contains dyn.selection
and/or dyn.caret.*
based on the following rules:
dyn.selection
.dyn.caret.mixed.columnar
.dyn.caret.mixed
.dyn.caret.begin.line
or dyn.caret.begin.document
.dyn.caret.end.line
or dyn.caret.end.document
.When expanding tab triggers, the left scope is the scope to the left of the start of the potential tab trigger and the right scope is likewise that to the right of the potential tab trigger.
rmate
: Overwriting an existing file now preserve the existing file’s group and owner.
callback.document.will-save
. This can be used to have a command called prior to saving a document, the command could e.g. strip trailing whitespace or ensure the document has a LF
character on last line. Two minor issues is that selection is currently lost after running a “did save” command (when it replaces entire document) and caret is scrolled into the visible area.Files which use CRLF no longer cause problems for Find in Folder. Rasmus Abrahamsen
One can now use ⌃S and ⌃⇧S for Find Next/Previous when incremental search is active. Also improved the look of the incremental search control. Mads Hartmann Jensen
It’s now possible to use “replace selected” after Find All for a single document (previously the selection was not respected). Rasmus Abrahamsen
Added a TM_QUERY
command that can be used to query (project specific) settings for bundle commands. For example if a bundle command wish to use the current document’s font settings it can be obtained via these two (shell) commands:
"$TM_QUERY" --setting fontName
"$TM_QUERY" --setting fontSize
If no --setting
is given then all settings are returned. Ole Gammelgaard Poulsen
Add indent aware begin/end of line action methods.
The methods going to “begin of indented line” will go to the first non-whitespace character on the line, unless the caret is already there or to the left of this character, in which case it will go to the actual beginning of the line.
The “end of indented line” methods work similarly.
If you want (⇧)⌘⇠/⌘⇢ and ⌘⌫/⌘⌦ to use this behavior, you can add the following to your key bindings file:
"@\UF702" = "moveToBeginningOfIndentedLine:";
"$@\UF702" = "moveToBeginningOfIndentedLineAndModifySelection:";
"@\UF703" = "moveToEndOfIndentedLine:";
"$@\UF703" = "moveToEndOfIndentedLineAndModifySelection:";
"@\U007F" = "deleteToBeginningOfIndentedLine:";
"@\UF728" = "deleteToEndOfIndentedLine:";
If you create a set of local key bindings then they no longer eclipse the default set. For the records, key bindings are consulted in the following order:
~/Library/Application Support/TextMate/KeyBindings.dict
/path/to/TextMate.app/Contents/Resources/KeyBindings.dict
~/Library/KeyBindings/DefaultKeyBinding.dict
/Library/KeyBindings/DefaultKeyBinding.dict
/System/Library/Frameworks/AppKit.framework/Resources/StandardKeyBinding.dict
If you edit any of the above files you will need to relaunch TextMate (⌃⌘Q) before the changes take effect.
The gear icon in the Find in Folder status bar (above the results view) now have four flavors of copying the results to the clipboard. These work on the selected items falling back to all matches, if there is no selection (here selection means actual list view selection, not “checked” via the check boxes).
Launching commands from TextMate now only inherit a few whitelisted variables from the process that launched TextMate. This should fix inconsistencies between running TextMate from the shell versus Finder, and in the former case, avoid problems if you set RUBYOPT
or similar.
When moving the selection and padding is inserted, we no longer extend the selection to include this padding.
Moving selection left/right with an east asian character on left/right side would insert a space rather than move the selection.
Creating new files via New Tab no longer have the file show up in the Open Recent menu.
Opening files via mate
no longer have the item show up in the Open Recent menu. Though you can call mate --recent
to force the file to appear (or make an alias). The rationale is that mate
is often used to edit temporary files like commit messages and that the shell history serves as an alternative to “Open Recent”.
If more than 256 KB of text was selected, running commands would fail, as the TM_SELECTED_TEXT
variable exceeded ARG_MAX
which would cause execve
to fail. If more than 256 KB of text is selected we now set the TM_SELECTED_TEXT
variable to a placeholder.
Add some checks that should prevent a crash when system ask about text metrics (with a bogus text index). Unsure exactly under which circumstance the crash happens, but likely related to the system-wide dictionary service or multi-lingual input.
Update rmate
: Saving would fail if editing file
and file~
already existed.
If ⌘-clicking a single caret two times, TextMate would crash, as ⌘-clicking an existing caret normally removes that caret, except when there is only a single one, in that case, it would (wrongly) add a caret leaving two carets at the same position, and make the second click remove both of these two carets, leaving the editor with no carets.
Fix crash when clicking exactly on the split view dividers.
Fix potential crash when quitting TextMate (in network::launch_tbz
).
mate .
)..tm_properties
file, then you should add the asterisk to your set of included files, e.g. {*,.tm_properties,.htaccess,.gitignore}
.x-insert
dialog command to work even when the text view doesn’t have focus. Hans-Jörg BibikoMinimum dimensions are enforced when resizing the file browser or HTML output. The explicit resize buttons have been removed but dragging the dividers should now be easier, as the hot zone has been increased.
Setting a file type for a dot file wouldn’t stick.
Sections (in .tm_properties
files) which use a scope selector now apply according to their rank (when matched against current scope) so e.g. a setting for source.ruby
in Global.tmProperties
will win over a setting for just source
in a more local .tm_properties
file.
Added two new variables:
TM_APP_IDENTIFIER
— bundles which need to read settings from TextMate should use this instead of hardcoding com.macromates.TextMate.preview
. Normally though bundles should not need to read TextMate settings except those they write themselves, for example the Preferences dialogs for various bundles are bound to TextMate’s user defaults.TM_CURRENT_THEME_PATH
— this is the path of the current theme. Incase the theme is in delta format, it points to the base theme, long-term TextMate may store a non-delta version in a temporary folder and let it point to that, so that bundles can always assume the theme is in non-delta format.Various improvements to glob matching:
**
can now be followed by something other than /
, e.g.: src/**.{cc,mm,h}
.*
and **
now match leading dot when they are not followed by /
or at the beginning of the glob, e.g. main*
will match main.cc
.!
) now also rejects dot files, e.g. !cache/**
will exclude cache/.DS_Store
even though cache/**
(non-negated) would not have matched that path.Find in Folder (⇧⌘F) and File Chooser (⌘T) now exclude files matched by the “Non-text files” glob setup in Preferences → Projects.
The various include/exclude globs you can set in .tm_properties
are now aggregated. So setting exclude
and excludeDirectories
will exclude directories matched by either of the two globs (rather than the “most specific”).
Include SCM info in window title by default. This is done by having the following in Default.tmProperties
:
windowTitleSCM = '${TM_SCM_BRANCH:+ ($TM_SCM_NAME: $TM_SCM_BRANCH)}'
windowTitle = '$TM_DISPLAYNAME$windowTitleSCM'
Incase you want to set a custom window title but keep the SCM info you can use the windowTitleSCM
variable, e.g.:
windowTitle = '$TM_DISPLAYNAME — ${CWD/^.*\///}$windowTitleSCM'
Exploiting the way sections with scope selectors are now evaluated last, it is possible to set a global window title based on a potential projectDirectory
variable. E.g. put the following in ~/Library/Application Support/TextMate/Global.tmProperties
:
[ 'attr, ' ]
windowTitleProject = '${projectDirectory:+ — ${projectDirectory/^.*\///}}'
windowTitle = '$TM_DISPLAYNAME$windowTitleProject$windowTitleSCM'
Normally we can’t use projectDirectory
in a default/global setting, because that variable is set later, and we have no way to specify “late binding”. However, by setting it in a scope selector section we evaluate the variable after a potential projectDirectory
has been set in a more local .tm_properties
file. The scope selector used here is attr,
which means all attr
scopes or (the comma operator) the empty scope selector (which matches everything).
The above is just a “hack” until better solutions have been implemented.
Removed Chinese translation. Since the translated interface files contain more than just strings, outdated translations affect program behavior. We’ll soon move fully to constraint-based layout which should allow translations to be purely string-based (on 10.8).
r9307 accidentally included a “Select Next” macro bound to ⌃W for when there was a selection. This interfered with using ⌃W with multiple carets (as presently multiple carets trigger the dyn.selection.discontinuous
scope even if they are all zero-width).
If there is some feature you would like to add to TextMate but need a little guidance on how to go about it, we are holding a TextMate Hackathon Saturday the 22nd of September 2012 starting at 2 pm, the address is:
SHAPE
Gothersgade 8B, 3rd floor
1123 København K
Denmark
We can fit 20-25 people so please let us know in advance if you wish to attend, either using the facebook event or by emailing Allan Odgaard (me).
We also welcome people who just want to drop by and say hello, share a pizza, or have some other project they want to hack on, in the company of fellow Mac/TextMate devotees.
When toggling Check Spelling as You Type (⌥⌘;) or changing spelling language, we now recheck/refresh the document.
Remove overwrite and freehanded toggles from the UI (Edit → Mode and status bar). If you wish to edit “freehanded” you can ⌥-click to get a caret that moves unrestrained.
An image is now used as placeholder for folded text. It defaults to the color of the text’s color but you can add a theme style scoped to deco.folding
to change it.
A few updates to gutter theming, the colors now need to go in their own dictionary in the theme with a key of gutterSettings
, e.g.:
gutterSettings = {
divider = '#1A3853';
foreground = '#111111';
background = '#888888';
selectionForeground = '#FFFFFF';
selectionBackground = '#3A68A3';
};
In addition to the above keys you can now also set:
icons
iconsHover
iconsPressed
selectionIcons
selectionIconsHover
selectionIconsPressed
selectionBorder
If unset, the icon colors default to the colors used for text and selection border defaults to the divider color.
Proxy items are bundle items with a regular scope selector, key equivalent and/or tab trigger. Their body is a “query” which will find bundle items with a semantic class matching this (simple) query string.
Until now we have only used this for the SCM items. None of the actions (in Git, Mercurial, Subversion, and other SCM bundles) actually have a key binding, but they all have a semantic class which start with action.scm
.
There is an SCM bundle with a single proxy item bound to ⌘Y which does a query for action.scm
so if the user press ⌘Y, it will map to the SCM actions valid in the current scope (e.g. attr.scm.git
).
A few improvements has been done with respect to how proxy items appear in the interface:
||
operator for “fallback”, e.g. we can make a proxy item with a query like: action.build || format.strong
which will find a build action for the current context (scope) and if none is found, it will instead search for a format.strong
(bold) action.I plan to expand the query string to also support unions, so that we can e.g. bind ⌘D to a query on diff + scm.diff
(to show Diff actions including those for the current version control system) and additionally put a scope assertion on the class query, for example my ideal ⌘B binding would likely be a query for:
action.build[-dyn.selection] || format.strong || action.build || action.run
So the first term (action.build
) only match items if there is no selection, if there is a selection, we would instead search for a format.strong
item, and if there isn’t any then we would look for a build action (this time even when there is a selection) and finally fallback on a run item.
If you have any comments on the above, please share on the mailing list.
Add two new action methods:
findNextAndModifySelection:
findPreviousAndModifySelection:
These find the next/previous occurrence of what’s on the find clipboard and selects that, but preserves the existing selection. One could e.g. add this to Keybindings.dict
:
"@d" = ( "copySelectionToFindPboard:", "findNextAndModifySelection:" );
This binding will likely be default in an upcoming build, but bound to ⌃W (Select Word) and scoped to dyn.selection
(so only when a word is already selected).
During save, the potential dialogs asking to unlock files or change encoding would not accept the user’s choice (bug recently introduced).
Fix out of range assertion in some cases when switching files (gutter was querying the new document using the selection used in the old one).
When extending a selection we now only highlight the new ranges selected rather than all of them (e.g. Find All (⌥⌘F) when there already is one instance selected or the new find{Next,Previous}AndModifySelection:
).
Jumping files with ⌘G (after a Find in Folder) would lead to an anchored selection, a few other cases would also cause the selection to be anchored. This is no longer the case (the subtle difference here is that unanchored selections will always extend for the initial shift (⇧) + movement action).
Add revision numbers to release notes. Elia Schito
Bundles
folders (under Library/Application Support
) was a symbolic link.svn status
) for untracked folders.You can now disable SCM badges by adding this to .tm_properties
:
scmStatus = false
This can be set either globally (~/.tm_properties
) or for specific projects. If you see file browser performance issues then you should try to disable SCM badges.
Improve performance of obtaining subversion status by using xsltproc
to process the XML (instead of python
) and by skipping status parsing for clean files. Jeremy Whitlock
Fix issue with bundle item key equivalents sometimes eclipsing regular menu items even when the bundle item in question should not be enabled (due to scope selector).
sudo mate
would fail to establish connection with TextMate (bug introduced when socket name was changed to include user ID).readlink
) it will show an alert with some diagnostics that you should submit to us (more info in the dialog). This is an attempt to track down another random crash that has been frequent (but has been in decline in recent versions, though not because it is fixed).libc++
and as a 64 bit application using the new Objective-C run-time. Ideally no changes affecting the user, but a lot has changed under the hood. Jacob Bandes-StorchTM_SCM_NAME
variable giving the name of the SCM system used for the current file (git, svn, or hg) which can be used when setting windowTitle
. Adam StrzeleckiTM_SCM_BRANCH
and TM_SCM_NAME
variables based on the current project. Adam Strzeleckimate
was installed in ~/bin
then TextMate wouldn’t properly update it, but prompt for admin password on each launch (until manually updated).Add context menu to tab bar. Actions include creating new tab (can also be done by double-clicking empty space in a tab bar), tearing off tabs (can also be done by double-clicking a tab), closing other tabs (can be done by option-clicking the tab’s close button), and closing tabs to the right.
Added badges for Subversion status. This is based on the svn
executable rather than libsvn
. Set TM_SVN
to a version of svn
compatible with your repository format. Note that if your Mac username is “long” then the driver currently fails to parse the output from svn
. Jeremy Whitlock
Add a few new options to Project Preferences (previously these could only be enabled via defaults write
).
All items in the Preferences now work, well, except for Projects → Display → All filename extensions.
When changing settings, we now save them to ~/Library/Application Support/TextMate/Global.tmProperties
. This is a regular properties file (like ~/.tm_properties
) and it will try to be “smart” about how to record your preferences:
text
is a parent type of text.plain
), and globally. This makes it easy to set different tab sizes for different languages, or enable soft wrap for text files.Some of the settings in the Preferences window are also stored in Global.tmProperties
and if you switch file type for an open file, we also record that in this file (by adding a section for a file glob matching the current file’s extension, and setting the file type in this section).
We encourage you to tweak your settings and then inspect this file, as it’ll give you a feel for the possibilities.
Theme colors are now transparent against the background. Previously colors with alpha would be blended with a previous color setting for the same element, which was rarely desired. This mainly applies to color of invisibles and selection (which now should match the rendering done by TextMate 1.x).
Further improvements to theming the gutter. There are now the following keys which can be set to change the color of gutter elements: Dennis Vennink
gutterDivider
: Border between text view and gutter.gutterForeground
: Text color.gutterBackground
: Background color.gutterIcons
: Color of the images in the gutter.gutterSelectionForeground
: Text color for lines containing caret / part of a selection.gutterSelectionBackground
: Background color for lines containing caret / part of a selection.gutterSelectionIcons
: Color of images on lines containing caret / part of a selection.gutterSelectionBorder
: Border between selected and non-selected lines.Changed default font to Menlo, 12 pt. Although this has been on the system for quite some time, applications which don’t use the 10.8 SDK will still receive Monaco as the default monospaced font. Unfortunately this means by default users wont see bold and italic text, as Monaco has no such variants, and CoreText will not synthesize these styles.
If shrinking HTML output view to (below) zero points, the view is now back again after relaunch (temporary fix for the lack of constraints on sizing views in the main window) Lukasz Czekaj
Add scope attributes for Ant, CMake, Maven and Scons projects. Michael Sheets
gutterSelectionBackground
in a theme (or as a global style) to affect gutter rendering David HowdenSave dialogs now have controls for setting encoding, line endings, and whether or not to use a byte order mark (for unicode encodings).
When the find window is active (with find in folder results) one can use one of the View → Toggle Foldings At Level actions to collapse/expand the results. This was done to allow collapsing using the keyboard (e.g. use ⌥⌘1).
When in a snippet placeholder field, deleting the content and pressing tab will advance to next field even if the word to the left of the caret is a tab trigger. An example of this is div⇥ in HTML mode, if pressing ⌫ after expanding it, pressing ⇥ would expand another div
snippet. When at the end of a snippet, it will allow the word to the left of the caret to trigger a tab expansion, as this is used to chain snippets.
Colors used in the gutter can now be set in the theme using the following 3 keys:
gutterBackground
gutterForeground
gutterDivider
Default colors are calculated, but might not be ideal for all themes (e.g. solarized) Jacob Bandes-Storch
Icons in the gutter has been updated for retina and images changed so the bookmark indicator is a bookmark and the “found a match here” (for search in folder) is now a magnify glass. Dennis Vennink
Last version of rmate
didn’t preserve file permissions when editing existing files. This has now been addressed.
Several users reported a socket error during startup. This happened after we moved the socket into TMPDIR
so it has now been moved back to /tmp
but the name include the user ID to avoid clashes on multi-user systems.
TextMate will now update the installed version of mate
if TextMate.app includes a newer version. This might result in prompting for admin password after updating TextMate.
Various improvements in paragraph definition and wrapping:
Selecting Use Selection for Find/Replace with a discontinuous or column selection now use just the first range/row.
Go to Current Document (⌃⌘R) is now a toggle.
Go to SCM Status (⇧⌘Y) is now a toggle.
When showing SCM Status (⇧⌘Y), we no longer show folders in the Uncommitted Changes if items from these are also shown. In the Untracked Items we don’t show items as untracked if an ancestor folder is also included.
Find in Folder: Pressing ⌘1-⌘9 will select first match of the n’th file in the results list. Previously it only selected the n’th file (and you had to use arrow down to actually get to the match).
Favorites prefixed with ‘[DIR]’ show folders within.
For example if you have all your projects under ~/Projects
then you can do:
mkdir -p ~/Library/Application\ Support/TextMate/Favorites
cd ~/Library/Application\ Support/TextMate/Favorites
ln -s ~/Projects "[DIR] My Projects"
This will then have all the folders inside ~/Projects
show when you choose Open Favorites… (⇧⌘O).
When TextMate launches it creates a socket for mate
to connect to. There have been a few reports of TextMate reporting a problem creating this socket. We now also show an error if an old socket exist and we are unable to delete this old socket. If you are seeing an issue, please don’t just add “it fails for me too”. Instead provide as much information as possible, and if e.g. it says it failed to delete the socket, fire up Terminal and check the file flags (ls -l
) and try to delete it from Terminal.
Fixed: Keys on the numeric keypad can be used to trigger bundle actions (not explicitly bound to the numeric keypad). This fix removes the distinction between regular keys and the numeric keypad so it is no longer possible to bind (only) to numeric keypad keys.
Include high resolution (white) I-Beam cursor. Jacob Bandes-Storch
Several HiDPI assets added. Paul Wilde
Border between text view and gutter is now “fixed” (when invoking the elastic “scroll beyond the document bounds”). Jacob Bandes-Storch
Fix bundle menu items' appearance in the Help menu. Jacob Bandes-Storch
Bundle Editor: If you disable an item, you can now actually enable it again. Disabled items are rendered in grey. Gerd Knops
Bundle Editor: Columns are now resizable. Elia Schito
Minor tweak to how pasting works. Previously if you did a multiline selection and on the last line selected to the end of the line but excluded the actual newline, copy and pasted that somewhere else, it would treat it as you had also copied the newline. This is now only the case when you are pasting on a line that is not empty.
Unless you disable session restore, relaunching as part of software update no longer ask you about unsaved documents.
Preferences icons updated for HiDPI displays. Paul Wilde
rmate: Better file saving strategy. OZAWA Sakuro
rmate: You can now store options in /etc/rmate.rc
or ~/.rmate.rc
. Example below. Nicolas Ledez
host: localhost
port: 52698
Improve tab trigger boundary checks. Previously a tab trigger had to be preceded by a non-word character (where underscore is considered a word character). Now we instead require that the previous character belong to a different character class (as defined by scoped settings) or has another “is alpha numeric”-state.
Split disableIndentCorrections
into two settings:
The disableIndentCorrections
setting disables the (aggressive) indent corrections that TextMate does while you type.
An additional indentOnPaste
setting controls how to indent when pasting and can be set to:
simple
— this is the indent behavior which was previously implied when setting disableIndentCorrections
. It indents the paste to the position of the caret and works well for Python.disable
— the text is inserted as-is without indenting it.TM_DROPPED_FILE
variable had a path relative to project directory instead of current file. This would make some drop commands insert wrong path.--host=auto
option to rmate
didn’t work. Timothy Andrew<kbd class='keyEquivalent'>⌃!</kbd>
would previously not show). Also several legacy APis have been updated to the latest from Apple Jacob Bandes-StorchprojectDirectory
and then doing a project folder search.git commit
then the Git bundle would have issues (since it would inherit a wrong GIT_DIR
environment variables)The source for TextMate 2 is now available at GitHub under a GPL 3 license. There is an interview at Ars Technica that gives some background about what motivated this decision.
TextMate 2 now require 10.7
When opening an already open folder (e.g. mate .
) the window with that folder is brought to front Adam Strzelecki
When no URL is given in a txmt
URL then current document is used (this affected e.g. clicking errors in a ruby stack dump when running untitled files) Gerd Knops
Opening txmt
URLs with escaped spaces no longer fail Gerd Knops
git: If a folder contains files with mixed status, the folder itself now gets a badge Gerd Knops
SCM badges are now enabled for disk images Gerd Knops
Scope selectors now support anchoring matches by using ^
, $
, and >
to anchor to either the first, last, or previous scope element Joachim Mårtensson
Subversion support (badges) has been disabled. The libsvn.a
used was an older version which didn’t support the most recent repository format, and building the latest version gave rise to a few problems. Moving forward, I think subversion support should be re-added by calling the svn
shell command to obtain status (this is the approach taken for both git and mercurial).
Absolute paths in the “Find in Folder” results now use the name of the disk instead of /
as first element
git: Updated driver to work with the new way submodules have their metadata in the super project.
Tab triggers are no longer rendered in the menu. This is caused by the switch to the 10.7 SDK which no longer allow the old way of rendering these items. Replacement code is of course planned.
Projects with a *.ninja
file now get the attr.project.ninja
scope.
Sections in .tm_properties
files can now target multiple globs/scopes by separating them with a semi-colon, e.g.:
[ source.ruby; *.rb ]
tabSize = 2
moveToBeginning/EndOfParagraphAndModifySelection:
selectors. The default key bindings have ⌃⇧E extend selection to end of paragraph (so was previously a no-op in TM)..tm_properties
parser no longer require spaces around the equal character nor is there a need to quote section names when they contain special characters, etc. The full grammar can be found in the help book.Improved SCM workaround for Mercurial issue — previous workaround could leave SCM status outdated, this should no longer be the case.
Fix problem with items that differed only in capitalization. These were collapsed into a single item in several UI menus/dialogs, e.g. Open Favorites.
Fix bad encoding when copying Find in Folder / Find All results.
Using Go to Counterpart no longer include files matched by the effective binary
or exclude
glob from .tm_properties
.
Changed binary
setting in .tm_properties
from a boolean to a glob. This allows to set a global binary glob instead of needing to set the boolean for specific settings (which is more complex to manage via a GUI).
Introduce attr.file.unknown-type
and attr.file.unknown-encoding
. You can use this in .tm_properties
files to set fileType
and encoding
to provide default values only for files where TextMate was unable to find the proper type/encoding (which normally results in a dialog asking the user).
Cached .tm_properties
files are now observed via kevent
so changes invalidate the cache immediately (previously it could take up to 30 seconds before the updated file was read). On file systems without kevent
support you need to relaunch TextMate to flush the cache.
The sections in .tm_properties
files are now considered real scope selectors. As the syntax for globs and scope selectors is the same, the latter must start with attr
, source
, or text
to indicate it is a scope selector. If your desired scope selector does not, you can always prefix it (with the always present attr
) e.g.: [ "attr - attr.scm" ]
to have settings for files not under version control. This should just be temporary while exact requirements are being fleshed out.
Introduce TM_SCM_BRANCH
variable (mainly useful for setting windowTitle
in .tm_properties
).
You can augment the rules for scope attributes by saving a property list to ~/Library/Application Support/TextMate/ScopeAttributes.plist
. Your rules will be added to the default list which is:
{
rules = (
{ attribute = 'attr.scm.svn'; glob = '.svn'; group = 'scm'; },
{ attribute = 'attr.scm.hg'; glob = '.hg'; group = 'scm'; },
{ attribute = 'attr.scm.git'; glob = '.git'; group = 'scm'; },
{ attribute = 'attr.scm.p4'; glob = '.p4config'; group = 'scm'; },
{ attribute = 'attr.project.make'; glob = 'Makefile'; group = 'build'; },
{ attribute = 'attr.project.rake'; glob = 'Rakefile'; group = 'build'; },
{ attribute = 'attr.project.xcode'; glob = '*.xcodeproj'; group = 'build'; },
);
}
The group
is to allow mutually exclusive attributes. E.g. if a folder contains both a Rakefile
and a Makefile
entry, files in that folder only get the attr.project.make
attribute set since the two tests are in same group (and the Makefile
test is listed first).
Added View → Show Wrap Column setting and corresponding showWrapColumn
.tm_properties
setting.
Introduced fontLeadingDelta
and fontAscentDelta
defaults keys. These must be set as floats or integers (not strings), e.g.: defaults write com.macromates.TextMate.preview fontLeadingDelta -float 0
. The default value for both keys is 1
.
Use of extended attributes can now be disabled. The defaults key is volumeSettings
and the value is an associative array with path prefix and another associative array with settings for that path (presently only extendedAttributes
is supported, but SCM badges, display names, and more is likely to appear). So if for example we wish to disable extended attributes for files under /net/
we can do: defaults write com.macromates.TextMate.preview volumeSettings '{ "/net/" = { extendedAttributes = 0; }; }'
.
Some improvements to file chooser (⌘T):
The font size unit parser (for themes) is no longer locale sensitive (so period is always .
).
The collapse/expand all button for the Find in Folder results did not properly refresh the outline view on Lion.
Implement option page up/down (for moving caret).
Set initialFileBrowserURL
defaults key (to a URL) to change the initial location of the file browser (for new windows). E.g.: defaults write com.macromates.TextMate.preview initialFileBrowserURL "file://$HOME/Source/"
.
Default location for mate
is now /usr/local/bin
(if it exists) as this is included in the PATH
for most users.
Fix failure to install mate
when the install path existed as a dead symbolic link.
Fix issues with involuntary (recursive) expansion of file browser.
Support transparent backgrounds in themes.
Exclude binary matches for folder searching.
It’s now possible to change case in the file browser (previously a “file exists” error was shown for case-insensitive systems).
Fix issue with the txmt:
URL scheme (though omitting the file
parameter is still not supported).
callback.application.did-(de)activate
semantic classes.htmlOutputPlacement
defaults value can now be set to right
to get the split to the right of the document. The width is presently not persisted across relaunches (and defaults to 100px).Introduced callback.application.did-activate
and callback.application.did-deactivate
as two new semantic classes. A command with this class will be executed when the application gain/lose focus. The scope selector is matched against the “current scope” of the visible document (in each window). This allows creating a command with “Save” set to “Modified Documents” and thereby recreating TextMate 1.x’s ability to save modified documents on lost focus.
The approach in 2.0 also allows to run some code, for example reloading the currently open browsers, and it can be scoped e.g. to text.html
to only have the “save on lost focus” enabled when editing HTML files — alternatively one can introduce a custom scope like attr.save-on-deactivate
and set that for specific projects via a scopeAttributes
setting in .tm_properties
.
Tab bar can be made always visible: defaults write com.macromates.TextMate.preview disableTabBarCollapsing -bool YES
.
Fix issue with indented soft wrap having the prefix string wider than the wrap column.
Fix issue with selection sent to commands needing entire document (e.g. ⌘R for Ruby, Python, etc.).
Fix issue with ⌃⇥ not always working to move focus to file browser.
Remove folding patterns from grammar template.
defaults write com.macromates.TextMate.preview htmlOutputPlacement window
.defaults write com.macromates.TextMate.preview disableAntiAlias -bool YES
.defaults write com.macromates.TextMate.preview fileBrowserPlacement right
.<CR>
) on the general clipboard are converted to regular newlines when pasting.TM_HG
and TM_GIT
in Preferences is no longer eclipsed by the default properties (which set them to point at /opt/local/bin
).rm -rf
).Notable changes since to TextMate 1.5.10:
Multiple carets / discontinuous selection
The easiest way to get multiple carets is by doing a left or right movement command (like arrow left/right) with a column selection. You can also ⌘-click to place new carets or use Edit → Find All (⌥⌘F).
Snippets
New syntax for pop-up menus: ${1|first,second,…,last|}
. In a Git commit message try fixup⇥ to get a pop-up of your last 10 commit messages (for a fixup!
-commit) or between @interface
…@end
in Objective-C you can try prop⇥ to get a @property
-declaration with pop-up for its access type.
Snippets can be nested, a frequent request but it does cause a few false firings of snippets which we haven’t yet found a good solution for.
Movement / Selection
Text is classified into units which you can change with the characterClass
(scope) setting. For example a C string with %1$ld\n
has only two units (%1$ld
and \n
) for the purpose of selection (Select → Word or double click), word movement (⌥⇠/⌥⇢), and other functions that rely on character types.
TextMate 1.x has Select → Block (⇧⌘B) where a block is found using scope-defined paired characters such as braces, brackets, etc. In 2.0 you can move to begin/end of such block with ⌃⇡/⌃⇣ and the paired characters can be strings (planned to be patterns).
Whenever you select a unit (like anything in the Edit → Select submenu) the selection is “unanchored”, meaning it can be extended to either the left or right side. A minor thing but I find it surprisingly useful, e.g. to select foo(bar‸)
we first select the parenthesis with ⇧⌘B and then extend left by one unit with ⌥⇧⇠, previously you couldn’t be sure the last step would extend or simply move the selection end point.
Themes
There now is the ability to change font and font size per scope. So you’ll (by default) see that headings in markup are shown with a larger (non-fixed width) font.
You can also change soft wrap on a per-line basis, so soft wrap is e.g. disabled (by default) for diffs embedded in Git commit messages, raw (code) blocks embedded in markup, and enabled for line comments in source.
Soft wrap can be indented. This is also based on scoped settings so list items in markup are indented differently than line comments in source.
Foldings
Foldings have been taken out of grammars and are now per-line (via scoped settings). In addition there are two new patterns to allow folding indented blocks.
Indent
TextMate is more aggressive about doing indent corrections. This works great when the patterns are well-calibrated but can be disabled with the disableIndentCorrections
scope-setting. This setting also change the behavior of re-indented paste to a heuristic that works much better with Python (for which indent corrections are disabled by default).
Folder specific settings
Variables and some settings can be set on a folder / file-type basis.
Project drawer
The project drawer has been replaced with a file browser sidebar. This file browser has most Finder functions (labels, duplicate, etc.) and does SCM-badging, presently only for Subversion, Git, and Mercurial. In addition it has support for running commands (although somewhat proof-of-concept ATM) and can also do custom data sources, the API is not yet public but an SCM Status data source is included (the smart folder icon) which show SCM status for the current project. This data source works great together with the various SCM bundles.
Buffer completion
This has been improved to work with the existing word suffix (in addition to prefix), use the new character class system, etc.
Shell invocation
Preferences → Terminal allows you to install mate
which has a few new options and work when called as sudo mate
. In addition you’ll find rmate
which is a ruby implementation that you can use on a server over ssh.
Search in project / folder
Revamped the old “Find in Folder” and merged it with the regular find dialog. It’s now asynchronous, a lot faster, and more flexible.
Format strings
Format strings are ubiquitous in TextMate 2. Even scopes in grammars are format strings (allowing you to capture document content for use in scopes) and format strings are more powerful than the 1.x variant.
Scopes
Scopes now contain info beyond document context. For example the attr.scm
scopes give info about the current file’s SCM status, allowing using same key equivalent for different SCM systems.
The dyn
scopes give info such as “is there a selection” (allowing to change key bindings only when there is or isn’t a selection), an example of this is overloading {
to “wrap selection” (nicely), but leave the key alone when there is no selection. Another use-case could be to change tab to shift the text right (indent) only when there is a selection (common user request that I don’t plan to make native behavior).
You can also add your own stuff to the scope via the file and folder specific settings which allows e.g. adding attr.test
to your unit tests and overload ⌘R for that scope or have certain snippets only fire in that scope (e.g. we have a main⇥ snippet for C which inserts the venerable main function — makes sense to overload this for (C) unit tests, which generally would be regular C files).
Scope selectors
The caret is actually between two scopes, the left and right characters scope. In 2.0 we finally allow you to explicitly target either side (or both), making the firing of certain overloads more correct. There are also a few other new things related to scope selectors, but a lot of it is still only implemented in the parser, so will delay the thorough explanation of this.
Commands
Commands can require other bundles which allow them to reference support files in the required bundle. They can also declare which shell commands they need which means better error handling and also having TextMate try to find the required commands. Failing commands result in more graceful error dialogs. The output options for a command has been split into location and format. Commands can run without a document.
Grammars
Grammars can be injected into existing scopes, for example there are now grammars for marking URLs, TODO
, and similar which are injected into comments and other appropriate places.
Various other things related to parsing which require its own post.
Semantic classes
Bundle items can now be assigned a semantic class. This allows us to query for e.g. action.build || action.run
(for current scope) to find an appropriate build command (with a run command as fallback). The advantage of this is manyfold: ability to do tool bars, palettes, and unified key bindings, for example we have a single proxy item bound to ⌘Y which does a query for action.scm
finding all the SCM actions relevant for the current scope (remember scope now include SCM info, making it pick the proper SCM system).
Proxy items are a new construct but still at the proof-of-concept level, so more about this later.
TextMate itself will also do queries at various times, for example when opening a file it queries for import commands, where we include several to decompile AppleScript, pretty-print binary property lists, and similar. It also uses this system on save, so by default we now make new scripts with a shebang executable after save.
Like proxy items, this system is in its infancy.
Managed bundles
When you open a file type for which you have no bundle, you’ll be asked to install one (if TextMate knows of one). Bundles are automatically kept up to date and you can see installed bundles (and install more) in Preferences → Bundles.
Session restore
TextMate restores the full session which includes unsaved changes incase of abnormal exit. Hold shift (⇧) during launch to bypass.
Foreign Input Modes
Display of CJK and “advanced” input modes is now be supported (although only limited testing has been done).