Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Initial commit

  • Loading branch information...
commit 9894969e677c39007c2860f09e3f8235d3cde1ac 0 parents
Allan Odgaard sorbits authored
Showing with 39,574 additions and 0 deletions.
  1. +4 −0 .gitignore
  2. +21 −0 .gitmodules
  3. +40 −0 .tm_properties
  4. +1 −0  Applications/.tm_properties
  5. BIN  Applications/NewApplication/resources/English.lproj/InfoPlist.strings
  6. +3,111 −0 Applications/NewApplication/resources/English.lproj/MainMenu.xib
  7. +20 −0 Applications/NewApplication/resources/Info.plist
  8. +4 −0 Applications/NewApplication/src/MyView.h
  9. +8 −0 Applications/NewApplication/src/MyView.mm
  10. +7 −0 Applications/NewApplication/src/main.mm
  11. +4 −0 Applications/NewApplication/target
  12. +98 −0 Applications/PrivilegedTool/src/CFxx.h
  13. +126 −0 Applications/PrivilegedTool/src/install.cc
  14. +7 −0 Applications/PrivilegedTool/src/install.h
  15. +39 −0 Applications/PrivilegedTool/src/launchd.cc
  16. +6 −0 Applications/PrivilegedTool/src/launchd.h
  17. +216 −0 Applications/PrivilegedTool/src/main.cc
  18. +2 −0  Applications/PrivilegedTool/target
  19. +1 −0  Applications/TextMate/icons
  20. +2 −0  Applications/TextMate/references.md
  21. +39 −0 Applications/TextMate/resources/Credits.md
  22. +31 −0 Applications/TextMate/resources/Default.tmProperties
  23. +286 −0 Applications/TextMate/resources/English.lproj/CreditsWindow.xib
  24. BIN  Applications/TextMate/resources/English.lproj/InfoPlist.strings
  25. +7,195 −0 Applications/TextMate/resources/English.lproj/MainMenu.xib
  26. +80 −0 Applications/TextMate/resources/English.lproj/TextMate Help/TextMate.md
  27. +37 −0 Applications/TextMate/resources/English.lproj/TextMate Help/bundle_dependencies.md
  28. +10 −0 Applications/TextMate/resources/English.lproj/TextMate Help/css/stylesheet.css
  29. +13 −0 Applications/TextMate/resources/English.lproj/TextMate Help/events.md
  30. +38 −0 Applications/TextMate/resources/English.lproj/TextMate Help/format_string_syntax.md
  31. +25 −0 Applications/TextMate/resources/English.lproj/TextMate Help/glob_string_syntax.md
  32. BIN  Applications/TextMate/resources/English.lproj/TextMate Help/images/terminal_preferences.png
  33. BIN  Applications/TextMate/resources/English.lproj/TextMate Help/images/tm_small.png
  34. +52 −0 Applications/TextMate/resources/English.lproj/TextMate Help/javascript_object.md
  35. +11 −0 Applications/TextMate/resources/English.lproj/TextMate Help/load_encoding.md
  36. +254 −0 Applications/TextMate/resources/English.lproj/TextMate Help/mate_and_rmate.md
  37. +21 −0 Applications/TextMate/resources/English.lproj/TextMate Help/non-content_scopes.md
  38. +65 −0 Applications/TextMate/resources/English.lproj/TextMate Help/properties.md
  39. +14 −0 Applications/TextMate/resources/English.lproj/TextMate Help/scope_selector_syntax.md
  40. +16 −0 Applications/TextMate/resources/English.lproj/TextMate Help/selection_string_syntax.md
  41. +546 −0 Applications/TextMate/resources/Info.plist
  42. +59 −0 Applications/TextMate/resources/KeyBindings.dict
  43. +223 −0 Applications/TextMate/resources/ReleaseNotes.md
  44. +23 −0 Applications/TextMate/resources/TextMate.scriptSuite
  45. +18 −0 Applications/TextMate/resources/TextMate.scriptTerminology
  46. +88 −0 Applications/TextMate/src/AppController Commands.mm
  47. +193 −0 Applications/TextMate/src/AppController Documents.mm
  48. +215 −0 Applications/TextMate/src/AppController Menus.mm
  49. +54 −0 Applications/TextMate/src/AppController.h
  50. +234 −0 Applications/TextMate/src/AppController.mm
  51. +13 −0 Applications/TextMate/src/AppStartup.h
  52. +162 −0 Applications/TextMate/src/AppStartup.mm
  53. +11 −0 Applications/TextMate/src/CreditsWindowController.h
  54. +43 −0 Applications/TextMate/src/CreditsWindowController.mm
  55. +16 −0 Applications/TextMate/src/Favorites.h
  56. +157 −0 Applications/TextMate/src/Favorites.mm
  57. +18 −0 Applications/TextMate/src/GetURLScriptCommand.mm
  58. +184 −0 Applications/TextMate/src/ODBEditorSuite.cc
  59. +34 −0 Applications/TextMate/src/ODBEditorSuite.h
  60. +590 −0 Applications/TextMate/src/RMateServer.cc
  61. +6 −0 Applications/TextMate/src/RMateServer.h
  62. +12 −0 Applications/TextMate/src/TMPlugInController.h
  63. +246 −0 Applications/TextMate/src/TMPlugInController.mm
  64. +80 −0 Applications/TextMate/src/main.mm
  65. +64 −0 Applications/TextMate/support/Bundles/Avian.tmbundle/Commands/Compress Selected Items.tmCommand
  66. +40 −0 Applications/TextMate/support/Bundles/Avian.tmbundle/Commands/Decrypt.tmCommand
  67. +40 −0 Applications/TextMate/support/Bundles/Avian.tmbundle/Commands/Encrypt on Save.tmCommand
  68. +45 −0 Applications/TextMate/support/Bundles/Avian.tmbundle/Commands/Export TM Command.tmCommand
  69. +34 −0 Applications/TextMate/support/Bundles/Avian.tmbundle/Commands/Import BZip2.tmCommand
  70. +34 −0 Applications/TextMate/support/Bundles/Avian.tmbundle/Commands/Import GZip.tmCommand
  71. +35 −0 Applications/TextMate/support/Bundles/Avian.tmbundle/Commands/Import PNG Image.tmCommand
  72. +75 −0 Applications/TextMate/support/Bundles/Avian.tmbundle/Commands/Import TM Commands.tmCommand
  73. +35 −0 Applications/TextMate/support/Bundles/Avian.tmbundle/Commands/Open Target File.tmCommand
  74. +26 −0 Applications/TextMate/support/Bundles/Avian.tmbundle/Commands/SCM Warning (Git).tmCommand
  75. +26 −0 Applications/TextMate/support/Bundles/Avian.tmbundle/Commands/SCM Warning (Subversion).tmCommand
  76. +41 −0 Applications/TextMate/support/Bundles/Avian.tmbundle/Commands/Show Images.tmCommand
  77. +32 −0 Applications/TextMate/support/Bundles/Avian.tmbundle/info.plist
  78. +11 −0 Applications/TextMate/target
  79. +2 −0  Applications/TextMate/templates/footer.html
  80. +21 −0 Applications/TextMate/templates/header.html
  81. +1 −0  Applications/bl/.tm_properties
  82. +306 −0 Applications/bl/src/bl.cc
  83. +2 −0  Applications/bl/target
  84. +24 −0 Applications/decompile_as/src/decompile_as.mm
  85. +2 −0  Applications/decompile_as/target
  86. +175 −0 Applications/gtm/src/gtm.cc
  87. +2 −0  Applications/gtm/target
  88. +118 −0 Applications/indent/src/indent.cc
  89. +2 −0  Applications/indent/target
  90. +415 −0 Applications/mate/src/mate.cc
  91. +3 −0  Applications/mate/target
  92. +90 −0 Applications/pretty_plist/src/pretty_plist.cc
  93. +2 −0  Applications/pretty_plist/target
  94. +67 −0 Applications/scmls/src/scmls.cc
  95. +2 −0  Applications/scmls/target
  96. +3 −0  Applications/target
  97. +12 −0 COPYING
  98. BIN  Frameworks/BundleEditor/gfx/Bundle Item Icons/Bundle.png
  99. BIN  Frameworks/BundleEditor/gfx/Bundle Item Icons/Command.png
  100. BIN  Frameworks/BundleEditor/gfx/Bundle Item Icons/Drag Command.png
  101. BIN  Frameworks/BundleEditor/gfx/Bundle Item Icons/Grammar.png
  102. BIN  Frameworks/BundleEditor/gfx/Bundle Item Icons/Macro.png
  103. +1 −0  Frameworks/BundleEditor/gfx/Bundle Item Icons/Proxy.png
  104. BIN  Frameworks/BundleEditor/gfx/Bundle Item Icons/Settings.png
  105. BIN  Frameworks/BundleEditor/gfx/Bundle Item Icons/Snippet.png
  106. BIN  Frameworks/BundleEditor/gfx/Bundle Item Icons/Theme.png
  107. +395 −0 Frameworks/BundleEditor/resources/English.lproj/BundleEditor.xib
  108. +648 −0 Frameworks/BundleEditor/resources/English.lproj/BundleProperties.xib
  109. +1,837 −0 Frameworks/BundleEditor/resources/English.lproj/CommandProperties.xib
  110. +671 −0 Frameworks/BundleEditor/resources/English.lproj/FileDropProperties.xib
  111. +993 −0 Frameworks/BundleEditor/resources/English.lproj/GrammarProperties.xib
  112. +315 −0 Frameworks/BundleEditor/resources/English.lproj/MacroProperties.xib
  113. +817 −0 Frameworks/BundleEditor/resources/English.lproj/SharedProperties.xib
  114. +315 −0 Frameworks/BundleEditor/resources/English.lproj/SnippetProperties.xib
  115. +471 −0 Frameworks/BundleEditor/resources/English.lproj/ThemeProperties.xib
  116. +26 −0 Frameworks/BundleEditor/resources/Info.plist
  117. +32 −0 Frameworks/BundleEditor/src/BundleEditor.h
  118. +733 −0 Frameworks/BundleEditor/src/BundleEditor.mm
  119. +5 −0 Frameworks/BundleEditor/src/OakRot13Transformer.h
  120. +11 −0 Frameworks/BundleEditor/src/OakRot13Transformer.mm
  121. +13 −0 Frameworks/BundleEditor/src/PropertiesViewController.h
  122. +31 −0 Frameworks/BundleEditor/src/PropertiesViewController.mm
  123. +152 −0 Frameworks/BundleEditor/src/be_entry.cc
  124. +50 −0 Frameworks/BundleEditor/src/be_entry.h
  125. +5 −0 Frameworks/BundleEditor/target
  126. +5 −0 Frameworks/BundleEditor/templates/Bundle.plist
  127. +2 −0  Frameworks/BundleEditor/templates/Command.plist
  128. +4 −0 Frameworks/BundleEditor/templates/Drag Command.plist
  129. +17 −0 Frameworks/BundleEditor/templates/Grammar.plist
  130. +1 −0  Frameworks/BundleEditor/templates/Proxy.plist
  131. +2 −0  Frameworks/BundleEditor/templates/Settings.plist
  132. +2 −0  Frameworks/BundleEditor/templates/Snippet.plist
  133. +32 −0 Frameworks/BundleEditor/templates/Theme.plist
  134. +37 −0 Frameworks/BundlesManager/src/BundlesManager.h
  135. +273 −0 Frameworks/BundlesManager/src/BundlesManager.mm
  136. +4 −0 Frameworks/BundlesManager/target
  137. +449 −0 Frameworks/CrashReporter/bin/symbolicate
  138. +6 −0 Frameworks/CrashReporter/src/CrashReporter.h
  139. +133 −0 Frameworks/CrashReporter/src/CrashReporter.mm
  140. +41 −0 Frameworks/CrashReporter/src/find_reports.cc
  141. +8 −0 Frameworks/CrashReporter/src/find_reports.h
  142. +5 −0 Frameworks/CrashReporter/target
  143. BIN  Frameworks/DocumentWindow/resources/BottomBar.tiff
  144. +621 −0 Frameworks/DocumentWindow/resources/English.lproj/Document.xib
  145. +791 −0 Frameworks/DocumentWindow/resources/English.lproj/EncodingView.xib
  146. +1,290 −0 Frameworks/DocumentWindow/resources/English.lproj/FileTypeDialog.xib
  147. +26 −0 Frameworks/DocumentWindow/resources/Info.plist
  148. BIN  Frameworks/DocumentWindow/resources/SplitViewThumb.tiff
  149. +11 −0 Frameworks/DocumentWindow/src/DocumentCommand.h
  150. +334 −0 Frameworks/DocumentWindow/src/DocumentCommand.mm
  151. +111 −0 Frameworks/DocumentWindow/src/DocumentController.h
  152. +1,417 −0 Frameworks/DocumentWindow/src/DocumentController.mm
  153. +18 −0 Frameworks/DocumentWindow/src/DocumentOpenHelper.h
  154. +136 −0 Frameworks/DocumentWindow/src/DocumentOpenHelper.mm
  155. +23 −0 Frameworks/DocumentWindow/src/DocumentSaveHelper.h
  156. +246 −0 Frameworks/DocumentWindow/src/DocumentSaveHelper.mm
  157. +83 −0 Frameworks/DocumentWindow/src/DocumentTabs.h
  158. +508 −0 Frameworks/DocumentWindow/src/DocumentTabs.mm
  159. +13 −0 Frameworks/DocumentWindow/src/EncodingView.h
  160. +36 −0 Frameworks/DocumentWindow/src/EncodingView.mm
  161. +66 −0 Frameworks/DocumentWindow/src/FileTypeDialog.h
  162. +257 −0 Frameworks/DocumentWindow/src/FileTypeDialog.mm
  163. +5 −0 Frameworks/DocumentWindow/target
  164. BIN  Frameworks/Find/resources/Down Arrow Pressed.png
  165. BIN  Frameworks/Find/resources/Down Arrow.png
  166. BIN  Frameworks/Find/resources/English.lproj/Find.strings
  167. +3,053 −0 Frameworks/Find/resources/English.lproj/Find.xib
  168. BIN  Frameworks/Find/resources/Gear.png
  169. +26 −0 Frameworks/Find/resources/Info.plist
  170. BIN  Frameworks/Find/resources/Right Arrow Pressed.png
  171. BIN  Frameworks/Find/resources/Right Arrow.png
  172. +89 −0 Frameworks/Find/src/FFDocumentSearch.h
  173. +364 −0 Frameworks/Find/src/FFDocumentSearch.mm
  174. +15 −0 Frameworks/Find/src/FFFilePathCell.h
  175. +132 −0 Frameworks/Find/src/FFFilePathCell.mm
  176. +15 −0 Frameworks/Find/src/FFFindResultsContainerView.mm
  177. +15 −0 Frameworks/Find/src/FFFindWindow.h
  178. +141 −0 Frameworks/Find/src/FFFindWindow.mm
  179. +9 −0 Frameworks/Find/src/FFFolderMenu.h
  180. +205 −0 Frameworks/Find/src/FFFolderMenu.mm
  181. +120 −0 Frameworks/Find/src/FFWindowController.h
  182. +1,204 −0 Frameworks/Find/src/FFWindowController.mm
  183. +50 −0 Frameworks/Find/src/Find.h
  184. +452 −0 Frameworks/Find/src/Find.mm
  185. +26 −0 Frameworks/Find/src/Strings.h
  186. +274 −0 Frameworks/Find/src/scan_path.cc
  187. +102 −0 Frameworks/Find/src/scan_path.h
  188. +6 −0 Frameworks/Find/target
  189. +161 −0 Frameworks/Find/tests/t_scan_path.cc
  190. +26 −0 Frameworks/HTMLOutput/resources/Info.plist
  191. BIN  Frameworks/HTMLOutput/resources/Left Arrow Pressed.png
  192. BIN  Frameworks/HTMLOutput/resources/Left Arrow.png
  193. BIN  Frameworks/HTMLOutput/resources/Right Arrow Pressed.png
  194. BIN  Frameworks/HTMLOutput/resources/Right Arrow.png
  195. +20 −0 Frameworks/HTMLOutput/resources/error_not_found.html
  196. +17 −0 Frameworks/HTMLOutput/src/HTMLOutput.h
  197. +184 −0 Frameworks/HTMLOutput/src/HTMLOutput.mm
  198. +14 −0 Frameworks/HTMLOutput/src/OakHTMLOutputView.h
  199. +87 −0 Frameworks/HTMLOutput/src/OakHTMLOutputView.mm
  200. +16 −0 Frameworks/HTMLOutput/src/browser/HOBrowserView.h
  201. +101 −0 Frameworks/HTMLOutput/src/browser/HOBrowserView.mm
  202. +27 −0 Frameworks/HTMLOutput/src/browser/HOStatusBar.h
  203. +95 −0 Frameworks/HTMLOutput/src/browser/HOStatusBar.mm
  204. +13 −0 Frameworks/HTMLOutput/src/browser/HOWebViewDelegateHelper.h
  205. +140 −0 Frameworks/HTMLOutput/src/browser/HOWebViewDelegateHelper.mm
  206. +7 −0 Frameworks/HTMLOutput/src/helpers/HOAutoScroll.h
  207. +85 −0 Frameworks/HTMLOutput/src/helpers/HOAutoScroll.mm
  208. +18 −0 Frameworks/HTMLOutput/src/helpers/HOJSBridge.h
  209. +421 −0 Frameworks/HTMLOutput/src/helpers/HOJSBridge.mm
  210. +97 −0 Frameworks/HTMLOutput/src/helpers/WebView Additions.mm
  211. +5 −0 Frameworks/HTMLOutput/target
  212. +14 −0 Frameworks/HTMLOutputWindow/src/HTMLOutputWindow.h
  213. +117 −0 Frameworks/HTMLOutputWindow/src/HTMLOutputWindow.mm
  214. +4 −0 Frameworks/HTMLOutputWindow/target
  215. BIN  Frameworks/OakAppKit/gfx/SCM Badges/Added.icns
  216. BIN  Frameworks/OakAppKit/gfx/SCM Badges/Conflicted.icns
  217. BIN  Frameworks/OakAppKit/gfx/SCM Badges/Deleted.icns
  218. BIN  Frameworks/OakAppKit/gfx/SCM Badges/Modified.icns
  219. BIN  Frameworks/OakAppKit/gfx/SCM Badges/Unversioned.icns
  220. BIN  Frameworks/OakAppKit/gfx/SpellingDot.tiff
  221. BIN  Frameworks/OakAppKit/gfx/Statusbar Background Pressed.png
  222. BIN  Frameworks/OakAppKit/gfx/Statusbar Background.png
  223. BIN  Frameworks/OakAppKit/gfx/Statusbar Dropdown Arrow.tiff
  224. BIN  Frameworks/OakAppKit/gfx/Statusbar Popup Arrows.png
  225. BIN  Frameworks/OakAppKit/gfx/Statusbar Separator.png
  226. BIN  Frameworks/OakAppKit/gfx/TabClose.png
  227. BIN  Frameworks/OakAppKit/gfx/TabClose_Modified.png
  228. BIN  Frameworks/OakAppKit/gfx/TabClose_ModifiedPressed.png
  229. BIN  Frameworks/OakAppKit/gfx/TabClose_ModifiedRollover.png
  230. BIN  Frameworks/OakAppKit/gfx/TabClose_Pressed.png
  231. BIN  Frameworks/OakAppKit/gfx/TabClose_Rollover.png
  232. BIN  Frameworks/OakAppKit/icons/Blank.icns
  233. BIN  Frameworks/OakAppKit/icons/angle_brackets_brown.icns
  234. BIN  Frameworks/OakAppKit/icons/angle_brackets_green.icns
  235. +28 −0 Frameworks/OakAppKit/icons/bindings.plist
  236. BIN  Frameworks/OakAppKit/icons/blue.icns
  237. BIN  Frameworks/OakAppKit/icons/brackets.icns
  238. BIN  Frameworks/OakAppKit/icons/brown.icns
  239. BIN  Frameworks/OakAppKit/icons/c.icns
  240. BIN  Frameworks/OakAppKit/icons/charcoal.icns
  241. BIN  Frameworks/OakAppKit/icons/config_file.icns
  242. BIN  Frameworks/OakAppKit/icons/green.icns
  243. BIN  Frameworks/OakAppKit/icons/grey.icns
  244. BIN  Frameworks/OakAppKit/icons/grid.icns
  245. BIN  Frameworks/OakAppKit/icons/header.icns
  246. BIN  Frameworks/OakAppKit/icons/javascript.icns
  247. BIN  Frameworks/OakAppKit/icons/latex.icns
  248. BIN  Frameworks/OakAppKit/icons/latex_alt.icns
  249. BIN  Frameworks/OakAppKit/icons/list.icns
  250. BIN  Frameworks/OakAppKit/icons/log.icns
  251. BIN  Frameworks/OakAppKit/icons/orange.icns
  252. BIN  Frameworks/OakAppKit/icons/purple.icns
  253. BIN  Frameworks/OakAppKit/icons/python.icns
  254. BIN  Frameworks/OakAppKit/icons/red.icns
  255. BIN  Frameworks/OakAppKit/icons/ruby.icns
  256. BIN  Frameworks/OakAppKit/icons/structured_text.icns
  257. BIN  Frameworks/OakAppKit/icons/template.icns
  258. BIN  Frameworks/OakAppKit/icons/text.icns
  259. BIN  Frameworks/OakAppKit/icons/tree_structure.icns
  260. BIN  Frameworks/OakAppKit/icons/web.icns
  261. BIN  Frameworks/OakAppKit/icons/yellow.icns
  262. +129 −0 Frameworks/OakAppKit/resources/Charsets.plist
Sorry, we could not display the entire diff because too many files (1,102) changed.
4 .gitignore
@@ -0,0 +1,4 @@
+build
+build.ninja
+cache
+Applications/TextMate/resources/DefaultBundles.tbz
21 .gitmodules
@@ -0,0 +1,21 @@
+[submodule "bin/CxxTest"]
+ path = bin/CxxTest
+ url = git://github.com/textmate/cxxtest.git
+[submodule "vendor/MASPreferences/vendor"]
+ path = vendor/MASPreferences/vendor
+ url = git://github.com/textmate/MASPreferences.git
+[submodule "rmate"]
+ path = rmate
+ url = git://github.com/textmate/rmate.git
+[submodule "vendor/MGScopeBar/vendor"]
+ path = vendor/MGScopeBar/vendor
+ url = git://github.com/textmate/MGScopeBar.git
+[submodule "Applications/TextMate/icons"]
+ path = Applications/TextMate/icons
+ url = git://github.com/textmate/document-icons.git
+[submodule "PlugIns/dialog-1.x"]
+ path = PlugIns/dialog-1.x
+ url = git://github.com/textmate/dialog-1.x.git
+[submodule "PlugIns/dialog"]
+ path = PlugIns/dialog
+ url = git://github.com/textmate/dialog.git
40 .tm_properties
@@ -0,0 +1,40 @@
+# Settings
+projectDirectory = "$CWD"
+windowTitle = "$TM_DISPLAYNAME — ${CWD/^.*\///} ($TM_SCM_BRANCH)"
+excludeInFileChooser = "{$exclude,*.xib}"
+
+# Variables
+TM_ORGANIZATION_NAME = 'MacroMates'
+
+TM_TODO_IGNORE = '/(disabled(-src)?|onig-.*|build|cache|CxxTest|(FScript|BWToolkitFramework).framework)/'
+
+TM_CXX_FLAGS = '$TM_CXX_FLAGS -I"$CWD/Shared/include" -I"${builddir:-$HOME/build/TextMate}/include"'
+TM_OBJCXX_FLAGS = '$TM_OBJCXX_FLAGS -I"$CWD/Shared/include" -I"${builddir:-$HOME/build/TextMate}/include"'
+
+TM_NINJA_FILE = '${CWD}/build.ninja'
+TM_NINJA_TARGET = 'TextMate/run'
+
+[ "source.c++, source.objc++" ]
+tabSize = 3
+
+[ target ]
+fileType = "source.tm-properties"
+
+[ *.{h,pch} ]
+fileType = "source.objc++"
+
+[ Makefile.* ]
+fileType = "source.makefile"
+
+[ attr.untitled ]
+fileType = 'source.c++'
+
+[ "tests/*.{cc,mm}" ]
+scopeAttributes = 'attr.project.ninja attr.test.cxxtest'
+TM_NINJA_TARGET = '${TM_FILEPATH/^.*?([^\/]*)\/tests\/.*$/$1/}'
+
+[ "tests/t_*.mm" ]
+GUI_TESTS = '${TM_FILENAME/^t_(.*)\.mm$/$1/}'
+
+[ "rmate/*" ]
+TM_MAKE_TARGET = rmate
1  Applications/.tm_properties
@@ -0,0 +1 @@
+TM_NINJA_TARGET = '${TM_DIRECTORY/^.*\/Applications\/([^\/]+)(\/.*)?$/$1\/run/}'
BIN  Applications/NewApplication/resources/English.lproj/InfoPlist.strings
Binary file not shown
3,111 Applications/NewApplication/resources/English.lproj/MainMenu.xib
3,111 additions, 0 deletions not shown
20 Applications/NewApplication/resources/Info.plist
@@ -0,0 +1,20 @@
+{ CFBundleName = "${TARGET_NAME}";
+ CFBundleVersion = "1.0";
+ CFBundleIdentifier = "org.example.${TARGET_NAME}";
+
+ CFBundleExecutable = "${TARGET_NAME}";
+ CFBundleIconFile = "";
+
+ // CFBundleHelpBookName
+ // CFBundleHelpBookFolder
+ // LSMinimumSystemVersion
+ // NSContactsUsageDescription
+
+ CFBundleDevelopmentRegion = "English";
+ CFBundleInfoDictionaryVersion = "6.0";
+ CFBundlePackageType = "APPL";
+ CFBundleSignature = "????";
+
+ NSMainNibFile = "MainMenu";
+ NSPrincipalClass = "NSApplication";
+}
4 Applications/NewApplication/src/MyView.h
@@ -0,0 +1,4 @@
+@interface MyView : NSView
+{
+}
+@end
8 Applications/NewApplication/src/MyView.mm
@@ -0,0 +1,8 @@
+#import "MyView.h"
+
+@implementation MyView
+- (void)drawRect:(NSRect)aRect
+{
+ NSEraseRect(aRect);
+}
+@end
7 Applications/NewApplication/src/main.mm
@@ -0,0 +1,7 @@
+#import <OakSystem/application.h>
+
+int main (int argc, char const* argv[])
+{
+ oak::application_t app(argc, argv);
+ return NSApplicationMain(argc, argv);
+}
4 Applications/NewApplication/target
@@ -0,0 +1,4 @@
+SOURCES = src/*.{cc,mm}
+CP_Resources = resources/*
+LINK += OakFoundation OakAppKit OakSystem
+FRAMEWORKS = Cocoa
98 Applications/PrivilegedTool/src/CFxx.h
@@ -0,0 +1,98 @@
+#ifndef OAK_CFXX_H_PA9RZ6MB
+#define OAK_CFXX_H_PA9RZ6MB
+
+namespace cf
+{
+ template <typename T = CFTypeRef>
+ struct value
+ {
+ value (T value = NULL) : cf_value(value) { retain(); }
+ value (value const& rhs) : cf_value(rhs.cf_value) { retain(); }
+ ~value () { release(); }
+ value& operator= (value const& rhs) { reset(rhs.cf_value); return *this; }
+
+ void reset (T value = NULL)
+ {
+ if(value != cf_value)
+ {
+ release();
+ cf_value = value;
+ retain();
+ }
+ }
+
+ EXPLICIT operator bool () const { return cf_value != NULL; }
+ operator T () const { return cf_value; }
+ operator T () { return cf_value; }
+
+ protected:
+ T cf_value;
+
+ private:
+ void retain () { if(cf_value) CFRetain(cf_value); }
+ void release () { if(cf_value) CFRelease(cf_value); }
+ };
+
+ struct data : value<CFDataRef>
+ {
+ data (void const* first, void const* last) { reset(CFDataCreate(kCFAllocatorDefault, (UInt8*)first, (UInt8*)last - (UInt8*)first)); }
+ };
+
+ struct string : value<CFStringRef>
+ {
+ string (const char* str) { reset(CFStringCreateWithBytes(kCFAllocatorDefault, (UInt8*)str, strlen(str), kCFStringEncodingUTF8, false)); }
+ string (std::string const& str) { reset(CFStringCreateWithBytes(kCFAllocatorDefault, (UInt8*)str.data(), str.size(), kCFStringEncodingUTF8, false)); }
+ };
+
+ struct dict_helper;
+
+ struct dictionary : value<CFMutableDictionaryRef>
+ {
+ dictionary () { reset(CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks)); }
+
+ dict_helper operator[] (string const& key);
+ dict_helper operator[] (const char* key);
+ };
+
+ struct dict_helper
+ {
+ cf::value<> operator= (CFTypeRef const& value)
+ {
+ CFDictionarySetValue(dict, key, value);
+ return value;
+ }
+
+ private:
+ friend struct dictionary;
+ dict_helper (dictionary const& dict, string const& key) : dict(dict), key(key) { }
+ dictionary dict;
+ string key;
+ };
+
+ inline dict_helper dictionary::operator[] (string const& key) { return dict_helper(*this, key); }
+ inline dict_helper dictionary::operator[] (const char* key) { return dict_helper(*this, cf::string(key)); }
+
+ struct array : value<CFMutableArrayRef>
+ {
+ array () { reset(CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks)); }
+ size_t size () const { return CFArrayGetCount(cf_value); }
+ bool empty () const { return size() == 0; }
+
+ array& operator<< (CFTypeRef const& value)
+ {
+ CFArrayAppendValue(cf_value, value);
+ return *this;
+ }
+ };
+
+ struct number : value<CFNumberRef>
+ {
+ number (int flag)
+ {
+ reset(CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &flag));
+ }
+ };
+
+} /* cf */
+
+#endif /* end of include guard: OAK_CFXX_H_PA9RZ6MB */
126 Applications/PrivilegedTool/src/install.cc
@@ -0,0 +1,126 @@
+#include "install.h"
+#include "CFxx.h"
+#include <text/format.h>
+#include <io/io.h>
+#include <authorization/constants.h>
+
+static const char* kPlistFormatString =
+ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+ "<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n"
+ "<plist version=\"1.0\">\n"
+ " <dict>\n"
+ " <key>Disabled</key>\n"
+ " <false/>\n"
+ " <key>Label</key>\n"
+ " <string>%s</string>\n"
+ " <key>OnDemand</key>\n"
+ " <true/>\n"
+ " <key>ProgramArguments</key>\n"
+ " <array>\n"
+ " <string>%s</string>\n"
+ " </array>\n"
+ " <key>ServiceIPC</key>\n"
+ " <true/>\n"
+ " <key>Sockets</key>\n"
+ " <dict>\n"
+ " <key>MasterSocket</key>\n"
+ " <dict>\n"
+ " <key>SockFamily</key>\n"
+ " <string>Unix</string>\n"
+ " <key>SockPathName</key>\n"
+ " <string>%s</string>\n"
+ " <key>SockPathMode</key>\n"
+ " <integer>438</integer>\n"
+ " </dict>\n"
+ " </dict>\n"
+ " </dict>\n"
+ "</plist>\n"; // job label, tool path, socket
+
+static std::string plist_content ()
+{
+ return text::format(kPlistFormatString, kAuthJobName, kAuthToolPath, kAuthSocketPath);
+}
+
+static void launch_control (char const* command, std::string const& argument)
+{
+ pid_t pid = vfork();
+ if(pid == 0)
+ {
+ execl("/bin/launchctl", "/bin/launchctl", command, argument.c_str(), NULL);
+ perror("/bin/launchctl failed");
+ _exit(1);
+ }
+
+ int status = 0;
+ waitpid(pid, &status, 0);
+}
+
+static void remove_policy ()
+{
+ AuthorizationRef authRef;
+ if(noErr == AuthorizationCreate(NULL, kAuthorizationEmptyEnvironment, kAuthorizationFlagDefaults, &authRef))
+ {
+ AuthorizationRightRemove(authRef, kAuthRightName);
+ AuthorizationFree(authRef, kAuthorizationFlagDefaults);
+ }
+}
+
+static void add_policy ()
+{
+ remove_policy();
+
+ AuthorizationRef authRef;
+ if(noErr == AuthorizationCreate(NULL, kAuthorizationEmptyEnvironment, kAuthorizationFlagDefaults, &authRef))
+ {
+ cf::dictionary rightDefinition;
+ rightDefinition["class"] = cf::string("user");
+ rightDefinition["group"] = cf::string("admin");
+ rightDefinition["allow-root"] = CFRetain(kCFBooleanTrue);
+ rightDefinition["timeout"] = cf::number(900);
+
+ int errStatus = AuthorizationRightSet(authRef, kAuthRightName, rightDefinition, NULL /* description key */, NULL, NULL);
+ if(errStatus != noErr)
+ fprintf(stderr, "*** error adding policy (‘%s’): %d\n", kAuthRightName, errStatus);
+
+ AuthorizationFree(authRef, kAuthorizationFlagDefaults);
+ }
+}
+
+int install_tool (std::string const& toolPath)
+{
+ if(toolPath.empty() || toolPath[0] != '/')
+ {
+ fprintf(stderr, "need to be run with absolute path\n");
+ abort();
+ }
+
+ setuid(geteuid());
+ setgid(getegid());
+
+ if(!path::make_dir(path::parent(kAuthToolPath)))
+ return 1;
+ path::remove(kAuthToolPath);
+ if(!path::copy(toolPath, kAuthToolPath))
+ return 1;
+ chown(kAuthToolPath, 0, 0);
+ if(path::exists(kAuthPlistPath))
+ launch_control("unload", kAuthPlistPath);
+ if(!path::set_content(kAuthPlistPath, plist_content()))
+ return 1;
+ launch_control("load", kAuthPlistPath);
+
+ add_policy();
+ return 0;
+}
+
+int uninstall_tool ()
+{
+ remove_policy();
+ if(path::exists(kAuthPlistPath))
+ {
+ launch_control("unload", kAuthPlistPath);
+ path::remove(kAuthPlistPath);
+ }
+ path::remove(kAuthToolPath);
+ return 0;
+}
7 Applications/PrivilegedTool/src/install.h
@@ -0,0 +1,7 @@
+#ifndef PRIVILEGED_TOOL_INSTALL_H_4IAOPZ4H
+#define PRIVILEGED_TOOL_INSTALL_H_4IAOPZ4H
+
+int install_tool (std::string const& toolPath);
+int uninstall_tool ();
+
+#endif /* end of include guard: PRIVILEGED_TOOL_INSTALL_H_4IAOPZ4H */
39 Applications/PrivilegedTool/src/launchd.cc
@@ -0,0 +1,39 @@
+#include "launchd.h"
+#include <launch.h> // There is no <x-man-page://3/launch> page <rdar://7072543>
+#include <oak/debug.h>
+
+OAK_DEBUG_VAR(AuthServer_Launchd);
+
+int get_socket (launch_data_t dict, char const* name)
+{
+ launch_data_t array = launch_data_dict_lookup(dict, name);
+
+ if(array == NULL || (launch_data_get_type(array) == LAUNCH_DATA_ARRAY && launch_data_array_get_count(array) == 0))
+ {
+ D(DBF_AuthServer_Launchd, bug("no activity for %s\n", name););
+ return -1;
+ }
+
+ assert(array != NULL && launch_data_get_type(array) == LAUNCH_DATA_ARRAY);
+ D(DBF_AuthServer_Launchd, bug("handle %zu sockets (%s)", launch_data_array_get_count(array), name););
+ launch_data_t fdData = launch_data_array_get_index(array, 0);
+ D(DBF_AuthServer_Launchd, bug("data %p", fdData););
+ assert(fdData != NULL && launch_data_get_type(fdData) == LAUNCH_DATA_FD);
+ int fd = launch_data_get_fd(fdData);
+ D(DBF_AuthServer_Launchd, bug("fd %d", fd););
+ assert(fd >= 0);
+
+ return fd;
+}
+
+int launchd_sockets ()
+{
+ launch_data_t req = launch_data_new_string(LAUNCH_KEY_CHECKIN);
+ assert(req != NULL);
+ launch_data_t res = launch_msg(req);
+ assert(res != NULL && launch_data_get_type(res) == LAUNCH_DATA_DICTIONARY); // LAUNCH_DATA_ERRNO
+ launch_data_t allSockets = launch_data_dict_lookup(res, LAUNCH_JOBKEY_SOCKETS);
+ assert(allSockets != NULL && launch_data_get_type(allSockets) == LAUNCH_DATA_DICTIONARY);
+
+ return get_socket(allSockets, "MasterSocket");
+}
6 Applications/PrivilegedTool/src/launchd.h
@@ -0,0 +1,6 @@
+#ifndef LAUNCHD_H_SP1GJCZ
+#define LAUNCHD_H_SP1GJCZ
+
+int launchd_sockets ();
+
+#endif /* end of include guard: LAUNCHD_H_SP1GJCZ */
216 Applications/PrivilegedTool/src/main.cc
@@ -0,0 +1,216 @@
+#include "launchd.h"
+#include "install.h"
+#include <authorization/connection.h>
+#include <authorization/constants.h>
+#include <authorization/authorization.h>
+#include <io/io.h>
+#include <oak/debug.h>
+
+OAK_DEBUG_VAR(AuthServer);
+
+static double const AppVersion = 1.0;
+static size_t const AppRevision = APP_REVISION;
+
+extern char* optarg;
+extern int optind;
+
+static bool running = true;
+
+static void handle_signal (int theSignal)
+{
+ D(DBF_AuthServer, bug("%s\n", strsignal(theSignal)););
+ running = false;
+}
+
+static void reap_children (int theSignal)
+{
+ D(DBF_AuthServer, bug("%s\n", strsignal(theSignal)););
+ pid_t pid;
+ int status;
+ while((pid = waitpid(-1, &status, WNOHANG)) > 0)
+ {
+ D(DBF_AuthServer, bug("child %d terminated\n", pid););
+ }
+}
+
+static void version ()
+{
+ fprintf(stdout, "%1$s %2$.1f (" COMPILE_DATE " revision %3$zu)\n", getprogname(), AppVersion, AppRevision);
+}
+
+static void usage (FILE* io = stdout)
+{
+ fprintf(io,
+ "%1$s %2$.1f (" COMPILE_DATE " revision %3$zu)\n"
+ "Usage: %1$s [-siuhv]\n"
+ "Description:\n"
+ " Server for authenticated file system operations.\n"
+ "Options:\n"
+ " -s, --server Run server.\n"
+ " -i, --install Install server.\n"
+ " -u, --uninstall Uninstall server.\n"
+ " -h, --help Show this information.\n"
+ " -v, --version Print version information.\n"
+ "\n", getprogname(), AppVersion, AppRevision
+ );
+}
+
+static int setup_socket ()
+{
+ unlink(kAuthSocketPath);
+
+ int fd = socket(AF_UNIX, SOCK_STREAM, 0);
+ struct sockaddr_un addr = { 0, AF_UNIX, kAuthSocketPath };
+ addr.sun_len = SUN_LEN(&addr);
+ int rc = bind(fd, (sockaddr*)&addr, sizeof(addr));
+ chmod(kAuthSocketPath, S_IRWXU|S_IRWXG|S_IRWXO);
+ assert(rc != -1);
+ rc = listen(fd, 5);
+ assert(rc != -1);
+
+ return fd;
+}
+
+static void handle_connection (int fd)
+{
+ D(DBF_AuthServer, bug("child %d\n", getpid()););
+
+ connection_t conn(fd);
+ conn << "AuthServer" << kAuthServerMajor << kAuthServerMinor;
+
+ std::string command;
+ conn >> command;
+ D(DBF_AuthServer, bug("> %s\n", command.c_str()););
+
+ if(command == "auth")
+ {
+ std::string authString;
+ conn >> authString;
+
+ D(DBF_AuthServer, bug("> auth: %s\n", authString.c_str()););
+
+ osx::authorization_t auth(authString);
+ if(!auth.check_right(kAuthRightName))
+ {
+ D(DBF_AuthServer, bug("failed authentication\n"););
+ return;
+ }
+ }
+ else
+ {
+ D(DBF_AuthServer, bug("no authentication\n"););
+ return;
+ }
+
+ std::string action;
+ conn >> action;
+
+ D(DBF_AuthServer, bug("> %s\n", action.c_str()););
+ if(action == "read")
+ {
+ std::string path;
+ conn >> path;
+
+ conn << path::content(path) << path::attributes(path);
+ }
+ else if(action == "write")
+ {
+ std::string path, content, error = NULL_STR;
+ std::map<std::string, std::string> attributes;
+ conn >> path >> content >> attributes;
+
+ if(!path::set_content(path, content))
+ error = text::format("set_content() failed: %s", strerror(errno));
+ else if(!path::set_attributes(path, attributes))
+ error = text::format("set_attributes() failed: %s", strerror(errno));
+
+ conn << error;
+ }
+ else
+ {
+ D(DBF_AuthServer, bug("unknown action: ‘%s\n", action.c_str()););
+ }
+}
+
+static void close_socket (int fd)
+{
+ close(fd);
+ // unlink(kAuthSocketPath); // when running via launchd we do not want to remove the socket, since launchd will not re-create it if our server process is restarted
+}
+
+int main (int argc, char const* argv[])
+{
+ D(DBF_AuthServer, bug("\n"););
+
+ signal(SIGINT, &handle_signal);
+ signal(SIGTERM, &handle_signal);
+ signal(SIGCHLD, &reap_children);
+ signal(SIGPIPE, SIG_IGN);
+
+ static struct option const longopts[] = {
+ { "server", no_argument, 0, 's' },
+ { "install", no_argument, 0, 'i' },
+ { "uninstall", no_argument, 0, 'u' },
+ { "help", no_argument, 0, 'h' },
+ { "version", no_argument, 0, 'v' },
+ { 0, 0, 0, 0 }
+ };
+
+ bool server = false, install = false, uninstall = false;
+
+ unsigned int ch;
+ while((ch = getopt_long(argc, (char* const*)argv, "siuhv", longopts, NULL)) != -1)
+ {
+ switch(ch)
+ {
+ case 's': server = true; break;
+ case 'i': install = true; break;
+ case 'u': uninstall = true; break;
+ case 'h': usage(); return 0;
+ case 'v': version(); return 0;
+ default: usage(stderr); return 1;
+ }
+ }
+
+ if(geteuid() != 0)
+ {
+ fprintf(stderr, "auth_server: must run as root\n");
+ abort();
+ }
+
+ if(install)
+ return install_tool(argv[0]);
+ else if(uninstall)
+ return uninstall_tool();
+
+ int fd = server ? setup_socket() : launchd_sockets();
+
+ while(running)
+ {
+ fd_set readfds;
+ FD_ZERO(&readfds);
+ FD_SET(fd, &readfds);
+ int rc = select(fd+1, &readfds, NULL, NULL, NULL);
+ if(rc == -1)
+ {
+ D(DBF_AuthServer, bug("select: %s\n", strerror(errno)););
+ continue;
+ }
+
+ if(FD_ISSET(fd, &readfds))
+ {
+ char dummy[256];
+ socklen_t len = sizeof(dummy);
+ int newFd = accept(fd, (sockaddr*)&dummy[0], &len);
+ // if(fork() == 0)
+ {
+ D(DBF_AuthServer, bug("new connection\n"););
+ handle_connection(newFd);
+ // _exit(0);
+ }
+ }
+ }
+
+ close_socket(fd);
+ return 0;
+}
2  Applications/PrivilegedTool/target
@@ -0,0 +1,2 @@
+SOURCES = src/*.cc
+LINK += authorization
1  Applications/TextMate/icons
@@ -0,0 +1 @@
+Subproject commit 4bf6439a8d5e5cc42997094ce178499ed67c7e5b
2  Applications/TextMate/references.md
@@ -0,0 +1,2 @@
+
+[Apple]: http://apple.com/ "Apple Inc."
39 Applications/TextMate/resources/Credits.md
@@ -0,0 +1,39 @@
+## Oniguruma
+
+Copyright (c) K.Kosako <sndgk393@ybb.ne.jp>
+
+[Oniguruma][] is licensed under the BSD license.
+
+[Oniguruma]: http://www.geocities.jp/kosako3/oniguruma/
+
+## MASPreferences
+
+[MASPreferences][] is licensed under the BSD license
+
+[MASPreferences]: https://github.com/shpakovski/MASPreferences
+
+## MGScopeBar
+
+ Copyright (c) 2008 Matt Gemmell
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 Applications/TextMate/resources/Default.tmProperties
@@ -0,0 +1,31 @@
+exclude = "{*.{o,pyc},Icon\r,CVS,_darcs,_MTN,\{arch\},blib,*~.nib}"
+include = "{.tm_properties,.htaccess}"
+binary = "{*.{icns,ico,jpg,jpeg,m4v,nib,o,pdf,png,psd,pyc,rtf,tif,tiff,xib},Icon\r}"
+
+LANG = "en_US.UTF-8"
+LC_CTYPE = "en_US.UTF-8"
+TM_APP_PATH = "${CWD/\/Contents\/Resources$//}"
+
+[ "/usr/include/{**/,}*" ]
+tabSize = 8
+
+[ text ]
+softWrap = true
+
+[ .git/COMMIT_EDITMSG ]
+spellChecking = true
+spellingLanguage = 'en'
+
+[ source.ruby ]
+softTabs = true
+tabSize = 2
+
+[ source.python ]
+softTabs = true
+tabSize = 4
+
+[ "/System/Library/Frameworks/**/Headers/**/*" ]
+encoding = "MACROMAN"
+
+[ "{BUILD,README,INSTALL,LICENSE,COPYING,TODO}" ]
+fileType = "text.plain"
286 Applications/TextMate/resources/English.lproj/CreditsWindow.xib
@@ -0,0 +1,286 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10">
+ <data>
+ <int key="IBDocument.SystemTarget">1050</int>
+ <string key="IBDocument.SystemVersion">10K549</string>
+ <string key="IBDocument.InterfaceBuilderVersion">851</string>
+ <string key="IBDocument.AppKitVersion">1038.36</string>
+ <string key="IBDocument.HIToolboxVersion">461.00</string>
+ <object class="NSMutableDictionary" key="IBDocument.PluginVersions">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.WebKitIBPlugin</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>851</string>
+ <string>851</string>
+ </object>
+ </object>
+ <object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <integer value="1"/>
+ </object>
+ <object class="NSArray" key="IBDocument.PluginDependencies">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.WebKitIBPlugin</string>
+ </object>
+ <object class="NSMutableDictionary" key="IBDocument.Metadata">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys" id="0">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ </object>
+ <object class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSCustomObject" id="1001">
+ <string key="NSClassName">CreditsWindowController</string>
+ </object>
+ <object class="NSCustomObject" id="1003">
+ <string key="NSClassName">FirstResponder</string>
+ </object>
+ <object class="NSCustomObject" id="1004">
+ <string key="NSClassName">NSApplication</string>
+ </object>
+ <object class="NSWindowTemplate" id="1005">
+ <int key="NSWindowStyleMask">15</int>
+ <int key="NSWindowBacking">2</int>
+ <string key="NSWindowRect">{{100, 200}, {600, 500}}</string>
+ <int key="NSWTFlags">1613234176</int>
+ <string key="NSWindowTitle">Credits</string>
+ <string key="NSWindowClass">NSWindow</string>
+ <nil key="NSViewClass"/>
+ <string key="NSWindowContentMaxSize">{1.79769e+308, 1.79769e+308}</string>
+ <string key="NSWindowContentMinSize">{300, 150}</string>
+ <object class="NSView" key="NSWindowView" id="1006">
+ <reference key="NSNextResponder"/>
+ <int key="NSvFlags">274</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="WebView" id="123711406">
+ <reference key="NSNextResponder" ref="1006"/>
+ <int key="NSvFlags">274</int>
+ <object class="NSMutableSet" key="NSDragTypes">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="set.sortedObjects">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>Apple HTML pasteboard type</string>
+ <string>Apple PDF pasteboard type</string>
+ <string>Apple PICT pasteboard type</string>
+ <string>Apple URL pasteboard type</string>
+ <string>Apple Web Archive pasteboard type</string>
+ <string>NSColor pasteboard type</string>
+ <string>NSFilenamesPboardType</string>
+ <string>NSStringPboardType</string>
+ <string>NeXT RTFD pasteboard type</string>
+ <string>NeXT Rich Text Format v1.0 pasteboard type</string>
+ <string>NeXT TIFF v4.0 pasteboard type</string>
+ <string>WebURLsWithTitlesPboardType</string>
+ <string>public.png</string>
+ <string>public.url</string>
+ <string>public.url-name</string>
+ </object>
+ </object>
+ <string key="NSFrameSize">{600, 500}</string>
+ <reference key="NSSuperview" ref="1006"/>
+ <reference key="NSNextKeyView"/>
+ <string key="FrameName"/>
+ <string key="GroupName"/>
+ <object class="WebPreferences" key="Preferences">
+ <string key="Identifier"/>
+ <object class="NSMutableDictionary" key="Values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>WebKitDefaultFixedFontSize</string>
+ <string>WebKitDefaultFontSize</string>
+ <string>WebKitMinimumFontSize</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <integer value="12"/>
+ <integer value="12"/>
+ <integer value="1"/>
+ </object>
+ </object>
+ </object>
+ <bool key="UseBackForwardList">NO</bool>
+ <bool key="AllowsUndo">YES</bool>
+ </object>
+ </object>
+ <string key="NSFrameSize">{600, 500}</string>
+ <reference key="NSSuperview"/>
+ </object>
+ <string key="NSScreenRect">{{0, 0}, {1280, 778}}</string>
+ <string key="NSMinSize">{300, 172}</string>
+ <string key="NSMaxSize">{1.79769e+308, 1.79769e+308}</string>
+ <string key="NSFrameAutosaveName">Credits</string>
+ </object>
+ </object>
+ <object class="IBObjectContainer" key="IBDocument.Objects">
+ <object class="NSMutableArray" key="connectionRecords">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">window</string>
+ <reference key="source" ref="1001"/>
+ <reference key="destination" ref="1005"/>
+ </object>
+ <int key="connectionID">4</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">delegate</string>
+ <reference key="source" ref="1005"/>
+ <reference key="destination" ref="1001"/>
+ </object>
+ <int key="connectionID">5</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">webView</string>
+ <reference key="source" ref="1001"/>
+ <reference key="destination" ref="123711406"/>
+ </object>
+ <int key="connectionID">6</int>
+ </object>
+ </object>
+ <object class="IBMutableOrderedSet" key="objectRecords">
+ <object class="NSArray" key="orderedObjects">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBObjectRecord">
+ <int key="objectID">0</int>
+ <reference key="object" ref="0"/>
+ <reference key="children" ref="1000"/>
+ <nil key="parent"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-2</int>
+ <reference key="object" ref="1001"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">File's Owner</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-1</int>
+ <reference key="object" ref="1003"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">First Responder</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-3</int>
+ <reference key="object" ref="1004"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">Application</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">1</int>
+ <reference key="object" ref="1005"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="1006"/>
+ </object>
+ <reference key="parent" ref="0"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">2</int>
+ <reference key="object" ref="1006"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="123711406"/>
+ </object>
+ <reference key="parent" ref="1005"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">3</int>
+ <reference key="object" ref="123711406"/>
+ <reference key="parent" ref="1006"/>
+ </object>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="flattenedProperties">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>-1.IBPluginDependency</string>
+ <string>-2.IBPluginDependency</string>
+ <string>-3.IBPluginDependency</string>
+ <string>1.IBEditorWindowLastContentRect</string>
+ <string>1.IBPluginDependency</string>
+ <string>1.IBWindowTemplateEditedContentRect</string>
+ <string>1.NSWindowTemplate.visibleAtLaunch</string>
+ <string>1.WindowOrigin</string>
+ <string>1.editorWindowContentRectSynchronizationRect</string>
+ <string>1.windowTemplate.hasMinSize</string>
+ <string>1.windowTemplate.minSize</string>
+ <string>2.IBPluginDependency</string>
+ <string>3.IBPluginDependency</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>{{50, 240}, {600, 500}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>{{50, 240}, {600, 500}}</string>
+ <integer value="1"/>
+ <string>{196, 240}</string>
+ <string>{{357, 418}, {480, 270}}</string>
+ <integer value="1"/>
+ <string>{300, 150}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.WebKitIBPlugin</string>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="unlocalizedProperties">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference key="dict.sortedKeys" ref="0"/>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ </object>
+ <nil key="activeLocalization"/>
+ <object class="NSMutableDictionary" key="localizations">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference key="dict.sortedKeys" ref="0"/>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ </object>
+ <nil key="sourceID"/>
+ <int key="maxID">6</int>
+ </object>
+ <object class="IBClassDescriber" key="IBDocument.Classes">
+ <object class="NSMutableArray" key="referencedPartialClassDescriptions">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBPartialClassDescription">
+ <string key="className">CreditsWindowController</string>
+ <string key="superclassName">NSWindowController</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBUserSource</string>
+ <string key="minorKey"/>
+ </object>
+ </object>
+ </object>
+ </object>
+ <int key="IBDocument.localizationMode">0</int>
+ <string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string>
+ <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencies">
+ <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string>
+ <integer value="1050" key="NS.object.0"/>
+ </object>
+ <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies">
+ <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3</string>
+ <integer value="3000" key="NS.object.0"/>
+ </object>
+ <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
+ <nil key="IBDocument.LastKnownRelativeProjectPath"/>
+ <int key="IBDocument.defaultPropertyAccessControl">3</int>
+ </data>
+</archive>
BIN  Applications/TextMate/resources/English.lproj/InfoPlist.strings
Binary file not shown
7,195 Applications/TextMate/resources/English.lproj/MainMenu.xib
7,195 additions, 0 deletions not shown
80 Applications/TextMate/resources/English.lproj/TextMate Help/TextMate.md
@@ -0,0 +1,80 @@
+title: TextMate Help
+meta: AppleTitle="TextMate 2 Help", AppleIcon="TextMate Help/images/tm_small.png"
+
+# TextMate Help
+
+Some non-visible stuff.
+
+## Mouse Gestures
+
+ * ⌘-click to add a new caret.
+ * ⌥-click close buttons to close other tabs.
+ * Hold ⌃ when dropping file to text view to insert its path.
+
+Holding ⌥ to “close other” also works in file browser or when using ⌘T (and ⌘T now does multi-select).
+
+One exception to “⌥ closes other” is when single-clicking the icon of a bundle (e.g. `.app`) in the file browser. In this case the single-click works as “Show Package Contents”.
+
+## Completion (⎋)
+
+The current word suffix is taken into considuration when hiting escape.
+
+For example in this case:
+
+ enum mark_t { kErrorMarkType, kWarningMarkType };
+ mark_t m = ‸MarkType;
+
+The resulting line will become:
+
+ mark_t m = kWarning‸MarkType;
+
+## Grammar
+
+ * Scope names are format strings and can reference captures ($0, $1, $n).
+ * `\G` matches end of parent rule’s `begin` — or end of last stacked `while`.
+ * `begin`/`while` rule construct.
+ * Includes can reference grammar#repos.
+
+## Bundles
+
+ * Shell variables are format strings and can e.g. reference `TM_SUPPORT_PATH`.
+ * Completion commands have all variables set from current context.
+
+## Discontinuous Selection
+
+Activated by typing/deleting or using a leftward or rightward movement while a column selection is active. Alternatively use “Find All”
+
+## Find History
+
+Just like clipboard history: ⌃⌥⌘F.
+
+## Other
+
+Possible to enter e.g. `main.{cc,h}` in a Save As dialog for brace expansion (saves as first expansion, background tabs are created for further expansions).
+
+⌘T can filter on full path by including `/`, extension by starting with `.`, can go to a line by suffixing with a line specification (see elsewhere for syntax)
+
+Using ⌘T with find clipboard containing `«file»:«line»` will use that as default text.
+
+## Syntax / API
+
+* [Bundle Dependencies][]
+* [Format String Syntax][]
+* [Glob String Syntax][]
+* [JavaScript Object][]
+* [Scope Selector Syntax][]
+* [Selection String Syntax][]
+* [Folder Specific Properties][]
+* [Non-Content Scopes][]
+* [Events / Filters][]
+* [mate & rmate](mate_and_rmate.html)
+
+[Bundle Dependencies]: bundle_dependencies.html
+[Format String Syntax]: format_string_syntax.html
+[Glob String Syntax]: glob_string_syntax.html
+[JavaScript Object]: javascript_object.html
+[Scope Selector Syntax]: scope_selector_syntax.html
+[Selection String Syntax]: selection_string_syntax.html
+[Folder Specific Properties]: properties.html
+[Non-Content Scopes]: non-content_scopes.html
+[Events / Filters]: events.html
37 Applications/TextMate/resources/English.lproj/TextMate Help/bundle_dependencies.md
@@ -0,0 +1,37 @@
+# Bundle Dependencies
+
+## Description
+
+The following can be added to a bundle item (setting it for a bundle’s `info.plist` is equivalent of setting it for each item in that bundle):
+
+ require = ( { name = «name»; uuid = «uuid»; }, … );
+
+The UUID is that of the bundle or bundle item required. The name is the name under which the required item should be available (more or less), this only make sense when the UUID is that of a grammar or bundle, see details below. The name defaults to the bundle’s or bundle item’s name, except for grammars, where it is the root scope for the grammar.
+
+If the UUID is that of a bundle item, TextMate ensures that the item and bundle containing it, when the item with the requirement is “executed”, is available.
+
+If the UUID is that of a bundle, TextMate ensures that the bundle is available and will set `TM_«name»_BUNDLE_SUPPORT` when “executing” the item with the requirement. It will uppercase the name provided.
+
+## Examples
+
+To be able to use `include = 'source.c';` in the Objective-C grammar, it should have the followung requirement:
+
+ require = (
+ { name = 'source.c';
+ uuid = '25066DC2-6B1D-11D9-9D5B-000D93589AF6';
+ }
+ )
+
+The Subversion bundle’s `info.plist` could contain the following:
+
+ require = (
+ { name = 'Dialog';
+ uuid = 'F985E884-C6F4-4FB1-B7F6-447A72ECF267';
+ }
+ )
+
+This ensures that the bundle providing a ruby interface to the Dialog system is available and that commands in the Subversion bundle written in ruby can do:
+
+ require "#{ENV['TM_DIALOG_BUNDLE_SUPPORT']}/lib/ui"
+ ⋮
+ TextMate::UI.show_menu(…)
10 Applications/TextMate/resources/English.lproj/TextMate Help/css/stylesheet.css
@@ -0,0 +1,10 @@
+body {
+ font: 12px "Lucida Grande", sans-serif;
+}
+
+pre {
+ background-color: #E2E2E2;
+ border: 1px solid #919699;
+ padding: 10px 20px 10px 20px;
+ overflow: auto;
+}
13 Applications/TextMate/resources/English.lproj/TextMate Help/events.md
@@ -0,0 +1,13 @@
+# Events / Filters
+
+## Events
+
+Presently the only event fired is `event.document.did_save`.
+
+Catching an event is done by adding an `eventSpecifier` key to a regular command and setting the value to the event which should be catched.
+
+An example of this is the “Make Script Executable” in the included Avian bundle. This is scoped to `source.ruby` so if you create a new ruby file and save it, it should automatically get the executable bit set.
+
+## Filters
+
+Filters are like events but their output is used. Examples of filters are in the included Avian bundle, there are filters to decompile AppleScript, pretty print tmCommand files, and encrypt/decrypt the content.
38 Applications/TextMate/resources/English.lproj/TextMate Help/format_string_syntax.md
@@ -0,0 +1,38 @@
+# Format String Syntax
+
+## In Snippets
+
+### Placeholders
+
+ $«int»
+ ${«int»}
+ ${«int»:«snippet»}
+ ${«int»/«regexp»/«format»/«options»}
+ ${«int»|«choice 1»,…,«choice n»|} # parsed but not handled
+
+### Code
+
+ `«code»`
+
+## In Format Strings
+
+ $0-n
+
+ \U, \L, \E, \u, \l
+ \n, \t
+
+ «variables»
+
+ (?«var»:«if»:«else»}
+ (?«var»:«if»}
+
+## In Both
+
+### Variables
+
+ ${«var»:?«if»:«else»}
+ ${«var»:+«if»}
+ ${«var»:-«else»}
+ ${«var»:«else»}
+ ${«var»/«regexp»/«format»/«options»}
+ ${«var»:[/upcase][/downcase][/capitalize][/asciify]}
25 Applications/TextMate/resources/English.lproj/TextMate Help/glob_string_syntax.md
@@ -0,0 +1,25 @@
+# Glob String Syntax
+
+ \«char» -- Literal «char»
+ ? -- Match one character
+ * -- Match zero or more characters¹
+ ** -- Match zero or more path components
+ {«a»,«b»,«c»} -- Match «a» or «b» or «c»
+ [«a»«b»«c»] -- Match an «a», «b» or «c» character
+ [«a»-«b»] -- Match one character in the range «a»-«b»
+ [^«a»-«b»] -- Match one character not in the range «a»-«b»
+
+Braces can be nested and contain other glob characters. Example:
+
+ {*.{cc,mm,h},target,Makefile,.tm_properties}
+
+Will match these files:
+
+ source.cc
+ source.mm
+ source.h
+ target
+ Makefile
+ .tm_properties
+
+¹ The asterisk will not match slashes nor a leading period.
BIN  Applications/TextMate/resources/English.lproj/TextMate Help/images/terminal_preferences.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN  Applications/TextMate/resources/English.lproj/TextMate Help/images/tm_small.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
52 Applications/TextMate/resources/English.lproj/TextMate Help/javascript_object.md
@@ -0,0 +1,52 @@
+# TextMate JavaScript Object API
+
+The object has the following methods available:
+
+ system() See below for information.
+ log(msg) Adds a message to the system console (using NSLog).
+ open(path, options) Opens a file on disk as a document in the current application.
+ options may be either a selection range string or a (line) number.
+
+In addition, these properties are exposed:
+
+ busy (boolean) The busy spinner in the output window will be displayed when this is true.
+ progress (double, 0-1) Controls the value displayed in the determinate progress indicator.
+
+## TextMate.system()
+
+Also see <http://developer.apple.com/documentation/AppleApplications/Conceptual/Dashboard_ProgTopics/Articles/CommandLine.html>.
+
+### Synchronous Operation
+
+Example:
+
+ obj = TextMate.system("/usr/bin/id -un", null);
+
+Result is an object with following properties:
+
+ outputString: The output of the command, as placed on stdout.
+ errorString: The output of the command, as placed on stderr.
+ status: The exit status of the command.
+
+### Asynchronous Operation
+
+Example:
+
+ obj = TextMate.system("/usr/bin/id -un", handler);
+
+Handler is called when the command is finished and given an object with the following properties:
+
+ outputString: The last output of the command, as placed on stdout.
+ errorString: The last output of the command, as placed on stderr.
+ status: The exit status of the command.
+
+Result is an object with following properties/methods:
+
+ outputString: The current string written to stdout (standard output) by the command.
+ errorString: The current string written to stderr (standard error output) by the command.
+ status: The command’s exit status, as defined by the command.
+ onreadoutput: A function called whenever the command writes to stdout. The handler must accept a single argument; when called, the argument contains the current string placed on stdout.
+ onreaderror: A function called whenever the command writes to stderr. The handler must accept a single argument; when called, the argument contains the current string placed on stderr.
+ cancel(): Cancels the execution of the command.
+ write(string): Writes a string to stdin (standard input).
+ close(): Closes stdin (EOF).
11 Applications/TextMate/resources/English.lproj/TextMate Help/load_encoding.md
@@ -0,0 +1,11 @@
+# <a name="load_encoding">Encodings</a>
+
+TextMate will do a few tests against your file:
+
+ 1. Does it have an UTF-8/16/32 BE/LE BOM?
+ _Do not take this to mean that UTF-8 BOMs are fine!_
+ 2. Does it have a `com.apple.TextEncoding` extended attribute?
+ 3. Does it have an `encoding` setting via `.tm_properties`?
+ 4. Is it valid ASCII/UTF-8?
+
+If all of these tests fail, it will ask you to pick the proper encoding.
254 Applications/TextMate/resources/English.lproj/TextMate Help/mate_and_rmate.md
@@ -0,0 +1,254 @@
+Title: Terminal Preferences
+
+# <a name="terminal">mate and rmate</a>
+
+TextMate is and will always be a modern GUI application. However, developers are often forced to walk in two worlds using both GUI and command-line tools. TextMate has always bridged the gap between these environments with its trusty command-line sidekick: `mate`.
+
+In TextMate 2, `mate` has learned some new tricks. A new partner-in-crime has also been introduced: `rmate`.
+
+In this article will discuss:
+
+* How to install the upgraded `mate`
+* `mate`'s new features
+* What `rmate` is
+* The different ways to use `rmate`
+
+## Upgrade Time
+
+Once you have TextMate 2, you need to make sure you refresh the command-line `mate` application. This allows you to take advantage of its new features.
+
+The installer of this command-line utility has moved in TextMate 2. You can now find it in the _TextMate_ menu under _Preferences…_ in the _Terminal_ pane.
+
+![The Terminal Preferences pane][preferences]
+
+To install or upgrade `mate`, just select a Location and hit Install. You may be prompted to Replace an old version, if present.
+
+This pane can later be used to uninstall the command if you need to do that.
+
+Users usually install `mate` into `~/bin` if they just need it for the current user and `/usr/local/bin` if they would rather make it accessible to all users (assuming they have `/usr/local/bin` in their `PATH`). If you would like to find where your TextMate 1 version is before you upgrade, feed your Terminal this command: `which mate`.
+
+## Your New mate
+
+Let's get to the good stuff. What's upgraded in `mate`?
+
+First, it's a small tweak, but you will be happy to hear that `mate` now works with `sudo`. You can use this to edit restricted access files in TextMate 2 without being bothered by an authorization dialog on save:
+
+ sudo mate /etc/hosts
+
+Next, `mate` has picked up some new command-line options. One is `-t`, which allows you to set the type of an opened file. Personally, I like this feature for README files, which I prefer to write in Markdown. Since the name of standard files like this don't always include an extension, we can just tell TextMate 2 how to handle the file as we open it:
+
+ mate -t text.html.markdown README
+
+Another new option is `--name`. This allows you to set `TM_DISPLAYNAME` which is typically shown in the title bar on TextMate's windows. For a good use of that, let me share a line from my Bash configuration:
+
+ export GIT_EDITOR="mate --name 'Git Commit Message' -w -l 1"
+
+The `-w` and `-l` options have been around for a while. `-w` just tells TextMate to **w**ait for the edit to finish. That's what allows you to use the command as an external editor for tools like Git that are waiting for an answer.
+
+`-l` just tells TextMate to place the caret on the indicated **l**ine. I force the first line here because Git has a habit of reusing commit message files and TextMate would otherwise try restore the caret to it's last location. Since that last location was probably at the end of a message that's changed or no longer present, the caret would likely be left in the middle of Git's comments. That's not too helpful for a quick edit, so `-l 1` forces the caret back to the beginning.
+
+That leads us, finally, to the new option used above. Since Git will just use some file like `.git/COMMIT_EDITMSG`, our window isn't going to have the best title by default. This use of `--name` clears that up by telling me exactly what I'm looking at.
+
+## Selection Strings
+
+I mentioned before that TextMate 1's version of `mate` supported `-l`. That's true, but `-l` is far more powerful in TextMate 2 and that new power has spread to other commands.
+
+With the old version of `mate`, `-l` was super simple. It just took a number and it took you to that line. Easy enough.
+
+In the new version, it now takes a Selection String. These are a new tool in TextMate 2 for describing selections. Here's the formal grammar for a Selection String:
+
+ selection = «range» ('&' «range»)*
+ range = «pos» | «normal_range» | «column_range»
+ pos = «line» (':' «column»)?
+ normal_range = «pos» '-' «pos»
+ column_range = «pos» 'x' «pos»
+ line = [1-9][0-9]*
+ column = [1-9][0-9]*
+
+OK, geeky, but what does it really mean? Let's look at some examples.
+
+If I save the above grammar to a `selection_string_syntax.txt` file, I can open it with the following command:
+
+ mate -l 3 selection_string_syntax.txt
+
+That would drop my caret (shown as ‸) at the beginning of the third line:
+
+ ‸pos = «line» (':' «column»)?
+
+If I prefer though, I can control where it is in the line:
+
+ mate -l 3:16 selection_string_syntax.txt
+
+That would place my caret here:
+
+ pos = ‸«line» (':' «column»)?
+
+Of course, we can also make a selection:
+
+ mate -l 3:32-3:38 selection_string_syntax.txt
+
+That selects (shown between ‸ marks):
+
+ pos = «line» (':' «‸column‸»)?
+
+But wait, is this TextMate 2 or what? We have [Multiple Carets][carets] now, dang it! How do we use more than one at once? Like this:
+
+ mate -l '3&6' selection_string_syntax.txt
+
+That places two carets:
+
+ selection = «range» ('&' «range»)*
+ range = «pos» | «normal_range» | «column_range»
+ ‸pos = «line» (':' «column»)?
+ normal_range = «pos» '-' «pos»
+ column_range = «pos» 'x' «pos»
+ ‸line = [1-9][0-9]*
+ column = [1-9][0-9]*
+
+You can also make column selections:
+
+ mate -l '4:7x5:13' selection_string_syntax.txt
+
+That gives us:
+
+ normal‸_range‸ = «pos» '-' «pos»
+ column‸_range‸ = «pos» 'x' «pos»
+
+Or you can make several unlinked selections using all of the above features:
+
+ mate -l '2:18-2:21&3:1-3:4&4:18x5:21&4:30x5:33' selection_string_syntax.txt
+
+Which selects all occurrences of `pos` for replacement:
+
+ selection = «range» ('&' «range»)*
+ range = «‸pos‸» | «normal_range» | «column_range»
+ ‸pos‸ = «line» (':' «column»)?
+ normal_range = «‸pos‸» '-' «‸pos‸»
+ column_range = «‸pos‸» 'x' «‸pos‸»
+ line = [1-9][0-9]*
+ column = [1-9][0-9]*
+
+You get the idea.
+
+The best news about these new Selection Strings is that they aren't just for `mate`. You can also use them in the _Go to Line_ (⌘L) and _Go to File_ (⌘T) dialogs. For that latter, you just tack a colon (`:`) onto the end of the name matching string then follow it up with a Selection String.
+
+This means that you could respond to a warning message like the following:
+
+ main.cc:32: warning: no return statement.
+
+by selecting `main.cc:32`, copying that to the Find clipboard with ⌘E, opening TextMate 2, calling up the _Go to File_ dialog with (⌘T), and pushing ↩ to go straight there. As this shows, _Go to File_ honors the Find clipboard when it matches this format, just to make things like this easier.
+
+## Remote mate
+
+In the past, TextMate has suffered with editing files on a server, but that's all changed now. If you regularly find yourself SSHed into a remote box and wanting to edit a file using TextMate on your own box, your ship has come in.
+
+TextMate 2 now ships with an `rmate` (Ruby) script that you can drop onto servers. When you trigger `rmate` on a remote box, it will connect back to your box, allow you to edit, and update the file on the server with the changes.
+
+Let me show you how to get `rmate` installed on a server you want edit from remotely.
+
+### Installing rmate
+
+First, we need to copy `rmate` up to your server. You can find a link to the script in the _Preferences…_ dialog of the _TextMate_ menu, under the _Terminal_ pane. Click that link to open the script, then finish the install with these steps:
+
+1. Open a Terminal and type `scp` followed by a space
+2. Drag the `rmate` icon out of the window title bar and drop it into your Terminal to fill in the path to the script
+3. Add another space and then the server you wish to install the script on followed by a colon (`:`) and the path to install the script into
+
+Your final command should look something like:
+
+ scp /Applications/TextMate.app/Contents/Frameworks/Preferences.framework/Versions/A/Resources/rmate example.com:/usr/local/bin
+
+If you don't have SSH setup to automatically log you into the server, you may also need to provide the proper authentication options. If your user doesn't have permission to copy directly into a the directory you want to install into, you may need to upload the script to your user's home directory, SSH into the remote, and move it into place using `sudo`. Alternately, you could place it in `~/bin` and ensure that directory is in your path.
+
+Back on your own machine, you need to make sure TextMate 2 is ready for the incoming connections. Be sure Accept `rmate` connections is checked in the _Terminal_ pane of _Preferences…_ in the _TextMate_ menu. You can leave "Access for" on "local clients" though, because I'll show you a secure trick for bridging the two computers.
+
+![The Terminal Preferences pane][preferences]
+
+### The Magic of SSH Tunnels
+
+With the install out of the way, you should be ready to use `rmate`.
+
+To do it's job, `rmate` needs a connection back to your computer so that it can talk to TextMate 2. There are multiple ways you can accomplish this, but probably the best way is to use a reverse SSH tunnel. With the proper setup, you can forward the port `rmate` likes back to your local machine where TextMate 2 can answer the call-to-duty.
+
+The easiest way to do this is to connect to your server using a command like:
+
+ ssh -R 52698:127.0.0.1:52698 example.com
+
+The `-R` option sets up a reverse tunnel. The first `52698` names a port on the remote. It will be connected to `127.0.0.1:52698` or the same port on the connecting box. That port number is the default for TextMate 2 and `rmate`, so you should now be able to edit away.
+
+To test things out, just try a command like:
+
+ rmate test_file.txt
+
+That should contact TextMate 2 on your local box. Note that TextMate 2 does need to be running for this to work.
+
+Type some content using any TextMate editing features you just can't live without and save the file. Then check it on your server with:
+
+ cat test_file.txt
+
+You should see the content you typed on the server. Magic!
+
+If you try to edit a file you don't have permission to change on the server, `rmate` will refuse the edit and warn you:
+
+ $ rmate /etc/crontab
+ File /etc/crontab is not writable! Use -f/--force to open anyway.
+
+You can either use the `-f` option to force the open in read-only mode or use `sudo` to get the needed permissions. Remember that `rmate` is a Ruby script, so RVM users will probably need to use `rvmsudo` to keep the same Ruby selected:
+
+ rvmsudo rmate /etc/crontab
+
+After you verify that things are working, feel free to update your SSH setting to automatically setup the tunnel without you needing to supply the `-R` arguments all the time.
+
+For a single server just add an entry like the following to your `~/.ssh/config`:
+
+ Host example.com
+ RemoteForward 52698 127.0.0.1:52698
+
+If you want to make those settings the default for all of your servers, use the wildcard host:
+
+ Host *
+ RemoteForward 52698 127.0.0.1:52698
+
+With settings like those in place, a bare `ssh` command (without `-R`) should still establish the tunnel for you and allow you to use `rmate`.
+
+### Port Forwarding
+
+SSH tunneling is probably the lowest configuration option for using `rmate`. It's also the safest since the computers chat over an encrypted connection. Go that way if you can.
+
+However, if you can't, you do have other options. One reason you might need these is if you use multiple machines to connect to the same account on one remote. They wouldn't all be able to use the same port.
+
+Of course, you can specify different ports when you setup TextMate 2 and/or your SSH tunnel. `rmate` also supports `--host` and `--port` options, so you can use those to customize the connection.
+
+One thing you may desire in complex connection scenarios is for `rmate` to just connect back to where the connection came from. You can have it determine the IP address the SSH connection came from using `--host auto`.
+
+You will probably need to setup port forwarding of the desired port in your router's settings to use a connection like this.
+
+The real trick with these connections though is that it's really the client that knows how things should best be handled. Using another feature of SSH, we can have the client set some variables to the proper details and forward those settings to the remote so `rmate` can honor them.
+
+A server whitelists the variables it will accept from connecting clients, so you'll need to edit `/etc/ssh/sshd_config`. It probably already have these lines in it:
+
+ # Allow client to pass locale environment variables
+ AcceptEnv LANG LC_*
+
+You need to add allowances for `RMATE_HOST` and `RMATE_PORT`, so change that second line to read:
+
+ AcceptEnv LANG LC_* RMATE_*
+
+You also need a similar entry in your local `~/.ssh/config`:
+
+ Host example.com
+ SendEnv RMATE_*
+
+Again, you can put that setting under the host wildcard if you prefer.
+
+Then you can add lines like the following to your local `~/.bashrc`:
+
+ export RMATE_HOST=auto
+ export RMATE_PORT=12345
+
+Those settings would be forwarded up to the server when you connect and `rmate` would use them to connect back to your computer for edits.
+
+Either way, it's a little work to get `rmate` setup, but it sure expands TextMate 2 reach once you do. Welcome to remote editing with TextMate.
+
+[preferences]: images/terminal_preferences.png
+[carets]: multiple_carets.md
21 Applications/TextMate/resources/English.lproj/TextMate Help/non-content_scopes.md
@@ -0,0 +1,21 @@
+# Non-content Scopes
+
+There are a few scopes which are not related to the content.
+
+## Dynamic Scopes
+
+Presently I think only `dyn.selection` is available. This allow key bindings which are only active when there is a selection. One example of this could be to overload the tab key to shift right, only when text is selected.
+
+Another example is the “Wrap in Braces” command in the included Avian bundle. This is bould to `{` and indents the selection plus puts braces on first/last line.
+
+Other dynamic scopes planned: `dyn.caret.(begin|end).(line|document)`. This will allow keys/snippets to only trigger when caret is at the beginning/ending of the line or document.
+
+## SCM Scopes
+
+The SCM system used is available as `scm.attr.«name»`. A few more SCM scopes are available, for Git the current branch, and status (although that is presently not standardized).
+
+## Other
+
+The path is available (reversed) as `attr.rev-path.«path»`. This is so that we can bind to e.g. `attr.rev-path.erb` to target all files with an ERb extension. This is more relevent for events or injection than key bindings.
+
+OS version is available. This allows us to have different versions of the same command for different OS versions (sometimes easier than testing for the OS version in the command when there is little code sharing between the two versions).
65 Applications/TextMate/resources/English.lproj/TextMate Help/properties.md
@@ -0,0 +1,65 @@
+# Properties
+
+For many settings TextMate will look for a `.tm_properties` file in the current folder and in any parent folders (up to the user’s home folder).
+
+These are simple `setting = value` listings where the value is a format string in which other variables can be referenced.
+
+If the setting name is uppercase it will be available as an environment variable (for commands and snippets).
+
+For example to setup the basic stuff one could have `~/.tm_properties` with these values:
+
+ # Settings
+ theme = "71D40D9D-AE48-11D9-920A-000D93589AF6"
+ fontName = "Menlo"
+ fontSize = 13
+ fileBrowserGlob = "{*,.tm_properties,.htaccess}"
+
+ # Variables
+ PATH = "$PATH:$HOME/bin"
+ TM_GIT = "/opt/local/bin/git"
+
+It is possible to target only files matching a given glob, for example:
+
+ [ *.txt ]
+ softWrap = true
+
+ [ .git/COMMIT_EDITMSG ]
+ softWrap = true
+ spellChecking = true
+ spellingLanguage = 'en'
+
+ [ "/usr/include/{**/,}*" ]
+ tabSize = 8
+
+A magic value of `attr.untitled` is used for untitled files. This allows setting the file type for these, e.g.:
+
+ [ attr.untitled ]
+ fileType = 'source.c++'
+
+The normal TM variables are available when expanding the format strings (values). In addition a `CWD` variable is available which represents the folder from which the `.tm_properties` file is read. This is necessary to set the project directory, for example I have `~/Source/Avian/.tm_properties` with these settings:
+
+ projectDirectory = "$CWD"
+ windowTitle = "$TM_DISPLAYNAME — Avian"
+ fileChooserGlob = "{{src,Shared/include}/**/*.{cc,mm,h},target{,s},Makefile{,.*},.tm_properties}"
+
+The first setting effectively sets `TM_PROJECT_DIRECTORY` to `~/Source/Avian`. In `~/Source/Avian/Applications` I have a (variable) setting like this:
+
+ TM_MAKE_TARGET = '${TM_DIRECTORY/^.*\/Applications\/([^\/]+)(\/.*)?$/$1\/run/}'
+
+What this does is set the make target based on the current directory. So if I am editing `~/Source/Avian/Applications/mate/src/main.cc` ⌘B will make `mate/run` whereas if I am in `~/Source/Avian/Applications/Avian/src/main.cc` it will make `Avian/run`.
+
+## Grammar
+
+The grammar used to parse the `.tm_properties` files are as below. Whitespace (in the form of spaces or tabs) is allowed between elements.
+
+ file: ( «line» )*
+ line: ( «comment» | ( «section» | «assignment» )? ( «comment» )? ) ( '\n' | EOF )
+ section: '[' «name» ( ";" «name» )* ']'
+ name: ( /[^\] \t\n]/ | /\\[\] \t\n\\]/ )+
+ assignment: «key» '=' «value»
+ key: ( /[^= \t\n]/ | /\\[= \t\n\\]/ )+
+ value: ( «single_string» | «double_string» | «bare_string» )
+ single_string: "'" ( /[^']/ | /\\['\\]/ )* "'"
+ double_string: '"' ( /[^"]/ | /\\["\\]/ )* '"'
+ bare_string: ( /[^ \t\n]/ | /\\[ \t\n\\]/ )+
+ comment: '#' ( /[^\n]/ )*
14 Applications/TextMate/resources/English.lproj/TextMate Help/scope_selector_syntax.md
@@ -0,0 +1,14 @@
+# Scope Selector Syntax
+
+ atom: «string» | '*'
+ scope: «atom» ('.' «atom»)*
+ path: '^'? «scope» ('>'? «scope»)* '$'?
+ group: '(' «selector» ')'
+ filter: ("L:"|"R:"|"B:") («group» | «path»)
+ expression: '-'? («filter» | «group» | «path»)
+ composite: «expression» ([|&-] «expression»)*
+ selector: «composite» (',' «composite»)*
+
+We need to add priority (to `path` rule): `(':' «integer»)?`. This is when multiple commands handle the same event and are using same scope (which can be the case when chaining e.g. documentation commands).
+
+We probably need `~` for negative-look ahead, e.g.: `text.html ~ meta.embedded`.
16 Applications/TextMate/resources/English.lproj/TextMate Help/selection_string_syntax.md
@@ -0,0 +1,16 @@
+# Selection String Syntax
+
+ selection = «range» ('&' «range»)*
+ range = «pos» | «normal_range» | «column_range»
+ pos = «line» (':' «column»)? ('+' «offset»)?
+ normal_range = «pos» '-' «pos»
+ column_range = «pos» 'x' «pos»
+ line = [1-9][0-9]*
+ column = [1-9][0-9]*
+ offset = [1-9][0-9]*
+
+This can be used with `mate -l`, _Go to Line…_, and the ⌘T dialog (by putting `:«selection string»` after the file name) — as for the latter, if a string on the find clipboard has this format, it will be the default value in ⌘T, this is useful if you have a line in Terminal like:
+
+ main.cc:32: warning: no return statement.
+
+You can then select `main.cc:32` press ⌘E and jump to Avian and press ⌘T followed by ↩ (one shortcoming is that ⌘T doesn’t show the currently open file, so it will only work if `main.cc` is not already the active file).
546 Applications/TextMate/resources/Info.plist
@@ -0,0 +1,546 @@
+{
+ CFBundleName = "${APP_NAME}";
+ CFBundleShortVersionString = "${APP_VERSION}"; // shown in About window
+ CFBundleVersion = "${APP_REVISION}"; // shown in About window in parenthesis (but this format is not well-formed)
+ CFBundleIdentifier = "com.macromates.${APP_NAME}.preview";
+
+ CFBundleDevelopmentRegion = English;
+ CFBundleExecutable = "${TARGET_NAME}";
+ CFBundleHelpBookFolder = "${APP_NAME} Help";
+ CFBundleHelpBookName = "${APP_NAME} 2 Help";
+ CFBundleIconFile = "TextMate";
+ CFBundleInfoDictionaryVersion = "6.0";
+ CFBundlePackageType = APPL;
+ CFBundleSignature = avin; // we didn’t register this code with Apple
+ LSMinimumSystemVersion = "${APP_MIN_OS}";
+ NSAppleScriptEnabled = YES;
+ NSMainNibFile = MainMenu;
+ NSPrincipalClass = NSApplication;
+ NSContactsUsageDescription = 'Your email address is used as identifier for crash report submission. It can be changed in Preferences.\n\nIt is also used as a default contact address if you create your own bundle. This can be changed in the bundle editor after you create a bundle.';
+
+ CFBundleURLTypes = (
+ { CFBundleURLName = "TextMate URL";
+ CFBundleURLSchemes = ( txmt );
+ }
+ );
+
+ CFBundleDocumentTypes = (
+ { CFBundleTypeName = "ADA source";
+ CFBundleTypeExtensions = (adb, ads);
+ CFBundleTypeIconFile = ADA;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "Compiled AppleScript";
+ CFBundleTypeExtensions = (scpt);
+ CFBundleTypeIconFile = AppleScript;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "AppleScript source";
+ CFBundleTypeExtensions = (applescript);
+ CFBundleTypeIconFile = AppleScript;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "ActionScript source";
+ CFBundleTypeExtensions = (as);
+ CFBundleTypeIconFile = ActionScript;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "ASP document";
+ CFBundleTypeExtensions = (asp, asa);
+ CFBundleTypeIconFile = ASP;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "ASP.NET document";
+ CFBundleTypeExtensions = (aspx, ascx, asmx, ashx);
+ CFBundleTypeIconFile = ASPNET;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "BibTeX bibliography";
+ CFBundleTypeExtensions = (bib);
+ CFBundleTypeIconFile = BibTeX;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "C source";
+ CFBundleTypeExtensions = (c);
+ CFBundleTypeIconFile = C;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "C++ source";
+ CFBundleTypeExtensions = (cc, cp, cpp, cxx, "c++");
+ CFBundleTypeIconFile = "C++";
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "C# source";
+ CFBundleTypeExtensions = (cs);
+ CFBundleTypeIconFile = "C#";
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "CoffeeScript source";
+ CFBundleTypeExtensions = (coffee);
+ CFBundleTypeIconFile = CoffeeScript;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "Context Free Design Grammar";
+ CFBundleTypeExtensions = (cfdg);
+ CFBundleTypeIconFile = CFDG;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "Comma separated values";
+ CFBundleTypeExtensions = (csv);
+ CFBundleTypeIconFile = Text;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "Tab separated values";
+ CFBundleTypeExtensions = (tsv);
+ CFBundleTypeIconFile = Text;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "CGI script";
+ CFBundleTypeExtensions = (cgi, fcgi);
+ CFBundleTypeIconFile = CGI;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "Configuration file";
+ CFBundleTypeExtensions = (cfg, conf, config, htaccess);
+ CFBundleTypeIconFile = Config;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "Cascading style sheet";
+ CFBundleTypeExtensions = (css);
+ CFBundleTypeIconFile = CSS;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "Differences file";
+ CFBundleTypeExtensions = (diff);
+ CFBundleTypeIconFile = Diff;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "Document Type Definition";
+ CFBundleTypeExtensions = (dtd);
+ CFBundleTypeIconFile = DTD;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "Dylan source";
+ CFBundleTypeExtensions = (dylan);
+ CFBundleTypeIconFile = Dylan;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "Erlang source";
+ CFBundleTypeExtensions = (erl, hrl);
+ CFBundleTypeIconFile = Erlang;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "F-Script source";
+ CFBundleTypeExtensions = (fscript);
+ CFBundleTypeIconFile = "F-Script";
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "Fortran source";
+ CFBundleTypeExtensions = (f, for, fpp, f77, f90, f95);
+ CFBundleTypeIconFile = Fortran;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "Header";
+ CFBundleTypeExtensions = (h, pch);
+ CFBundleTypeIconFile = H;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "C++ header";
+ CFBundleTypeExtensions = (hh, hpp, hxx, "h++");
+ CFBundleTypeIconFile = "H++";
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "GTD document";
+ CFBundleTypeExtensions = (gtd, gtdlog);
+ CFBundleTypeIconFile = GTD;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "Haskell source";
+ CFBundleTypeExtensions = (hs, lhs);
+ CFBundleTypeIconFile = Haskell;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "HTML document";
+ CFBundleTypeExtensions = (htm, html, phtml, shtml);
+ CFBundleTypeIconFile = HTML;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "Include file";
+ CFBundleTypeExtensions = (inc);
+ CFBundleTypeIconFile = Inc;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "iCalendar schedule";
+ CFBundleTypeExtensions = (ics);
+ CFBundleTypeIconFile = iCal;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "MS Windows initialization file";
+ CFBundleTypeExtensions = (ini);
+ CFBundleTypeIconFile = INI;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "Io source";
+ CFBundleTypeExtensions = (io);
+ CFBundleTypeIconFile = Io;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "Java source";
+ CFBundleTypeExtensions = (java);
+ CFBundleTypeIconFile = Java;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "BeanShell script";
+ CFBundleTypeExtensions = (bsh);
+ CFBundleTypeIconFile = Java;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "Java properties file";
+ CFBundleTypeExtensions = (properties);
+ CFBundleTypeIconFile = Java;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "JavaScript source";
+ CFBundleTypeExtensions = (js, htc);
+ CFBundleTypeIconFile = JavaScript;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "Java Server Page";
+ CFBundleTypeExtensions = (jsp);
+ CFBundleTypeIconFile = JSP;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "JSON file";
+ CFBundleTypeExtensions = (json);
+ CFBundleTypeIconFile = JSON;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "LDAP Data Interchange Format";
+ CFBundleTypeExtensions = (ldif);
+ CFBundleTypeIconFile = Blank;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "Lisp source";
+ CFBundleTypeExtensions = (lisp, cl, l, lsp, mud, el);
+ CFBundleTypeIconFile = Lisp;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "Log file";
+ CFBundleTypeExtensions = (log);
+ CFBundleTypeIconFile = Log;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "Logo source";
+ CFBundleTypeExtensions = (logo);
+ CFBundleTypeIconFile = Logo;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "Lua source";
+ CFBundleTypeExtensions = (lua);
+ CFBundleTypeIconFile = Lua;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "Markdown document";
+ CFBundleTypeExtensions = (markdown, mdown, markdn, md);
+ CFBundleTypeIconFile = Markdown;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "Mediawiki document";
+ CFBundleTypeExtensions = (wiki, wikipedia, mediawiki);
+ CFBundleTypeIconFile = Wiki;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "MIPS assembler source";
+ CFBundleTypeExtensions = (s, mips, spim, asm);
+ CFBundleTypeIconFile = ASM;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "Modula-3 source";
+ CFBundleTypeExtensions = (m3, cm3);
+ CFBundleTypeIconFile = Modula;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "MoinMoin document";
+ CFBundleTypeExtensions = (moinmoin);
+ CFBundleTypeIconFile = Wiki;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "Objective-C source";
+ CFBundleTypeExtensions = (m);
+ CFBundleTypeIconFile = "Obj-C";
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "Objective-C++ source";
+ CFBundleTypeExtensions = (mm);
+ CFBundleTypeIconFile = "Obj-C++";
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "OCaml source";
+ CFBundleTypeExtensions = (ml, mli, mll, mly);
+ CFBundleTypeIconFile = OCaml;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "Pascal source";
+ CFBundleTypeExtensions = (pas, p);
+ CFBundleTypeIconFile = Pascal;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "Patch file";
+ CFBundleTypeExtensions = (patch);
+ CFBundleTypeIconFile = Patch;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "Perl source";
+ CFBundleTypeExtensions = (pl, pod, perl);
+ CFBundleTypeIconFile = Perl;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "Perl module";
+ CFBundleTypeExtensions = (pm);
+ CFBundleTypeIconFile = PERL;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "PHP source";
+ CFBundleTypeExtensions = (php, php3, php4, php5);
+ CFBundleTypeIconFile = PHP;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "PostScript source";
+ CFBundleTypeExtensions = (ps, eps);
+ CFBundleTypeIconFile = PostScript;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "Property list";
+ CFBundleTypeExtensions = (dict, plist, scriptSuite, scriptTerminology);
+ CFBundleTypeIconFile = Plist;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "Python source";
+ CFBundleTypeExtensions = (py, rpy, cpy, python);
+ CFBundleTypeIconFile = Python;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "R source";
+ CFBundleTypeExtensions = (r, s);
+ CFBundleTypeIconFile = R;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "Ragel source";
+ CFBundleTypeExtensions = (rl, ragel);
+ CFBundleTypeIconFile = Ragel;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "Remind document";
+ CFBundleTypeExtensions = (rem, remind);
+ CFBundleTypeIconFile = Blank;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "reStructuredText document";
+ CFBundleTypeExtensions = (rst, rest);
+ CFBundleTypeIconFile = reST;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "HTML with embedded Ruby";
+ CFBundleTypeExtensions = (rhtml);
+ CFBundleTypeIconFile = RHTML;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "SQL with embedded Ruby";
+ CFBundleTypeExtensions = (erbsql);
+ CFBundleTypeIconFile = SQL;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "Ruby source";
+ CFBundleTypeExtensions = (rb, rbx, rjs, rxml);
+ CFBundleTypeIconFile = Ruby;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "Scheme source";
+ CFBundleTypeExtensions = (scm, sch);
+ CFBundleTypeIconFile = Scheme;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "Setext document";
+ CFBundleTypeExtensions = (ext);
+ CFBundleTypeIconFile = Blank;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "Shell script";
+ CFBundleTypeExtensions = (sh, ss, bashrc, "bash_profile", "bash_login", profile, "bash_logout");
+ CFBundleTypeIconFile = Shell;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "Slate source";
+ CFBundleTypeExtensions = (slate);
+ CFBundleTypeIconFile = Slate;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "SQL source";
+ CFBundleTypeExtensions = (sql);
+ CFBundleTypeIconFile = SQL;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "Standard ML source";
+ CFBundleTypeExtensions = (sml);
+ CFBundleTypeIconFile = SML;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "Strings document";
+ CFBundleTypeExtensions = (strings);
+ CFBundleTypeIconFile = Strings;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "Scalable vector graphics";
+ CFBundleTypeExtensions = (svg);
+ CFBundleTypeIconFile = SVG;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "SWIG source";
+ CFBundleTypeExtensions = (i, swg);
+ CFBundleTypeIconFile = SWIG;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "Tcl source";
+ CFBundleTypeExtensions = (tcl);
+ CFBundleTypeIconFile = Tcl;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "TeX document";
+ CFBundleTypeExtensions = (tex, sty, cls);
+ CFBundleTypeIconFile = TeX;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "Plain text document";
+ CFBundleTypeExtensions = (text, txt, utf8);
+ CFBundleTypeIconFile = Text;
+ CFBundleTypeMIMETypes = ("text/plain");
+ CFBundleTypeOSTypes = (TEXT, sEXT, ttro);
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "Textile document";
+ CFBundleTypeExtensions = (textile);
+ CFBundleTypeIconFile = Textile;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "XHTML document";
+ CFBundleTypeExtensions = (xhtml);
+ CFBundleTypeIconFile = XHTML;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "XML document";
+ CFBundleTypeExtensions = (xml, rss, tld, pt, cpt, dtml);
+ CFBundleTypeIconFile = XML;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "XSL stylesheet";
+ CFBundleTypeExtensions = (xsl, xslt);
+ CFBundleTypeIconFile = XSL;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "Electronic business card";
+ CFBundleTypeExtensions = (vcf, vcard);
+ CFBundleTypeIconFile = Blank;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "Visual Basic source";
+ CFBundleTypeExtensions = (vb);
+ CFBundleTypeIconFile = VisualBasic;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "YAML document";
+ CFBundleTypeExtensions = (yaml, yml);
+ CFBundleTypeIconFile = YAML;
+ CFBundleTypeRole = Editor;
+ },
+
+ /* bundle items */
+
+ { CFBundleTypeName = "TextMate snippet";
+ CFBundleTypeExtensions = (tmSnippet);
+ CFBundleTypeIconFile = 'TextMate Snippet';
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "TextMate macro";
+ CFBundleTypeExtensions = (tmMacro);
+ CFBundleTypeIconFile = 'TextMate Macro';
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "TextMate language grammar";
+ CFBundleTypeExtensions = (tmLanguage);
+ CFBundleTypeIconFile = 'TextMate Grammar';
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "TextMate preferences";
+ CFBundleTypeExtensions = (tmPreferences);
+ CFBundleTypeIconFile = 'TextMate Settings';
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "TextMate command";
+ CFBundleTypeExtensions = (tmCommand);
+ CFBundleTypeIconFile = 'TextMate Command';
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "TextMate drag command";
+ CFBundleTypeExtensions = (tmDragCommand);
+ CFBundleTypeIconFile = 'TextMate Bundle Item';
+ CFBundleTypeRole = Editor;
+ },
+
+ /* other textmate types */
+
+ { CFBundleTypeName = "TextMate release notes";
+ CFBundleTypeExtensions = (tmReleaseNotes);
+ CFBundleTypeIconFile = Text;
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "TextMate theme";
+ CFBundleTypeExtensions = (tmTheme, tmtheme);
+ CFBundleTypeIconFile = 'TextMate Theme';
+ CFBundleTypeRole = Editor;
+ },
+ { CFBundleTypeName = "TextMate bundle";
+ CFBundleTypeExtensions = (tmBundle, tmbundle);
+ CFBundleTypeIconFile = 'TextMate Bundle';
+ CFBundleTypeRole = Editor;