1. 1 前書き
    1. 1.1 このドキュメンテーションについて
    2. 1.2 TextMateの理念
    3. 1.3 用語
    4. 1.4 制限
  2. 2 複数のファイルを使用する
    1. 2.1 (タブと一緒に)プロジェクトを作る
      1. 2.1.1 自動的にアップデートするプロジェクト
      2. 2.1.2 必要ないファイルをフィルタリングする
      3. 2.1.3 テキストファイルとバイナリファイル
      4. 2.1.4 プロジェクトドロワのポジショニング
    2. 2.2 プロジェクト内での検索と置換
    3. 2.3 優雅にファイル間を移動
  3. 3 ナビゲーション / オーバービュー
    1. 3.1 ブックマーク
    2. 3.2 テキストブロックを折りたたむ (フォールディング)
      1. 3.2.1 折りたたみのカスタマイズ
    3. 3.3 ファンクション(関数)ポップアップ
      1. 3.3.1 リストをカスタマイズする
  4. 4 テキストでの作業
    1. 4.1 自動的にペアになる文字(引用など)
    2. 4.2 補完
    3. 4.3 コピー・ペースト
      1. 4.3.1 クリップボードヒストリー
      2. 4.3.2 インデントし直されたペースト
    4. 4.4 編集モード
      1. 4.4.1 フリーハンドモード
      2. 4.4.2 上書きモード
    5. 4.5 検索と置換
      1. 4.5.1 検索ダイアログに改行とタブを挿入する
      2. 4.5.2 検索クリップボード
    6. 4.6 テキストの移動
      1. 4.6.1 インデントレベルを上げる/下げる
      2. 4.6.2 テキストを上下左右に移動する
      3. 4.6.3 テキストをインデントし直す
    7. 4.7 テキストの選択
      1. 4.7.1 複数の行を編集する
      2. 4.7.2 カラムの選択
    8. 4.8 カラムの移動/タイピング
    9. 4.9 スマートタブの振る舞い
    10. 4.10 スペルチェック
    11. 4.11 タブの代わりにスペースを使う
  5. 5 Bundles
    1. 5.1 バンドルアイテムの有効化(アクティベーション)
      1. 5.1.1 Key Equivalents (キーボードショートカット)
      2. 5.1.2 Tab Triggers (タブトリガー)
    2. 5.2 Editing Default Bundles / Items デフォルトのバンドル/アイテムの編集
    3. 5.3 Deleting Default Bundles / Items デフォルトのバンドル/アイテムの削除
    4. 5.4 Hiding Bundles バンドルを隠す
    5. 5.5 Sharing Bundles and Bundle Items バンドルとバンドルアイテムを共有する
    6. 5.6 Assorted Bundles さまざまなバンドル
      1. 5.6.1 Diff
      2. 5.6.2 HTML
      3. 5.6.3 LaTeX
      4. 5.6.4 Source
      5. 5.6.5 SQL
      6. 5.6.6 Subversion
      7. 5.6.7 Text
      8. 5.6.8 TextMate
      9. 5.6.9 Xcode
    7. 5.7 Getting More Bundles もっとバンドルを手に入れる
      1. 5.7.1 Installing Subversion Subversionをインストールする
      2. 5.7.2 Setting LC_CTYPE LC_CTYPEを設定する
      3. 5.7.3 Installing a Bundle バンドルのインストール
      4. 5.7.4 Support Folder (サポートフォルダ)
      5. 5.7.5 RSS Feed With Bundle Change Log バンドル変更履歴のRSSフィード
  6. 6 マクロ
  7. 7 Snippets (スニペット)
    1. 7.1 Plain Text (プレーンテキスト)
    2. 7.2 Variables (変数)
    3. 7.3 Interpolated Shell Code (補完されたシェルコード)
    4. 7.4 Tab Stops
    5. 7.5 Placeholders (プレースホルダ)
    6. 7.6 Mirrors (ミラー)
    7. 7.7 Transformations(変形)
  8. 8 Shell Commands (シェルコマンド)
    1. 8.1 Executing Commands / Filtering Text コマンドの実行/テキストのフィルタリング
    2. 8.2 Search Path サーチパス
  9. 9 環境変数
    1. 9.1 動的変数
    2. 9.2 静的変数
    3. 9.3 コンテクスト依存変数
    4. 9.4 プロジェクト依存の変数
  10. 10 コマンド
    1. 10.1 Command Input
    2. 10.2 コマンドアウトプット
    3. 10.3 HTML アウトプット
    4. 10.4 コマンドのアウトプットタイプを変更する
    5. 10.5 便利なbash関数
    6. 10.6 Dialogs (Requesting Input & Showing Progress)
  11. 11 ドラッグコマンド
  12. 12 Language Grammars
    1. 12.1 Example Grammar
    2. 12.2 Language Rules
    3. 12.3 Rule Keys
    4. 12.4 Naming Conventions
  13. 13 スコープセレクタ
    1. 13.1 要素名
    2. 13.2 子孫セレクタ
    3. 13.3 要素を除外する
    4. 13.4 グルーピング
    5. 13.5 マッチのランク付け
  14. 14 テーマ(Themes)
    1. 14.1 共有
  15. 15 Preferences Items 設定アイテム
    1. 15.1 Completions 補完
    2. 15.2 Indentation インデント
    3. 15.3 Symbol List シンボルリスト
    4. 15.4 Paired Characters ペアになる文字
    5. 15.5 Other その他
  16. 16 Key Bindings
    1. 16.1 Bundle Items
    2. 16.2 Menu Items
    3. 16.3 Text Move / Edit Actions
      1. 16.3.1 List of Standard Key Bindings
    4. 16.4 Conventions
  17. 17 Templates テンプレート
  18. 18 Printing (印刷)
  19. 19 Saving Files ファイルの保存
    1. 19.1 Atomic Saves 原子性での保存
    2. 19.2 Creator Code (クリエータコード)
    3. 19.3 Encoding (エンコーディング)
    4. 19.4 Extended Attributes (Metadata) 拡張された属性(メタデータ)
    5. 19.5 Save Automatically when Focus Is Lost フォーカスがなくなったときに自動的に保存
  20. 20 正規表現
    1. 20.1 イントロダクション
      1. 20.1.1 外部リソース
    2. 20.2 TextMateでの正規表現
    3. 20.3 シンタックス (鬼車)
    4. 20.4 置換文字列シンタックス(フォーマット文字列)
      1. 20.4.1 キャプチャ
      2. 20.4.2 コードフォールディング
      3. 20.4.3 条件付きの挿入
      4. 20.4.4 エスケープコード
  21. 21 他のアプリケーションからTextMateを使用する
    1. 21.1 シェル/ターミナル
      1. 21.1.1 一般的な EDITOR 変数
      2. 21.1.2 Git エディタ
      3. 21.1.3 TeX エディタ
      4. 21.1.4 lessでの編集
    2. 21.2 URLスキーム (HTML)
    3. 21.3 ODBエディタスイート
    4. 21.4 Cocoaテキストフィールド
  22. 22 エキスパートのための設定
    1. 22.1 NSDragAndDropTextDelay
    2. 22.2 NSRecentDocumentsLimit
    3. 22.3 OakBundleItemsPopUpMenuKeyEquivalent
    4. 22.4 OakBundleManagerDisambiguateMenuFontSize
    5. 22.5 OakDefaultBundleForNewBundleItems
    6. 22.6 OakDefaultLanguage
    7. 22.7 OakDisableSessionRestore
    8. 22.8 OakDocumentCustomFSMetaData
    9. 22.9 OakDocumentDisableFSMetaData
    10. 22.10 OakFindPanelDisableHistory
    11. 22.11 OakToolTipMouseMoveIgnorePeriod and OakToolTipMouseDistanceThreshold
    12. 22.12 OakWrapColumns
    13. 22.13 OakWordsExcludedFromCapitalization
  23. 23 ヘルプをえる
    1. 23.1 メーリングリスト
    2. 23.2 IRC チャンネル
    3. 23.3 他のリソース
      1. 23.3.1 TextMate チートシート
      2. 23.3.2 TextMate Tutorials
      3. 23.3.3 スクリーンキャスト
  24. 24 Appendix
    1. 24.1 Property List Format
      1. 24.1.1 Strings
      2. 24.1.2 Arrays
      3. 24.1.3 Dictionaries
    2. 24.2 Indentation Rules
      1. 24.2.1 Introduction
      2. 24.2.2 The System
      3. 24.2.3 Increase Pattern
      4. 24.2.4 Decrease Pattern
      5. 24.2.5 Increase Only Next Line
      6. 24.2.6 Ignoring Lines
    3. 24.3 Plug-in API

1 前書き

1.1 このドキュメンテーションについて

ドキュメンテーションの使用目的はTextMateの主な特徴を説明し、はじめて使うユーザにとってはっきりとわからないかもしれない特徴を明らかにすることです。このドキュメンテーションは包括的ではありません。

あなたはテキストエディタが何であるかについてをよく理解してあるべきです。特にあなたはTextEdit, MailやXcodeなどで使われているCocoaのテキストエディットコントロールの経験があるべきです。TextMateはそのコントロールを使用しませんが、大部分のふるまいに似せています。

もしあなたが、このドキュメンテーションを印刷したいなら、こちらに印刷可能なバージョンがあります

1.2 TextMateの理念

Unixから私たちは、タスクとトレンドは変化する(Tasks and Trends Change.)ということを理解します。具体的な言葉でいうとこれは、手元にある問題を解決するために(Unixで)コマンドを書くのに代わり、私たちは内在するパターンを見つけ、そのタイプの問題を解決するためのコマンドを書き、そしてスクリプトの中でコマンドを使用します。

これによって私たちは同じタイプの複数の問題にたいして、将来再利用できるコマンドをえることができます。さまざまなコマンドのスクリプトをまとめる方が個別のコマンドをかくよりもっと簡単で(そしてもっと柔軟性)があるので、生産性の向上はとても大きくなりうります。このことは、私まずはじめに私たちが実際にコマンドを書かずに、同じ種類の問題についてすでに書かれたコマンドを使うのであてはまります。

TextMateがこの理念をりようする方法は二つあります。まず、優れたシェルの統合をもつこと、なので、あなたがUnixシェルを使う技術があれば、あなたは、TextMateを好きになるはずです。

しかし、さらに曖昧にいえば、TextMateは退屈なことを自動化する背後にある内在されたパタンを見つけ出し、何をすべきかについて賢明で、それであなたがあなたの個々のニーズのために組み合わせられるような機能を提供します。

もちろん、TextMateは広範囲をカバーしようとする最初のテキストエディタではありません。しかしAppleからわれわれは貴重なKeep It Simpleということを学びます。だからスクリプティングや正規表現の経験がほとんどあるいはまったくないユーザでさえ、ほかのエディタではできないような方法でTextMateをカスタマイズできます。

そういうわけで、TextMateの理念はEducate the User.ということにもあります。そのためTextMateが提供するものをあなたがフルに活用するためにはあなたは、正規表現について学ぶべきです。あなたはTextMateのスコープスニペットシステム、(また、language grammarsをある程度理解すべきです)、そして(特に環境変数,パイプ、stdin/stdout)で提供される)シェルのインフラストラクチャが何かついて知っているべきです。

1.3 用語

だいたいの部分に、TextMateとこのドキュメンテーションはAppleの用語に従います。以下は誤解の原因になるかもしれない用語の表です。

用語 説明

キャレット

テキスト挿入ポイント。

カーソル

マウスポインタ。

ドキュメント

これは、(編集される目的で)TextMateへロードされたファイルを指します。昔からのユーザはよくこれをバッファと呼びます。

ディレクトリ

これはフォルダのかわりによく使われます。フォルダは主にGUIについて話すときにつかわれます、そして、ディレクトリはシェルに関連したことを話す際に使われます。

概してTextMateとこのドキュメンテーションはキーのグリフ表示を使います。以下はほとんどのグリフと(よくこのドキュメンテーションで使われるような)キーの名前と短い説明の表です。

Keyboard Viewer

もしあなたがキーのがどこにあるか自信がない場合、あなたは、キーボードビューワを出すことができます。(それはシステム環境設定の国際ペーンのなかのインプットメニューに加えることが可能です。)

グリフ キーの名前 説明

コントロール

このキーは一般的に左の下側にあります。(そして対照的に右側にもあります。)対応するキーだけでなく、このキーはコンテクストに依存したメニューを出すために、マウスクリックとともに使われることもあります。

オプション

これはコントロールキーの隣にあり、よくAltというラベルがついています。あなたは長方形にテキストを選択するためにマウスを使いながらオプションキーを押さえたままにできます。また、オプションキー(⌥)を押さえながら、一度マウスをクリックすることによって、行の最後より右の場所にキャレットをおくこともできます。シフトといっしょに、オプションキーであなたがクリックする場所へ(長方形の)選択部分を作ることができます。

コマンド

コマンドキーはアップルキーとして呼ばれることもあります。なぜならアップルのシンボル()がついているからです。

シフト

シフトキーはよく知られているはずです。マウスクリックといっしょに使うと、選択範囲を広げることができます。

エスケープ

エスケープキーは一般的にキーボードの左上の角にあります。 このキーはpanelsを退ける(キャンセルする)。panelsとはダイアログや(全てではないが)いくつかのウインドウという意味です。TextMateでは、補完候補を循環するために使われることもあります。

エンター

エンターキーは数字キーパッドにあります(、そしてそれはリターンキーと同じではありません。)ラップトップではファンクション- リターンにあたります。

リターン

リターンキーはよく知られているでしょう。

フォワード・デリート

これはよくデリートと呼ばれ、キーボードにDelやDeleteと書かれています。

バック・デリート

よくバックスペースと呼ばれます。たいていのキーボードでは 左向きの矢印がキー(←)にあります。

﹖⃝

ヘルプ

ヘルプキーはフォワード・デリートの上に位置します、しかし全てのキーボードにあるわけではありません。一般的にHelpとキーに書かれています。しかし、Insキーとしても知られています。

ホーム

ホームキーはドキュメントの最初にスクロールさせます、しかしキャレットは動きません。

エンド

エンドキーはドキュメントの最後にスクロールさせます、しかしっキャレットは動きません。

ページアップ

キャレットを動かさずに一ページ分上にスクロールします。オプションキーを使ってキャレットを動かすことができます。シフトキーと使うと、選択部分を作ります。

ページダウン

キャレットを動かさずに一ページ分下にスクロールします。オプションキーを使ってキャレットを動かすことができます。シフトキーと使うと、選択部分を作ります

タブ

タブはタブ文字(もしくは、もしソフトタブを有効にしていれば、同等のスペースの数を挿入するのに使われます。通常のコントロールでは、フォーカスを次のコントロールへ進めます。

バックタブ

バックタブキーはシフトを押さえながら、通常のタブキーを押すことによって使われます。

1.4 制限

TextMateは未完成です。(西洋系以外のユーザにとって)現在の重要な制限は(CJKのような)国際的なインプットモード、プロポーショナルフォント、右から左へのテキストレンダリングと他の(ユニコードの)機能のサポートです。作者として、私はユーザがTextMateにこれらのサポートを望んでいることを理解しています。しかし、今のところ適切なサポートは長期間のto-doアイテムです。

そして、制限のトピックについて、私はまた(s)ftpの統合、コード・ヒント、スプリットビュー、よりよい印刷、インデントされたソフトラップ、コーヒーメイキングそして文字通り何百もの他のユーザリクエストを知っています。あなたは[メーリングリストを検索]することによってアーカイブからほとんどの機能リクエストについての私のコメントを見つけることができるでしょう。しかし、私が何かが現れるバージョン番号以外に、私は見通しや期間を示しません。

2 複数のファイルを使用する

2.1 (タブと一緒に)プロジェクトを作る

現在のTextMateのバージョン(1.5)では、ファイルタブはプロジェクトが作成されているときのみサポートされています。幸運なことに、プロジェクトを作成するのは簡単です。つまり→ New Project (⌃⌘N)を選択するだけです。

これで下のようなウインドウが開きます。

Project Window

ファイルを(プロジェクト)ドロワにドラッグするか、(ギアのアイコンがついた)プロジェクドロワアクションメニューから、“Add Existing Files…”を使うことによってファイルを追加することが可能です。

プロジェクトを作成する別の方法は、複数のファイルを直接(例えば、Dockにある)TextMateアプリケーションアイコンにドラッグすることです。これは、これらのファイルからなる新しいブロジェクとを作成する近道です。

もうひとつのたいしたことのない詳細は、このようにプロジェクトを作成すると、プロジェクトを閉じるときに、プロジェクトを保存したいかどうかを尋ねられないということです。

プロジェクトを保存すること利点は、(例えばどのファイルが開いていたかという)状態を保全でき、すぐに特定のファイル群を開くことができることにあります。もし、TextMateを修了するときに(保存された)プロジェクトを開いたままにしておくと、そのプロジェクトは次にTextMateを起動したときに自動的に開きます。

またターミナルからプロジェクトを作ることも可能です。たとえば、mateシェルコマンドをつかって。

2.1.1 自動的にアップデートするプロジェクト

プロジェクトがディスクにあるファイルとフォルダーを模倣するためには、フォルダーをTextMateのアプリケーションアイコンかプロジェクトドロワにドラッグすることもできます。

TextMateはディスクでの変化にあわせてフォルダの中身を自動的にアップデートする、フォルダレフェレンス (folder reference)を作ります。

Project Window With Tabs

現在のところ、アップデートはTextMateにフォーカスが戻ったときにされ、ネットワーク上のマウントされたディスクでは遅いかもしれません。その場合は、プロジェクトに追加したいファイルのみを追加し、解決した方がいいかもしれません。(追加されたファイルはディスクでの構造をまねるために手動でグループ化し並び替えることもできます。)

この、ネットワーク上のマウントされたディスクでの更新の遅れについては、将来のリリースで解決される予定です。

2.1.2 必要ないファイルをフィルタリングする

フォルダレフェレンスを使っているとき、あなたはある個別のファイルやフォルダをプロジェクトから除外したいとおもうかもしれません。これは、Preferences → Advanced → Folder Referencesの中にあるファイルとフォルダのパタンを変えることによって可能です。

Folder Reference Patterns

それぞれのファイルとフォルダの完全なパスにマッチする正規表現があります。もしそのパタンがアイテムとマッチしたら、そのアイテムは含まれます。そうでなければ、除外されます。これを反対にするためには、つまりマッチしたものをプロジェクトから除外するには、感嘆符(!)をパタンの前につけます。

パタンは新しいフォルダを作るときだけ使われます。現在のフォルダレファレンスには、プロジェクトドロワの中のフォルダレフェレンスを使うことができ、プロジェクトドロワの(文字を丸で囲んだIという)インフォボタンを使い、パタンを編集することができます。

このシステムの複雑さは将来のバージョンで解決される予定です。

2.1.3 テキストファイルとバイナリファイル

プロジェクトドロワのファイルはシングルクリックもしくはダブルクリックすることができます。もしシングルクリックをして、そのファイルのタイプがテキストであれば、そのファイルはメインウインドウのタブで開きます。

Tab Bar

もしファイルをダブルクリックすると、そのファイルはデフォルトのアプリケーションで開きます。フォルダーもダブルクリックされることがができることを覚えておいてください。例えばInterface Builderのnibファイルはフォルダとして表示され、ダブルクリックされることができ、(そして、Interface Builderで開きます。)

前述のように、テキストファイルのみがメインウインドウで、シングルクリックされたときに開かれます。TextMateが、ファイルがテキストかどうかを判断する方法は、ファイルの拡張子によってです。 - もし拡張子が不明の場合ファイルの最初の8 KBを読み、それが有効な(ASCIIの上位集合である)UTF-8であるかどうかをチェックします。

もしTextMateがあなたのファイルを開かず、そのファイルがアクションメニューを表示させる拡張子を持っている場合、その最後に以下のように表示されるはずです。Treat Files With “.«ext»” Extension as Text (".«ext»"拡張子をもつファイルをテキストとして扱う)

2.1.4 プロジェクトドロワのポジショニング

デフォルトでは、プロジェクトドロワはプロジェクトウインドウの左側に開きます。もし左側に十分なスペースがない場合は、右側に開きます。この設定は固定されます。なので、どちら側でドロワが最後に開いたかを記憶します。

Project Drawer

左側に戻すためには、いったんドロワを閉じ、(View → Hide Project Drawer)、それから右側にスペースがないようにプロジェクトウインドウを移動させます。それから、ドロワを再度開きます。そうすればまた左側に開きそれが新しいデフォルトとなります。

右側に強制的に開きたいばあいはその反対を行ってください。

2.2 プロジェクト内での検索と置換

Edit → Find → Find in Project… (⇧⌘F) を使って下にあるようなウインドウを表示させることができます。

Find In Project

ここから現在のプロジェクトのなかのすべての(テキスト)ファイルを検索し置換することができます。Findを押した後、Replace All(全て置換)もしくはどのマッチが置換されるべきかを選択することができます。その場合には、Replace AllボタンはReplace Selectedに変わります。

現在のところ、プロジェクト全体の全てのテキストファイル以外の何かに検索の対象をしぼる事はできます。事前策としては、もしあなたがプロジェクトのサブセットだけを検索したい場合、あなたはプロジェクトドロワのなかのファイルを選択して、その選択をTextMateのアプリケーションアイコンにドラッグして、全く新しいプロジェクトを作ることができます。検索/置換はそのプロジェクトで実行され、そのあと閉じることができます。

2.3 優雅にファイル間を移動

プロジェクトで作業をしているとき、開いているファイル間を移動する2、3の方法があります。

もっとも簡単な方法はあなたが使うファイルのタブをクリックすることです。また、キーボードからは⌘1から9を押すことで可能です。ファイルタブの1から9へスイッチできます。

またあなたは、現在のタブの左か右のファイルのタブを選択するためには⌥⌘← と ⌥⌘→を使うことができます。

マウスを使ってファイルタブ並べ直すことが可能です。(タブの上でマウスボタンをクリックしホールドして、その後、新しい場所へドラッグします。)このようにして、キーボードでのスイッチングがより自然になるように、並び替えることができます。

もう一つのキーが⌥⌘↑です。現在のファイルと同じベースネームをもったファイルのテキストファイルへの移動を繰り返します。これは、主にインターフェイスファイル(ヘッダ)と実装ファイル(ソース)をもつ言語での作業で役に立ちます。

もし開いていないファイルへ移動したい場合、NavigationメニューにあるGo to File…(⌘T)アクションを使うことができます。これは、下のようなウインドウを開きます。

Go To File

このウインドウは最後の使用に従って、プロジェクトの全てのテキストファイルのリストを表示します。つまり、リターンを押すとあなたが最後に使用したファイルへ移動します。このように使うと、最近使ったファイルへ簡単に移動できます。

あなたは表示されるファイルの数を少なくするためにフィルタ文字列を入力することができます。このフィルタ文字列は省略形としてファイルネームに対してマッチします。それでファイルは与えられた省略形に対してどのくらいよくマッチするかによって並べ替えられます。例えば、上の画像ではフィルタ文字列はotvです。それでTextMateはOakTextView.hがベスとマッチだと(一番上に表示することによって)決めています。

私が必要としているファイルは#2にランクしているOakTextView.mmです。しかし、私はすでに過去に修正したので、TextMateはこれがotvというフィルタ文字列とうまくいくマッチだと学びます。つまり、これは適応/順応的であり、あなたの使い方のパタンから学びます。

3 ナビゲーション / オーバービュー

3.1 ブックマーク

もしあなたがキャレットをそのドキュメントのどこか別の場所に動かす必要があって、また早く戻ってくる必要があれば、あなたは現在の行にブックマークを設定することができます。

これは、(ブックマークのためにある列の)ガッターをくりっくするか、⌘F2を押すことによってなされます。ブックマークは以下のように星印で示されます。

Bookmark

あなたが、元の場所に戻りたいとき、F2を押してください。F2はあなたをドキュメントの次のブックマークの位置へ動かします。もし、複数のブックマークがある場合、あなたはF2を何回か押すことができます。⇧F2を押すと前のブックマークへ移動します。

3.2 テキストブロックを折りたたむ (フォールディング)

{}, doend, <tag></tag>のように、もしあなたが、ブロックにスタートとエンドのマーカーを持っている言語を使用しているとき、TextMateはこのブロックを見つけて、上向きと下向きの矢印をスタートとエンドマーカーのガッターに表示します。

この矢印が表示されているとき、上下の矢印の表示をマウスでクリックするか、もしくはF1キーを押すことによってブロックを一つの行にたたむことが可能です。これは、ガッターの矢印を右向きに変え、全てのブロックが行末におかれたellipsisのマーカーを置くことによってたたまれたことを示します。二つのconstructorのサブブロックがたたまれた場合の例は以下のようになります。

Folded Blocks

テキストがたたまれた場合、F1を押すかもしくはガッターの矢印かellipsisのイメージを押すことによって広げることができます。また、マウスをellipsisイメージの上に置いてたたまれたブロックの中身を示すツールチップを出すことも可能です。後者の方法は、次の画像で示されます。

Folding Tool Tip

警告:折り畳む機能は両方がともにはっきりとしたインデントマーカーをもっていて、かつスタートとストップマーカーが同じインデントレベルにあることを基礎としています。つまり折りたたみは純粋にインデントに頼っているため、スタートとストップマーカーがalignしていない場合は現在サポートしていません。

3.2.1 折りたたみのカスタマイズ

前述したように、折りたたみのシステムははっきりと決められたスタートとストップマーカーを使用します。TextMateはこのことを、あなたがfoldingStartMarkerfoldingStopMarkerの正規表現を設定できる、language grammarから知ります。

Folding Patterns

上に見えているのはHTMLの折りたたみのパターンです。これは、行のタグのペアやHTMLコメント、Smartyタグとスタート/ストップのブレース(大括弧)のセットをもとにして折り畳まれているので比較的シンプルです。

<?php if(something) { // user is authenticated ?>

   ...

<?php } // user is authenticated ?>

行のスペース以外のキャラクターとして{から始まり、行の最初のスペースでないキャラクタとして}で終わるブロックを定義するには、次のようなパターンを使うことができます。

foldingStartMarker = '\{\s*$';
foldingStopMarker = '^\s*\}';

3.3 ファンクション(関数)ポップアップ

ファンクション(関数)ポップアップをサポートする言語に関しては、ステータスバーの一番右のポップアップが現在の“シンボル”をしめします。(キャレットの上の関数プロトタイプや見出しであることもありますが。)

Status Bar

ポップアップをクリックして現在のドキュメントの全てのシンボルのリストを出し、他のシンボルへキャレットを移動させることができます。これは以下のように示されます。

Function Pop Up

キーボード操作に関しては、以下のようなパネルを開くNavigation → Go to Symbol… (⇧⌘T)があります。このペインの中身はステータスバーのポップアップと同じですが、このパネルはGo to File… panel に似たようなフィルタリングをサポートします。(つまりフィルタリングの文字列は省略形として扱われ、照合はその省略形がどのくらいフィットするかによってランクされます。

Symbol List

パネルは表示されたままになりドキュメントが編集されるにつれて自動的にアップデートされます。リストの中のアイテムをシングル・クリックすると、キャレットはクリックされたシンボルへ移動します。ダブルクリックすると同じ動作をしますが、パネルは閉じられます。

3.3.1 リストをカスタマイズする

シンボルリストはlanguage grammarsscope selectorsを使用して動作します。ランゲージグラマーはドキュメントのそれぞれのエレメントに名前を付与し、スコープセレクタはその名前に基づいてドキュメントのsubsetをターゲットにすることができます。普通は、そのパラレルはHTMLとCSSです。例えば、バックグラウンドを青に設定するテーマアイテムを作り、その後、スコープセレクタでドキュメントのどのエレメンツにこのテーマ(青いバックグラウンド )が適用されるのを必要とするかを選びます。

視覚の設定を変えるのではなく、(一般的に)視覚ではない背ていを変更するという点以外は、バンドル設定もテーマアイテムと同じように動作します。例外のひとつはshowInSymbolListです。これを1に設定して、例えば全ての\関数の名前をターゲットにするスコープセレクタを使用することによって、シンボルリストで使うための、ドキュメントから全ての関数の名前を抽出するクエリとしてスコープセレクタを使っていることになります。

シンボルリストをpopulateするために必要なのは:

  1. ランゲージグラマーが表示したいものに名前を付与していると確かめること。

  2. showInSimbolList1に設定して、シンボルリストに必要としているシンボルにマッリするスコープセレクタをを作る、バンドル設定アイテムを作ること。

showInSymbolList設定に加えて、抽出されるテキストを基に機能する一つかそれ以上の正規表現substitutionsであるsymbolTransformationがあります。この設定の値はs/«regexp»/«format»/«options» でなければいけません。オプションとして、:とさらなるsubstitutionsを追加できます。また、値にコメントを付加することも可能です。これは、#で始まり、次のnewlineの最後に終わります。

なので、もしリストに(一つかそれ以上の#マークで始まる、Markdownの見出しを表示したい場合、まず初めにランゲージグラマーで次のように特定することによって、このルールによって特定されうるマークダウンのために、ランゲージグラマーが見出しに名前を付与していることを確認します

{  name = 'markup.heading.markdown';
   match = '^#{1,9}\s*(.*)$';
},

これでmarkup.heading.markdownというスコープセレクタを使って全ての見出しをターゲットにできます。これでバンドル設定アイテム簡単に作成できます:

{  showInSymbolList = 1;   }

このままでは最初の#マークまでリストに含んでしまうので、理想的ではありません。実際のタイトルに(ランゲージグラマーを通じて)名前を付与するか、もしくは最初の#を取り除くために正規表現substitutionを実行することができます。後者は好都合です。これらをインデントへ変え、設定アイテムを次のように変えることによってできます。

{  showInSymbolList = 1;
   symbolTransformation = '
      s/(?<=#)#/ /g;          # change all but first # to m-space
      s/^#( *)\s+(.*)/$1$2/;  # strip first # and space before title
   ';
}

4 テキストでの作業

TextMateはほとんどの部分は、MailやSafariや基本的な全ての他のCocoaアプリケーションによって使われているシステムコンポ年とであるNSTextViewの振る舞いをまねようとしています。

このセクションではテキスト編集に関連した、その他の機能の一部をカバーします。

4.1 自動的にペアになる文字(引用など)

(マークアップやソースコードのような)構造化されたテキストを書くとき、ペアになる文字があります。例えばプログラミング言語では、左中括弧({)を使って、右中括弧(})を使わないといったことは滅多にありません。

あなたがこれらの文字の釣り合いを保つために、TextMateは、あなたが開始文字をタイプしたときにキャレットの後に、適切な閉じる文字を挿入します。もしあなたが閉じる文字をタイプした場合、TextMateはとても賢いので自動的に挿入されたものを上書きします。もしあなたが開始文字をタイプしそれをバックデリート(⌫)を使って削除すると、自動的に挿入された文字も削除されます。もしあなたが自動的に挿入された文字のみを削除したいなら、代わりにフォワードデリート(⌦)を使ってください。

またテキストを選択し、開始文字によって、開始/終了文字で選択範囲を包むことができます。例えば、fooとタイプして、それを選択し、(をタイプします。そうすると、TextMateはそれを(foo)にして、最後の括弧の後にキャレットを移動します。

実際の文字ペアは、さまざまな言語とコンテキストのさまざまな設定といっしょにbundle preferencesで定義されています。例えば、ソースコードではアポストロフィは、コメントや文字列を除き、それ自身が週虜文字として登場するまでセットされます。これはスコープセレクタを使う事によって実現しています。

Source bundleのマクロとして定義され、いくつかの言語では上書きされる)自動にペアになった文字に関連してふたつのショートカットは:

  1. ⌘↩
    行の最後に移動し、新しい行を挿入する。 例えば、もしあなたが、以下のように書き:

    print("foo
    

    キャレットの右側に")があると、⌘↩を使って、この二つの文字を飛ばして、新しい行を挿入します。

  2. ⇧⌘↩
    行の最後へ移動し、;を挿入し、新しい行を挿入します。

4.2 補完

TextMateには、シンプルですが、効果的な補完機能が⎋(エスケープ)にあります。これは、現在のドキュメントの中でのマッチをベースにした現在の語を補完します。もし、複数のマッチがあれば、⎋を押すことで順に移動できます。⇧⎋を使うことによって逆順に移動もできます。

マッチはキャレットからの距離によって並び替えられています。つまり、キャレットに近い候補は遠い場所にある候補より先に表示されます。

このデフォルトの補完機能を強化するには二つの方法があります。両方ともバンドルの設定によって実現します。

最初のオプションは常に推薦されるべき候補のリストを提供することです。例えば、Objective-CバンドルにはCocoaフレームワークでよく使われるメソッドのリストがあります。これは、候補の配列です。例えば:

completions = ( 'retain', 'release', 'autorelease', 'description' );

もう一つの方法は、候補を集めるためのシェルコマンドをカスタムで設定することです。シェルコマンドは他の変数といっしょ、(補完される言語で)利用可能なTM_CURRENT_WORD環境変数

例えば、Cバンドルにはキャレットがpreprocessor include directiveの中にある時のためのカスタムの補完コマンド設定があります。以下のようなものです:

completionCommand = 'find "$TM_DIRECTORY" \
    -name "$TM_CURRENT_WORD*.h" -maxdepth 2 \
    -exec basename "{}" \;|sort';

これは、現在の語をprefixとして、.h拡張子を持っている、現在のディレクトリ(とその直下のサブディレクトリ)にあるいかなるファイルにもマッチとして見つけます。

あなた自身の補完コマンド(またはリスト)を提供すると、デフォルトのマッチを無効化したいかもしれません。これは、disableDefaultCompletion1にセットすることで可能です。

4.3 コピー・ペースト

4.3.1 クリップボードヒストリー

テキストをコピーまたはカットすると毎回、テキストはスタックにに押し出されます。

⌃⌥⌘Vを押すと全ての過去のクリッピングのリストを見ることができ、そこから矢印キーを使ってペーストしたいものを選ぶことができます。挿入するにはリターン、リストを消すためにはエスケープを使ってください。リストを消すと、現在選択されたクリッピングが次のときにペースト機能を使ったときにペーストされます。

Clipboard History

リストからクリップを選ばなくても、リストの前のクリップをペーストするのに、⇧⌘Vを使うことができます。もう一度キーを押すともう一つ前のクリップへと移動します。戻るには、⌥⌘Vを使えます。これらのキーボードショートカットは、一つのドキュメントから複数のコピーを作って、LIFO-style (Last In First Out)で他のドキュメント(もしくは同じドキュメントの他の場所)にペーストする際に便利です。

4.3.2 インデントし直されたペースト

テキストをペースとするときに、TextMateは、現在のインデントのレベルだけでなく、ペーストされるテキストのインデントを見積もり、現在のインデントとマッチするようにペーストされるテキストを調節します。

テキストをインデントし直すのセクションで触れられるインデントルールを使って見積もられます。

もし一時的にこれを回避したい時は、⌃⌘Vを使ってペーストできます。また、PreferencesのText Editingにて永久にテキストがインデントし直されるのを無効化できます。

4.4 編集モード

4.4.1 フリーハンドモード

Edit → Mode submenu (⌥⌘E)でフリーハンド編集を有効化/無効化でいます。

このモードが有効化されているとき、キャレットの移動は行末やタブストップに制限されません。

これは、いくつかの行のある一定の列に何かを挿入し、(そしてパディングを挿入したくない)ときやその他のシチュエーションで、ASCIIダイアグラムでの作業に役に立ちます。

列の選択をしているときは、フリーハンドモードは(一時的に)有効化されるため、行末を超えて、選択範囲を作ることができます。

オプションキー(⌥)を押しながらマウスをシングルクリックすることによって、行末を超えた場所にキャレットを置くことも可能です。

4.4.2 上書きモード

Edit → Mode サブメニュー (⌥⌘O)で上書きモードを有効にすることによって、ドキュメントにすでにある文字はいつものように挿入されず、あなたがタイプするにしたがって上書きされます。

これは以下のようなカラムデータで作業をするとき便利です:

foo     jaz
bar     sub
fud     dub

最初のカラムの値のいくつかを上書きしたいときを想像してください。同じように、固定された幅のリストがあり、その一部を幅を保ちながら置換したいかもしれません。例えば、カラム20で右寄せしなければいけないが、レーベルを上書きしたい、以下のようなコードがあるかもしれません:

printf("Value is         %3d", 37).

4.5 検索と置換

スタンダードの検索ダイアログに加えて、TextMateには、検索と置換アクションのためのショートカットをもった(Editメニューにある)Findサブメニューがあります。

Find Menu

4.5.1 検索ダイアログに改行とタブを挿入する

検索ダイアログは、インプットを受け付けるために通常のシステムコントロールを使用しています。置換テキストフィールドの隣にある矢印を使うことによって、一行と複数行のテキストコントロールを切り替えられます。

Multi Line Find Dialog

もしテキストフィールドに改行やタブ文字を挿入する必要がある場合は、タブ(⇥)もしくは、リターン (↩) キーを押すときに、オプション(⌥)をホールドしておく必要があります。これで、リテラルのタブや改行文字が挿入されます。

4.5.2 検索クリップボード

⌘E と ⌘Gという二つの便利なキーボードショートカットがあります。初めのものは選択範囲を共有された検索クリップボードにコピーします。これは、多くのアプリケーションで動作し、⌘Gによって、その文字列が次にある場所を見つけることができます。

検索クリップボードはSafari, TextEdit, Mail, TextMate, Terminal, Consoleであれ、アプリケーション間で動作します。選択されたキスとを検索クリップボードにコピーして、アプリケーションを切り替え、その文字列を見つけるために、⌘Gを使用できます。

それに加え、TextMateは選択範囲を置換クリップボードにコピーする、⇧⌘Eを提供します。これは検索ダイアログに移動せずにすむため便利です。例えば、もし、アイテムのリストのために改行をパイプ文字(|)と置換したい場合、改行を選択し、それを検索文字列として使うために⌘Eを押してください。そして、|とタイプし、選択して、それが置換クリップボードにコピーされるように⇧⌘Eを押してください。

次のステップは、ドキュメント全体に対して置換を実行するために⌃⌘Fを押すか、置換を実行したい範囲を選択して⌃⇧⌘Fを押してください。

4.6 テキストの移動

4.6.1 インデントレベルを上げる/下げる

Textメニューには、Shift LeftとShift Rightアクションがあり、それぞれ ⌘[ と ⌘]が割り当てられています。これらは、一つのタブのサイズ毎にインデントの上げ、下げをします。

多くのヨーロッパのキーレイアウトでは、このキーはかなりやりにくい、ので、これに加えて、⌥⇥ と ⌥⇤を使うことができます。(⇤は⇧⇥を使って実現できます。)

4.6.2 テキストを上下左右に移動する

もし、一行やブロックを数行分上下に動かしたり、一単語/カラムを動かしたい場合は、⌃⌘をホールドして、矢印キーで選択範囲を動かせます。選択範囲なしだと、行を上下に移動します。

4.6.3 テキストをインデントし直す

それを選択して、Text → Indent Selectionを使うことができます。(もし選択範囲がない場合は現在の行をインデントします。)

The rules for estimating the indent are setup per-language using bundle preferences. For more details see the indentation rules section.

インデントの見積もりのルールはバンドル設定を使って言語毎に設定されます。インデントルールのセクション詳しくはを見てください。

4.7 テキストの選択

テキストの選択は、通常の移動に使うキーを使いながら&#x21E7をホールドすることによってできます。それに加えて、Edit → Selectのサブメニューには現在の語、行、パラグラフ、取り囲んでいるブラケットとドキュメント全体を選択するアクションがあります。

4.7.1 複数の行を編集する

一定の長さの複数の行の末尾に文字を追加したり、このこれらの行の最後の部分を編集する必要がある場合がよくあります。

このためにあなたは検索と置換を使うことができますが、より簡単な方法は、編集される必要がある行を選択し、Text → Edit Each Line in Selection (⌥⌘A)を使うと、キャレットが選択範囲の最初の行の最後に置かれます。

そしてあなたは新しいテキストをタイプしたり、削除したり、戻って、もともとのテキストを編集したりできます。これは(その前に選択された)全ての行へミラーされます。このモードを終了するためには、現在の行からキャレットをはずしてください。

4.7.2 カラムの選択

カラムデータを⌥をホールドしてマウスで選択範囲を作る事によって、もしくは、普通の選択範囲を作り⌥を一度押すこと(選択範囲のふたつのタイプの間をトグルする)によってカラムデータを選択することが可能です。

カラムの選択にはは全ての普通のアクションが実行可能です。例えば、選択の移動、選択の置換、(行の)トランスポーズ、Textメニューからのアクション、シェルコマンドを通しての、選択範囲のフィルタリングなど。

4.8 カラムの移動/タイピング

矢印キーの上下を⌥といっしょに使って、キャレットを現在のカラムの最初/最後の列に移動します。選択するためには⇧をホールドしてください。

Column Data

例えば、上に示すようなカラムデータをもっていて、キャレットがfooの前にあるとき、⌥⇧↓をおせば、キャレトがfudの前に移動して、foofudの間のテキストが選択されます。

Column Movement

⌥を押せば幅がゼロのカラム選択にスイッチして、それぞれの行をタイプし始めてください。

Column Typing

もしくは、⌥⇧→を使い、⌥を使ってください。(カラムモードで)カラム全体が選択された状態になります。

Column Selection

4.9 スマートタブの振る舞い

行のはじめでタブキーを使うと、TextMateはその行にとって正しいタブの数を推測し挿入します。もし行にテキストがある場合は、キャレットはこのテキストの前へ移動します。

もし行にすでに正しいインデント(もしくはそれ以上のインデント)がある場合は、一つのタブが挿入されます。

4.10 スペルチェック

TextMateはシステムワイドの'Check Spelling as You Type(タイプしながらスペルチェック)'をサポートします。これはEdit → Spellingで変更可能です。

間違ってスペルが書かれた文字がスペリングのサジェスチョンを得るためにはコンテキストメニューを出すことができます。

TextMateは構造化されたテキストの使用を意図しているため、ドキュメントの一部をチェックの対象から除外することがかのうです。これは、バンドルエディタのpreferences itemを作り、spellChecking0に設定し、スコープセレクタをスペルチェックをしないターゲットのセレクタに書き入れることでできます。

デフォルトではスペルチェックはソースコードでは文字列とコメントを除いて、無効化されています。またHTML, LaTex, Markdownなどではキーワードやタグのようなものでも無効化されています。

4.11 タブの代わりにスペースを使う

TextMateはタブ文字の代わりにスペースを使うことができます。これは、ステータスバーの"Tab Size"ポップアップをクリックし、Soft Tabsを有効にすることによって可能です。

この設定はは現在の言語にのみ影響します、共通の基礎をもった全ての言語はそのオプションがまだセットされていません。同じ事がスペルチェックの状態やソフトラップ、実際のタブサイズについていえます。

Tab Size Settings

ソフトタブが有効な状態のとき、TextMateはたいていの場合まるであなたがハードタブを使っているかのように振る舞います、しかしドキュメントは実際にはスペースを含んでいます。

5 Bundles

TextMateのたくさんの機能はさまざまなバンドルを通じて提供されます。多くのものは言語に依存です。

デフォルトのバンドルは、/path/to/TextMate.app/Contents/SharedSupport/Bundlesにあります。普通であればこのことは意識しなくてもいいです。Windowメニューにあるバンドルエディタを通して、バンドルをみたり、(編集したり)するからです。

5.1 バンドルアイテムの有効化(アクティベーション)

Bundles → Bundle Editor → Show Bundle EditorでTextMateをカスタマイズするためのコマンドセンタを表示できます。

Bundle Editor

このウインドウからスニペットやコマンド、言語の文法を作ったり編集したりします。詳しくは、後のセクションで説明します。

Bundle Editorで編集されるほとんどのアイテムはテキストを編集しているときに実行したいアクションを示します。TextMateはそのためにいくつかの方法を提供し、アクティベーションの方法がどのアクションにつながるかを調べる際に、現在のコンテクストを理解する、シンプルですが、パワフルな方法があります。このシステムは、後のチャプタで説明されますが、スコープセレクタとよばれます。

5.1.1 Key Equivalents (キーボードショートカット)

キーボードからアクションを実行する一番簡単な方法は、キーボードショートカットです。キーボードショートカットは任意のmodifierと任意のキーからなり、key equivalent フィールドを有効化してアクションと結びつけられるキーを押すことによって設定できます。

Key Equivalent

もしキーボードショートカットとアイテムの関係をなくしたいのであれば、key equivalentが入力されるmモードのときに、Xを押してください。

もし複数のアイテムに同じキーボードショートカットが付与されていると、そのショートカットが押されたときに、下のようなメニューが現れます。(Mathバンドルのすべてのアイテムが⌃⇧Cに割り当てられているので、すべての選択肢がメニューといっしょに表示されます。

Key Equivalent Ambiguity

5.1.2 Tab Triggers (タブトリガー)

バンドルアイテムにショートカットを割り当てることができるとともに、アイテムに対してタブトリガーを割り当てられます。これは、タブキー(⇥)の前に、あなたがドキュメントに入力するテキストです。これは、あなたが入力したテキストを削除し、バンドルアイテムを入力します。

例えば、TextバンドルにはISO 8601 (YYYY-MM-DD)に準拠した現在の日付を入力するスニペットがあります。このスニペットのためのタブトリガーは(ISO Dateの略である)isoDです。ドキュメントの中で、isoDとタイプし、タブを押すことで、そのテキストを現在の日付に”展開"することができます。

このようにして、あなたが文字通り実行したいものをタイプするように、あなたのバンドルアイテムに覚えやすい言葉を作ることができます。一般的に、この目的は思い出しやすくするためなので、省略語を使うのではなくて、実際の言葉を用いた方がよいです。(例えばlstの代わりにlistを使うように)。よってタブトリガーは最初に頭に浮かぶ、省略されていない形が使われるべきです。

タブトリガーは、少し丸みを持った四角の背景にタブトリガーの末尾に表示されたタブ文字(⇥)でメニューアイテムの右側に表示されます。

Tab Trigger Menu

タブトリガーはプログラムのキーワードとマッチさせて(例えばスニペットを挿入するように)あなたがいつもキーワードを入力した後に実行したいアクションを引き起こす際ににも便利です。例えば、Rubyではメソッドはdefではじまります。なので、Rubyのメソッドのためのスニペットを作って、defというタブトリガーを作れば、自然な流れになります。というのは、いつものようにdefとタイプして、そのまま普通に書いていくのではなくタブを使うことができるからです。もし仮に(Rubyで)メソッドを作るためのタブトリガーがmethodか何かであれば、あなたは、"私はメソッドののスニペットを挿入できる"とdefとタイプする前に覚えていなくてはいけません。一方defをタブトリガーに設定していれば、def と書いてその後にスペースを打つ前に思いだせばいいです。(基本的には、スペースの代わりにタブを押すだけです。)

キーボードショートカットと一緒で、タブトリガーを入力して、タブを押したときに、もし複数のアイテムが同じタブトリガーを使っていればメニューが表示されます。これは、簡易的な形のコード補完として使うことも可能です。例えばCSSではlistというタブトリガーはlistで始まるすべてのプロパティーに割り当てられています。なので、CSSでlistとタイプして、タブを押すと、そこからどのリストプロパティーが挿入されるベキかを選択できる、実用的なメニューを提供します。

Tab Trigger Ambiguity

5.2 Editing Default Bundles / Items デフォルトのバンドル/アイテムの編集

デフォルトのアイテムにはあなたの好みに合わないものもあるかもしれません。例えばスニペットのコーディングスタイルがあなたのコーディングスタイルと違ったりするとです。なので、ほかのタブトリガーやショートカットが欲しくなったり、修正をしたいと思うでしょう。

もしあなたがデフォルトのアイテムを編集すると、その新しいものとデフォルトのものの違いは~/Library/Application Support/TextMate/Bundlesに保存されます。この違いがそれから、デフォルトのバージョンとマージされるため、あなたが行った変更はTextMateをアップデートした後でも有効です。あなたが作った新しいアイテムはすべてこの場所に作られます。

TextMateにドラッグしたり、ダブルクリックすることでインストルされる、バンドルやバンドルアイテムは~/Library/Application Support/TextMate/Pristine Copy/Bundlesにインストールされます。これを編集をしても、その変更内容が~/Library/Application Support/TextMate/Bundlesに保存されます。つまり、後でそのサードパーディーバンドルの新しいバージョンを手に入れても、(TextMateにドラッグすることによって)古いものの上に安全にインストールされ、あなたの変更内容は保たれます。

もしローカルでの変更を破棄したい場合は、~/Library/Application Support/TextMate/Bundlesからその変更を削除することが現在できる唯一の方法です。

5.3 Deleting Default Bundles / Items デフォルトのバンドル/アイテムの削除

バンドルエディタから簡単にデフォルトのバンドルを削除したりバンドルアイテムを削除したりできます。しかし、アイテムはTextMateのアプリケーションと同時にshippingされるため、ディスクからはさくじょされません。そのため、 アップグレードの後にまた現れます。

それぞれのバンドルにはバンドルアイテムの順番を覚えておいたり、どのデフォルトのアイテムが削除されたように振る舞うべきかを保存するinfo.plistファイルがあります。あなたが、デフォルトのバンドルの中でアイテムの順番を変えたり、アイテムを削除すると、このファイルは~/Library/Application Support/TextMate/Bundles/«bundle name».tmbundleにコピーされ、この情報がを保存します。

もしバンドル全体を削除すると、その情報はTextMateの設定で記録されます。あなたは、以下のコマンドをターミナルで実行することによって、どのデフォルトバンドルが削除されたかのリストを得ることができます:

defaults read com.macromates.textmate OakBundleManagerDeletedBundles

デフォルトのバンドルのリストをリセットする(つまり復活させる)ためには、(TextMateが起動していないときに)これを実行してください:

defaults delete com.macromates.textmate OakBundleManagerDeletedBundles

これは少し複雑に聞こえるかもしれませんが、一般的に詳細についてあなたが気をつかう必要はありません。ただバンドルエディタを使って、アイテムを作成、編集、削除してください。予想通り動くはずです。

5.4 Hiding Bundles バンドルを隠す

デフォルトのバンドルを削除する代わりに、(いつかそのデフォルトのバンドルが必要になる日がくるかもしれないので、)ただ隠したいと思うかもしれません。

バンドルエディタのリストの下のFilter list... をクリックすればできます。ここでバンドルアイテムのリストで表示させたくたいのものチェックをはずすことができます。

Hiding Bundles

5.5 Sharing Bundles and Bundle Items バンドルとバンドルアイテムを共有する

バンドルや個別のバンドルアイテムを共有したいなら、バンドルエディタから(ウインドウの左側のリストから)直接Finderへドラッグすることでできます。

このアイテムは他の人に送られて、その人がダブルクリックしてインストールすることができます。(注意:これはスニペットやコマンドのような、ひとつひとつのアイテムでも同様です。)

5.6 Assorted Bundles さまざまなバンドル

たいていの場合は、バンドルは個別の言語のサポートを提供します。(Source, Text, TextMateバンドルといったような例外はありますが。)バンドルがどのような機能を提供するかを知るには(Windowメニューからアクセスできる)バンドルエディタでそのバンドルを調べてみるとよいでしょう。適切な場合、言語のバンドル、次のもの、キーボードショートカットといっしょに提供します。

また使い方やカスタマイズの仕方についての詳細のためのHelpコマンドをもつバンドルもたくさんあります。

バンドルアクションははステータスバーのギアポップアップをからアクセスすることができます。このメニューは⌃⎋を押すことによっても使うことができます。

Bundle Actions

以下はその他のバンドルのハイライトです。

5.6.1 Diff

Diff バンドルは、diffシェルコマンドからのアウトプットのための言語文法です。

ターミナルで以下のコマンドを実行してTextMateで二つのファイルの違いを表示させることができます:

diff -u old_file new_file|mate

またこのバンドルでは現在のドキュメントと保存されたコピーとの違い、プロジェクトドロワで選択されたファイル同士の違い(HTMLアウトプットでの表示オプション付き)を表示させることもできます。さらにAppleのopendiffを使うFileMergeで選択されたファイルを開くコマンドもあります。(デベロッパツールがインストールされている必要があります。)

5.6.2 HTML

HTMLバンドルはHTMLを扱うのに役にたつものを含みます。特に役に立つものは以下の通りです:

またHTMLバンドルは、正しい面積(幅/高さ)とファイル名に由来するaltテキストをもった画像を挿入するためのドラッグコマンドがあります。

HTMLバンドルにあるたくさんのアクションはタグを挿入するものです。例えば⌃↩は<br>を挿入し、HTMLドキュメントに画像をドロップすると、<img …>が挿入されたりします。

最小化された(XHTML)の形(つまり<br>の代わりに、<br />)を使うためにEMPTY content modelでタグを使いたい場合は、PreferencesAdvancedで、TM_XHTMLという変数を新しく作って、‘ /’にセットしてください。(この変数の値は、EMPTY content modelで作成されたタグの>の前に入力されます。)

For the records have a look at Sending XHTML as text/html Considered Harmful before embracing XHTML.

念のためにですが、XHTMLを採用する前にSending XHTML as text/html Considered Harmfulをみてください。

5.6.3 LaTeX

LaTeXバンドルにはとても役に立つ3つのコマンドがあります:

もしLaTexをインストールしていなければ、i-installer (binaries)を使うことができます。

あるいは、もしMacPortsを使っているなら、ターミナルを開いて以下のコマンドを実行しください:

sudo port install teTeX

5.6.4 Source

Sourceバンドルはソースコードのためのデフォルトのアクションや設定を含みます。興味深いのは、現在の行や選択範囲をコメント文字でトグルするComment Line / Selection (⌘/)です。このコマンドは3つのコンテクスト依存の変数(context dependent variables)を通して、様々な言語で設定されています。

行末に移動して行末のターミネータ文字(デフォルトでは;)を挿入して、新しい行を挿入したりする、いろいろなマクロはとても実用的です。

5.6.5 SQL

SQLバンドルには現在の行もしくは選択範囲をMySQLかPostgresのクエリを送り(⌃⇧Q)、結果をHTMLアウトプットで表示するコマンドがあります。

いくつかの接続の詳細を保持するために環境変数を使います。バンドルのHelpファイルに説明されています。

5.6.6 Subversion

Subverionsのアイテムはすべて、⌃⇧Aを通じてアクセスできます。このアクションは日常的なワークフローで使われるコマンドを提供します。

どのコマンドもパスワードを求めることはありません。WebDav (つまり httphttps)を通じて提供されるレポジトリには、svnはあなたの認証をキャッシュしなくてはいけません。Secure-shell tunneling (ssh)に関して、sshキーペアの作り方をこのポストで説明しています。

Subversion Commit

コミットのアクションはプロジェクトドロワの選択されたファイルか、もし何も選択されてない場合は現在のファイルがコミットされます。コミットウインドウでは実際のコミットをする前にファイルを除外することもできます。

コミットウインドウでは, 右下の"Commit"ボタンの代わりにエンターキー(⌅)を使うことができます。

5.6.7 Text

Textバンドルは基本的なテキスト編集に関するアクションや設定に関連したものです。ユーザーの視点からすると、いくつかの機能はひとつのバンドルであるよりもよりネイティブな位置にあるべきだろうと思うかもしれません。

最も実用的な4つのアクションは以下のものです:

5.6.8 TextMate

TextMateバンドルはメタバンドルの一種です。つまりテキストエディティングのためのアクションではなく、新しいバンドルアイテムを作ったり、メーリングリストのアーカイブを検索したり、現在の選択範囲をIRCチャンネルなどにペーストします。

Show Scope

テーマ言語文法(ランゲージグラマー)を扱う際に役に立つコマンドが、現在のキャレットのスコープを表示するShow Scope (⌃⇧P)です。(スコープに関しては後で詳しく)。

5.6.9 Xcode

Xcodeバンドルには現在のドキュメントやプロジェクトを含むフォルダのXcodeプルジェクトをビルドしたり結果として生じたターゲットを実行するアクションがあります。

Build With Xcode

Xcodeプロジェクトをインポートするコマンドもありますが、たいていはXcodeプロジェクトと一緒にフォルダをTextMateのアプリケーションアイコンにドラッグしたほうがよいです。なぜなら現在はTM_PROJECT_DIRECTORYという変数がインポートされたプロジェクトでは正しくセットアップされません。多くのバンドルアクションはこれに依存します。(例えばSubversion関連)

5.7 Getting More Bundles もっとバンドルを手に入れる

人気のあるバンドルのみTextMateに含まれます。さまざまな言語のサポートを主とした、多数のほかのバンドルのためのSubversionレポジトリがあります。こちらでバンドルのリストをみることができます。

5.7.1 Installing Subversion Subversionをインストールする

Leopardを使っていない方でバンドルをインストールしたい方は、subversionクライアントがインストールされていることが必要です。

5.7.2 Setting LC_CTYPE LC_CTYPEを設定する

あなたは、LC_CTYPE変数がUTF-8を使うように設定しなければいけません。さもないと、svnは(いくつかのバンドルアイテムが使う)ASCIIではないファイル名に遭遇するときに svn: Can't recode stringというエラーメッセージを表示します。

もしbashを使っていれば、あなたはこれを~/.bash_profile(もしくはターミナルを開く時にソースにされる類似のファイル)に加えなければいけません:

export LC_CTYPE=en_US.UTF-8

代わりに、zshユーザは~/.zshrcに、tcshユーザは~/.tcshrcにこれを加えてください。

setenv LC_CTYPE en_US.UTF-8

これを加えた後、アップデートされたプロフィールが効力をもつために新しいシェルを始める必要があるということを忘れないでください。

また、LC_ALL環境変数はLC_CTYPEより優先するというとを知っていてください。なので、もしあなたがほかでセットしてしまうと、もとに戻すかそれをUTF-8を使うように変更しなければいけません。

5.7.3 Installing a Bundle バンドルのインストール

svnがインストールされていれば、バンドルをcheckoutかexportすることが比較的簡単にできます。TextMateはすべての普通のライブラリの場所を検索してバンドルを探します。なので、もしあなたが(あなたのマシンで)そうする還元を持っていれば、すべてのcheckoutを~/Libraryではなく/Libraryで行うことを推奨します。なぜなら、こうすることで、インストールされたバンドルがカスタムバンドル(つまりあなたが編集したバンドル)と別にしておけます。

例えば、Haskellバンドルをインストールするためには、まずはじめにインストールするディレクトリを作って、そのあと、svnでチェックアウトします:

mkdir -p /Library/Application\ Support/TextMate/Bundles
cd /Library/Application\ Support/TextMate/Bundles
svn co http://svn.textmate.org/trunk/Bundles/Haskell.tmbundle

あとで、この2行のコマンドを実行することで、インストールしたバンドルをアップデートできます:

cd /Library/Application\ Support/TextMate/Bundles
svn up *.tmbundle

アップデートの際に、extMateが起動していると、次の行のコマンドを実行してみてください:

osascript -e 'tell app "TextMate" to reload bundles'

これは、TextMateから、Bundles → Bundle Editor → Reload Bundlesを選択するのと同じことです。

5.7.4 Support Folder (サポートフォルダ)

TextMateに含まれるのは、いろいろなバンドルアイテムに使われるさまざまなサポートアイテムを含むサポートフォルダです。このフォルダは、TM_SUPPORT_PATH 環境変数からみつかります。普通は/Applications/TextMate.app/Contents/SharedSupport/Supportを指します。

もしsubversionレポジトリからバンドルをチェックアウトしたなら、このバンドルは、TextMateに含まれるサポートフォルダよりも新しいバージョンのサポートフォルダに依存するかもしれません。もしそうなら、サポートフォルダのローカルコピーをチェックアウトする必要があるでしょう。

プロセスはバンドルをチェックアウトするのと似ています。まずはじめに、LC_CTYPEが適切にセットアップされているとこを確認して、それからシェルで次のコマンドを実行します:

cd /Library/Application\ Support/TextMate
svn co http://svn.textmate.org/trunk/Support

After this you can test it by pasting the following line into TextMate and pressing ⌃R (to execute it):

このあと、TextMateで次の行をペースとして、(実行するために)⌃Rを押してテストできます。

echo "$TM_SUPPORT_PATH"

次のアウトプットのような結果になるはずです:

/Library/Application Support/TextMate/Support

サポートフォルダの中にはversionという名前のバージョンファイルがあります。サポートフォルダの最もローカルなバージョンを選ぶのではなくTextMateは一番バージョンの高いものを選びます。これが意味するのは、もしあなたがサポートフォルダのローカルコピーをチェックアウトして、その後TextMateをアップデートすると、(古い可能性がある)コピーはデフォルトのコピーを上回ることはありません。

5.7.5 RSS Feed With Bundle Change Log バンドル変更履歴のRSSフィード

バンドルに対しての変更は普通のリリースノートに含まれません。代わりにRSSフィードで手に入れることができます。

6 マクロ

TextMateは記録可能なマクロをサポートします。マクロはBundlesメニューからMacros → Start Recordingを選択することによって記録されます。

記録をしている間、赤い点がステータスバーの右側で点滅し、すべてのテキストを編集するアクションが、検索、コマンド実行、スニペット挿入などといっしょに記録されます。終わったら、Stop Recordingを選択します。そうすると記録されたマクロを再生または後で使うために保存できます。

マクロを保存する際に、バンドルエディタに、他のバンドルエディタと同様に、activation sequenceスコープセレクタを決めることができる、(今のところは)リードオンリーのマクロとして現れます。

実行中にマクロがローカルのクリップボードを使うかどうかを決めることも可能です。ローカルのクリップボードあ一般的に都合がいいので、(なのでデフォルトでそうなっているのですが、)しかし、あなたはマクロが「本当の」クリップボードに効果を与えるようにしたいと思うこともあるかもしれないので、このオプションを無効にすることもできます。

7 Snippets (スニペット)

スニペットとははドキュメントに挿入するテキストです。スニペットには、時間、(選択されたテキストのような)変数、タブストップやあなたが挿入後タブを使う欠けている情報のためのプレースホルダを挿入したり、プレースホルダに入力したデータの変更を実行するコードを含むことができます。

Snippet Editor

7.1 Plain Text (プレーンテキスト)

もっとも単純な場合は、あなたが何度も何度も入力したくないテキストを挿入するスニペットを使う事が来ます。あなたが、何度も入力したり、実際に入力するテキストを覚えているのが大変だからといった理由でです。例えばあなたの銀行口座の詳細やAppleの修飾キーのHTMLの実体参照などがあります。

もしあなたがプレーンテキストを挿入するスニペットを使う際に知っていなければいけないことは、$`は予約語であるということです。もしあなたがそれらを入力したい場合は、( \$のように)その語の前に置いてエスケープしてください。この二文字が後ろにないエスケープ(つまり他のエスケープにが後ろにくる)エスケープはリテラル文字として挿入されます。

7.2 Variables (変数)

あなたは、$と一緒に変数名をつけることによって変数の値を入力することもできます。全ての普通の動的な変数はサポートされています。おそらく一番役に立つはTM_SELECTED_TEXTです。例えばもし、LaTexの\textbfコマンドで選択範囲を包み込むスニペットを作りたければ、以下のようにすればできます。

\textbf{$TM_SELECTED_TEXT}

もしテキストが選択されていない場合は、変数は設定されません。なのでその場所には何も挿入されません。${«variable»:«default value»}というシンタックスを使えばデフォルト値を与えることができます。例えば以下のようになります。

\textbf{${TM_SELECTED_TEXT:no text was selected}}

デフォルト値そのものが変数やシェルのコードを含むことができます。もし、デフォルトテキストに}を含む必要があれば、エスケープをする必要があります。しかし、他の文字は全て文字通りです。

また${«variable»/«regexp»/«format»/«options»}といったシンタックスを用いて、変数は[正規表現][]による置換をサポートします。もし変数が与えられていない場合、置換は空の文字列に対して実行されます。例えば、選択範囲の中のひとつひとつの空ではない行に中点をつけ、(それを挿入するには)、以下のようにします。

${TM_SELECTED_TEXT/^.+$/• $0/g}

7.3 Interpolated Shell Code (補完されたシェルコード)

スニペットが挿入されたときにシェルコードを実行させるために、あなたはバックティックを用いることができます。そのコードを実行することによって得られた結果がスニペットに挿入されます。(もしあれば)最後のnewlineが取り除かれた状態でですが。なので、例えば、リンクのURLをクリップボードがから得て、選択範囲をHTMLリンクでラップするスニペットを作るためには、以下のようなコードになります。

<a href="`pbpaste`.html">$TM_SELECTED_TEXT</a>

これは普通のbashコードなので、小さなプログラムを書く事もできます。例えば、クリップゴードが一行のみを含むということを確認させるためには、以下のようにできます。

<a href="`
    if [[ $(pbpaste|wc -l) -eq 0 ]]
        then pbpaste
        else echo http://example.com/
    fi
`">$TM_SELECTED_TEXT</a>

Inside shell code, the only character you need to escape is the backtick.

シェルコードの中で、唯一エスケープが必要になるのはバックティックです。

7.4 Tab Stops

挿入後キャレットはスニペットの最後の文字のうしろにきます。これはいつも理想的とは限りません。なので、私たちはキャレットが来てほしい場所に印をつけるために$0を使って変更することができます。例えば、HTMLのdivのスニペットを作ってキャレットが開始タグと終了タグの間にようにできます。それは以下のようになります。

<div>
    $0
</div>

しかし、私たちはスニペットの中のいくつかの場所を埋める必要がよくあります。$1-$nを挿入することによって複数のタブストップを与えられます。タブストップがなくなるまで、キャレットは$1で始まり、次にタブを押すと$2へ、次のタブで$3へと動きます。もしあなたが明示的に$0をセットしなければキャレットはスニペットの最後にきます。

例えば、上のコードを次のように変更できます。

<div$1>
    $0
</div>

これで引数を埋めた後、$0の位置へタブで移動できます。

7.5 Placeholders (プレースホルダ)

また、変数のように、タブストップはデフォルト値をもつことができ、(そして、それは一般的にプレースホルダと言われます。)シンタックスは同じです:${«tab stop»:«default value»}。そしてデフォルト値はテキストとシェルコードと他のプレースホルダを含むことができます。なので私たちは前回の例をさらに洗練させることができます。

<div${1: id="${2:some_id}"}>
    $0
</div>

このスニペットは選択された状態のid引数とdivタグを挿入します。そしてそれから私たちはその引数を上書き(つまり削除)して、タブを押し$0の場所へ行く、もしくは、すぐにタブで二つ目のタブストップ(引数の値)へ行き、それを編集するかを決める事ができます。

プレースホルダのテキストを編集すると、あらゆる埋め込まれたタブは削除されます。

7.6 Mirrors (ミラー)

挿入されたテキストのいくつかの場所へ同じ値を入れる必要がある場合、そんなときは、その場所にミラーされたものが必要ということを示すためにタブストップを再利用できます。だから、例えば、スニペットを使ってLaTex環境を作るためには、私たちは以下のようにできます。

\begin{${1:enumerate}}
    $0
\end{$1}

このスニペットを挿入したあと、enumerateが挿入され、編集されれば、その変化はendにも反映されます。

7.7 Transformations(変形)

プレースホルダのテキストがミラーされてほしいが、少しだけ変化が必要な場合やプレースホルダの値/存在によってテキストを表示させたい場合があります。

(ミラーをするときに)プレースホルダのテキストに対して正規表現の置換をすることによってこれを達成できます。シンタックスは以下のようになります:${«tab stop»/«regexp»/«format»/«options»}

例として、Objective-Cのgetter/setterメソッドはよくこのような形をしています:

- (id)foo
{
    return foo;
}

- (void)setFoo:(id)aValue
{
    [foo autorelease];
    foo = [aValue retain];
}

文字列のフォーマットでは、私たちは、次の文字を大文字にするために\uを用います。それでスニペットは一度インスタンス変数の名前のみを尋ねるスニペットは以下のようになります。

- (${1:id})${2:foo}
{
    return $2;
}

- (void)set${2/./\u$0/}:($1)aValue
{
    [$2 autorelease];
    $2 = [aValue retain];
}

また私たちは、決定をするために、フォーマットの文字列の中に条件付きの挿入を使う事ができます。例えば、もしメソッドのためにスニペットをつくれば、戻り値のタイプによってメソッドがreturn命令を含むかどうかを判断させることが、以下のようにできます。

- (${1:void})${2:methodName}
{${1/void$|(.+)/(?1:\n\treturn nil;)/}
}

ここでは、voidか何か(..+)に対してプレースホルダ1をマッチさせ、キャプチャのレジスタ1に後者のマッチを入れます。それから(void以外の)何かとマッチしたときだけ、newline、タブ、return nil: というテキストを挿入します。

8 Shell Commands (シェルコマンド)

シェルはいろいろなプログラム(シェルコマンド)を統合するためのスクリプト言語で、例えば、ターミナルを起動して実行するコマンドを入力したときのようにインタラクティブに使われることも多いです。

シェルスクリプト言語の紹介については、このAppleによるシェルのチュートリアルを見てください。

8.1 Executing Commands / Filtering Text コマンドの実行/テキストのフィルタリング

TextMateではさまざまなコンテクストでシェルコマンドを実行できます。実用的な方法には次のようなものがあります:

  1. 現在のドキュメントで、現在の行をシェルコマンドとして実行するためには、何も選択せずに、⌃Rを押してください、もしくは、 s選択範囲をシェルスクリプトとして実行するためには、1行以上を選択して⌃Rを押してください。(shebangもサポートされています。)

    Execute Line

  2. TextメニューからFilter Through Command… (⌥⌘R)を選択することによって、実行するシェルコマンドを入力し、なにがインプット(stdin)として与えられ、さらにコマンドのアウトプットをどうしたいかを決めるパネルが開きます。(たいてい選択されたテキストをインプットにセットしてアウトプットを使ってその選択されたテキストを置き換えたいでしょう。)

    Filter Through Command

  3. バンドルエディタのコマンド。最初の二つの方法は主に、一回限りのコマンドです。しかし、バンドルエディタのコマンドは何度も使うものです。ここで紹介する方法は2番の方法と同じです。つまり、インプットとアウトプットをどうしたいかを指定でき、なおかつアウトプットを(例えば、現在の単語について調べるコマンドのために)ツールチップでアウトプットを表示させたり、(例えばプロジェクトをビルドして、結果を順に表示させるために)HTMLで表示させたりできます。また、コマンドが実行される前にドキュメントを保存するように指定したり、コマンドにショートカットやタブトリガーを割り当てることができます。

    Command Editor

8.2 Search Path サーチパス

ターミナルでコマンドを実行すると、(絶対パスなしで設定されている)シェルはPATH変数の値を使って、コマンドを見つけます。例えばruby/usr/bin/rubyにあります。svnは(私のでは)/opt/local/bin/svnにあります。

TextMateは通常はFinderからのPATHの値を継承します。しかし、それはほんのいくつかの場所を検索することしか指定されていないので、あまり役に立ちません。

TextMateは代わりに、実際のシェルコマンドを実行する前に、($TM_SUPPORT_PATH/libにあるbash_init.shという名前の)カスタムスクリプトを実行します。このスクリプトは以下のコードを含みます:

if [ ! -f "$TM_BASH_INIT" ]; then

   # First read system-wide profile
   [ -f /etc/profile ] && . /etc/profile

   # Then find the first local profile
   if   [ -f ~/.bash_profile ]; then . ~/.bash_profile
   elif [ -f ~/.bash_login   ]; then . ~/.bash_login
   elif [ -f ~/.profile      ]; then . ~/.profile
   fi

fi

これが意味するところは、あなたが自分でカスタマイズされたbash_init.shを作らない限り、TextMateは最初に/etc/profileをソースにして、その後、あなたのホームフォルダにある、初めのbashの初期化(イニシャライゼーション)ファイルをソースにします。

もしあなたがいつもbashシェルを使わないなら、(tcshzshのようなものでは)いつも使うパスを設定しなければいけないでしょう。例えば、~/.bash_profileファイルを作成し、以下のような行を含む必要があります:

[ -f /etc/profile ] && . /etc/profile
[ -f ~/.bashrc ]    && . ~/.bashrc

export PATH="$HOME/bin:/opt/local/bin:$PATH"

これは、パスに~/bin/opt/local/binを追加します。~の代わりに、$HOMEを使うのを忘れないでください。なぜなら、二重引用符のなかで~は展開されませんが、$HOMEは展開されるからです。

重要: (コマンドの最初の行に#!/usr/bin/ruby#!/usr/bin/env rubyのような)個別のインタープリタをコールするためのshebangを使うシェルコマンドはこの設定の手順を使いません。なので、追加されたパスを取得しません。ログインしたときにFinderが読み込む環境変数に対応したキー/値のペアをもっているプロパティーリストである~/.MacOSX/environment.plistPATHを設定することによって引数をとることができます。

よって、もし/opt/local/binをパスに追加したいなら、~/.MacOSX/environment.plistというファイルを作って、次のものを追加してください:

{ PATH = "/opt/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"; }

このファイルを作成(または編集)した後には、その効果を得るためにあなたのアカウントにログインし直す必要があります。

なお、このファイルには$HOMEを使うことはできません。なので代わりに$HOME/binには/Users/allan/binのように書いてください。(allanをあなたのユーザ名に変えてください。)

9 環境変数

環境変数は情報とともにスクリプトやコマンドを提供するためにTextMateでは広範囲に使われています。

さまざまなスクリプト言語で(VARという名前の)変数の値を読み込むにはこのようにします。

シェルスクリプトで使われる変数は必ず二重引用符を使ってください。そうでないと、bashは初めに変数を値に展開してinput-field-separator characters(read as the IFS 変数, defaults to スペース, タブ and 改行)に従って分割されます。つまり、もしTM_FILENAMEMy Document.txtであり、rm $TM_FILENAMEを実行すると、rmは実際には二つの引数を持ちます。一つ目はMyで二つ目は Document.txtです。

bashでの環境変数でできることについての情報について、問題点はこのブログポストを見てください。また、bashのmanファイルを確認してください。

9.1 動的変数

次の変数はユーザーの現在の設定を反映します。その設定とは、どのファイルが開かれていて、そのファイルのどこにキャレットがあり、プロジェクトドロワのの選択しているところはどこかなどです。

スクリプトはこの変数を読み込んで、それに従って決定をします。

変数の中には、いつも現れていないものもあります。例えばもし現在のファイルに名前がついていない(untitled)場合や選択範囲がない場合は、それに対応する変数はセットされません。これは例えば、あるコマンドを選択範囲に対して実行して、もし選択範囲がない場合は現在の行や単語に対して実行させるときなど便利です。

Bashには変数がセットされていないときにでデフォルトの値を提供する簡易な記述法があります。例えば選択範囲がない場合に現在の単語を代替としてつかうには、"${TM_SELECTED_TEXT:-$TM_CURRENT_WORD}"を使うことができます。

9.2 静的変数

TextMateが自動的に提供する動的変数だけでなく、静的な変数のリストがあれば便利な時もあります。

例えば、会社名を挿入するテンプレートやスニペットがありその値を直接書き込みたくないときや、ローカライズされた設定が必要な共有コマンドがあるかもしれません。例えばSQLバンドルにはユーザ名、パスワード、データベースに変数を使うクエリコマンドがあります。

このため、Preferences → Advanced → Shell Variablesにて環境変数のデフォルトのリストをセットすることができます。

Shell Variables

この変数は、TextMateから実行される全てのシェルコマンドに与えられます。また、(動的変数と同じように)スニペットで使うこともできます。

9.3 コンテクスト依存変数

変数には動的にも静的にもなるものもあります。例えば、Sourceバンドルは現在の行か選択範囲をコメントにしたり、コメントアウトするToggle Commentコマンドがあります。このコマンドはユーザのが必要としているコメントのスタイルを決めるために3つの変数を使用します。

しかしながら複数の言語を使うユーザは言語毎にこれを指定しなければいけません。バンドルの設定shellVariablesをセットし、この変数を制限するために、適切なスコープセレクタを与える必要があります。

Scoped Environment Variables

これは、キャレットの位置に基づいて行われることに利点があります。というのは、Toggle Commentを使うことによって、一つのドキュメントにあるJavaScript, CSS, HTML, 埋め込まれたPHPやRubyを問題なく扱うことができます。

HTML/SGML/XMLのコメントマーカーを使って(行語とでなく)全てのブロックをコメントにする3つの変数を設定する例は以下のようになります。

shellVariables = (
   {  name = 'TM_COMMENT_START';
      value = '<!-- ';
   },
   {  name = 'TM_COMMENT_END';
      value = ' -->';
   },
   {  name = 'TM_COMMENT_MODE';
      value = 'block';
   },
);

9.4 プロジェクト依存の変数

プロジェクトによって、別にカスタマイズされたコマンドがあると便利な時もあります。そういう理由で、個別のプロジェクト毎に変数を設定することが可能です。

この方法は現在では、少し隠されていいます。プロジェクトドロワの全てから選択をはずし、(Iに丸がついている)インフォボタンをクリックすると、変数を設定するパネルが現れます。

この変数はプロジェクトファイル(*.tmproj)に保存され、そのプロジェクトの中で実行されるスニペットと(シェル)コマンドのみ保持します。

10 コマンド

コマンドはbashや#!/usr/bin/rubyのように最初の行にあるshebang記法で定められたインタープリターで実行されるスクリプトです。

Bundles → Bundle Editor → Edit Commands…を洗濯してバンドルエディタを開きコマンドを編集することができます。

Command Editor

コマンドが実行される前に、現在のドキュメントかプロジェクトの中にある編集された全てのドキュメントが保存されます。これは、一番上のポップアップで設定できます。ドキュメントは変更された場合のみ保存されます。

10.1 Command Input

コマンドを実行するときには、いろいろな環境変数を使用することができます。また、コマンドでは、インプット(標準入力)として、ドキュメント全体を読みこむこともできるほか、選択されたテキストを読みこむことができます。

もしインプットが“Selected Text”に設定されているにもかかわらず、何も選択されていない場合は、他のインプットポップアップで設定されているユニットにフォールバックします。フォールバックが使用され、もしアウトプットが“Replace Selection”に設定されていれば、インプットは置換されます。もしtr '[a-z]' '[A-Z]'(小文字を大文字に)というコマンドを実行して、インプットがSelected Textに設定されていて、一語にフォールバックする場合し、アウトプットがReplace Selected Textに設定されている場合、選択範囲なしでコマンドを実行すると、現在の単語を大文字に変換します。

Input Fallback Options

フォールバックユニットについてですが、Scope(スコープ)については少し説明が必要でしょう。インプットにスコープをセットすると、コマンドのスコープセレクタにマッチしない最初の文字を前方と後方へ向かって検索します。そして、その境界の最初から最後までをインプットとして扱います。

つまり、もしランゲージグラマーでURLをマークアップ際に、このスコープにmarkup.underline.urlを指定した状態で、Selection or Scopeと設定すれば、URL上にキャレットがあるときにこのコマンドが実行されれば、URLをインプットとして取得します。

コマンド名が例えば、メニュー上などのバンドルエディタの外で表されている場合で、フォールバックユニットが必要な時は、テキストが選択されているかどうかに従って“Unit / Selection”を“Unit” もしくは “Selection”に置き換えられます。Unitに使われるテキストはフォールバックユニットをしめす一つの単語でなくてはいけません。すなわちCharacter、 Word、 Line、 Scope、 Documentということです。もし“Encrypt Document / Selection”という名前のコマンドを作成し、インプットにSelected Textを指定し、フォールバックとして、Documentを指定すると、このコマンドは、何もテキストが選択されていない場合には、“Encrypt Document”として実行され、テキストが選択されている 場合には、“Encrypt Selection.”として実行されます。

10.2 コマンドアウトプット

アウトプット(標準出力)ではさまざまなことができます。以下ではさまざまなオプションを説明します。

10.3 HTML アウトプット

HTMLアウトプットには、WebKitのHTML/CSSエンジンの機能に加えていくつかの機能があります。

  1. HTMLアウトプットを使ったコマンドが実行中でも、TextMateがストール(停止)してしまうことはありません。進捗インディケータがコマンドが実行されている間に右上の角に表示されます。もし終了(abort)したい場合は、アウトプットのウインドウを閉じるだけです。(閉じようとすると確認のダイアログが表示されます。)

    Html Output Progress Indicator

  2. アウトプットの一部で実行されているJavaScriptはTextMateオブジェクトでsystemメソッドにアクセスできます。これは、Dashboard widgetsで提供されているものをまねたものです。TextMateオブジェクトはisBusyプロパティを持っていて、プログレスインディケータをコントロールするためにtrueもしくはfalseに設定可能です。一番簡単な例では、プログレスインディケータをユーザがスタート/ストップできるようにするもので以下のようになります。

    cat <<'EOF'
       <a href="javascript:TextMate.isBusy = true">Start</a>
       <a href="javascript:TextMate.isBusy = false">Stop</a>
    EOF
    

    ユーザのブラウザで開くためのリンクを作るためにはsystemメソッドが使用できます。

    cat <<'EOF'
       <a href="javascript:TextMate.system(
          'open http://example.com/', null);">Open Link</a>
    EOF
    

    systemメソッドはコマンドのスタート(とストップ)を非同期的に実行できるため、コマンドからの標準出力(エラー)を読み込んだりや コマンドの標準入力データを送ることができます。より詳しい情報はthe Dashboard documentationを参照してください。

  3. HTMLアプトプットでは、元のドキュメントに戻るために、TextMate URL スキームを使用できます。例えば、(ビルドコマンドやバリデータのように)コマンドが現在のドキュメントのエラー(や警告)をレポートしたりするときに便利です。また、svn statusのようにコマンドがプロジェクト内の他のファイルを参照する際にも便利です。

 4. TigerかSchuberts PDF Browser Plug-inを使えば、HTMLアウトプットにPDFファイルを表示させることもできます。これは主にLaTeXのような活字を組むプログラムには便利でしょう。これによって、TextMateから離れることなく活字をセットして結果を確認することができます。

  1. 他のページにリダイレクトして、HTMLアウトプットをブラウザへのショートカットのように使うこともできます。例えば、PHPでは“Documentation for Word”というコマンドは次のような出力をします。

    echo "<meta http-equiv='Refresh'
            content='0;URL=http://php.net/$TM_CURRENT_WORD'>"
    

WebKitにある(おそらく)セキュリティー上の制約のために、file:URL スキームを使用してのHTMLアウトプットをディスク上の他のファイルへリダイレクトしたり、リンクしたり、参照することはできません。その代わりに、tm-file: URL スキームを使って、file:と全く同じようなことができますが、スキームを超えての制約はありません。

HTMLアウトプットの使い方に関してのより詳しい説明はthe TextMate blogを参照してください。.

10.4 コマンドのアウトプットタイプを変更する

コマンド内でコマンドのアウトプットオプションを変更したいときもあるかもしれません。例えば、現在の単語のドキュメンテーションを調べるコマンドは、もしドキュメンテーションが見つからなければ、"no documentation found"というツールチップを見せたいですし、そうでない場合は、結果をHTMLアウトプットで表示したいでしょう。

Command Output Options

TextMateには、この目的で使うために定期済みのbash関数があいます。これはの関数は任意に最初に標準出力へechoされた引数を文字列としてとります。

この関数は初期のアウトプットオプションが"Show as HTML"ではないときに使用できます。以下が関数のリストです。

例えば、Diffバンドルには"[Diff] Document With Saved Copy"というコマンドがあります。これは、現在のドキュメントとディスクに保存されたバージョンを比較するものです。デフォルトのアウトプットオプションは、(diffの結果をシンタックス・カラーリングで表示した)新規ドキュメントの作成です。しかし、もしディクスにファイルがない場合は(ツールチップとして)エラーを表示します。これは、次のようなコマンドを使うことで可能になります。

if [[ -e "$TM_FILEPATH" ]] # does the file exist?
   then diff -u "$TM_FILEPATH" -
   else exit_show_tool_tip "No saved copy exists."
fi

10.5 便利なbash関数

コマンドを実行するときには、以下に挙げる定期済みのbash関数を使うと便利です。

この関数はすべて$TM_SUPPORT_PATH/lib/bash_init.shで定義されています。また、(bashから)HTML作成を助ける関数も$TM_SUPPORT_PATH/lib/html.shで定義されています。しかし、このファイルはデフォルトでは、ソースとして使われません。そのためこのファイルで定義されている関数を使うためには、以下のようにソースとして取り込みます。

. "$TM_SUPPORT_PATH/lib/html.sh"
redirect "http://example.com/"

10.6 Dialogs (Requesting Input & Showing Progress)

TextMate ships with CocoaDialog so this can be used out-of-the-box. You call CocoaDialog (follow the link for full documentation) with the type of dialog you want and it will return two lines of text, the first is the button pressed (as a number) and the second is the actual result. While a little cumbersome, here is an example of how to request a line of text and only proceed if the user did not cancel:

res=$(CocoaDialog inputbox --title "I Need Input" \
    --informative-text "Please give me a string:" \
    --button1 "Okay" --button2 "Cancel")

[[ $(head -n1 <<<"$res") == "2" ]] && exit_discard

res=$(tail -n1 <<<"$res")
echo "You entered: $res"

We first call CocoaDialog to get a string of text. Then we test if the first line returned (using head) is equal to 2, which corresponds to the Cancel button and if so, we exit (using the discard output option). We then go on to extract the last line of the result and echo that.

Cocoadialog Inputbox

Another common dialog type is the progress indicator. The determinate version reads from stdin the value and text to use for each step. This means we can simply pipe that info to CocoaDialog in each step of our command, a simple example could be:

for (( i = 1; i <= 100; i++ )); do
    echo "$i We're now at $i%"; sleep .05
done|CocoaDialog progressbar --title "My Program"

Cocoadialog Determinate Progress

Often though we want to show the indeterminate version. This dialog stays onscreen for as long as its stdin is open. This means we can use a pipe like above but if we want a result back from the command that we are executing, we can instead redirect the commands stderr to an instance of CocoaDialog (using process substitution), this is shown in the following example:

revs=$(svn log -q "$TM_FILEPATH"|grep -v '^-*$' \
    2> >(CocoaDialog progressbar --indeterminate \
        --title "View Revision…" \
        --text "Retrieving List of Revisions…" \
    ))
echo "$revs"

Cocoadialog Indeterminate Progress

CocoaDialog also has other dialog types, like a pop-up list, file panel, text box and so on, but as an alternative there is also AppleScript.

If you open Script Editor and then open the Standard Additions dictionary (via Open Dictionary…) there are commands under User Interaction which allow various dialogs. One caveat though, in current version (1.5) TextMate will not listen to AppleScript commands while executing shell commands with an output option other than Show as HTML. This means that instead of targeting TextMate, you should use SystemUIServer or similar and in addition to that, since SystemUIServer needs to be activated to show the dialog (with focus) you need to reactivate TextMate. Here is an example of a command that allows selecting an item from a list:

res=$(osascript <<'AS'
    tell app "TextMate"
        activate
        choose from list { "red", "green", "blue" } \
            with title "Pick a Color" \
            with prompt "What color do you like?"
    end tell
AS)

echo "You selected: $res"

osascript -e 'tell app "TextMate" to activate' &>/dev/null &

The first part is just a small AppleScript which is executed from shell via osascript (reading the script from stdin using a here-doc). The last part is the line that gives focus back to TextMate but because TextMate will not respond to this event before the shell command has completed its execution, we need to run it asynchronously, which is done by adding & to the end of the command. The &>/dev/null part is to detach stdout/error from the shell command so that this does not cause a stall.

AppleScript Choose From List

11 ドラッグコマンド

ドラッグコマンドは普通のコマンドに似ています。しかし、このコマンドは特定の(ファイルタイプ拡張子のリストによって特定された)ファイルタイプを編集中のウインドウにドロップすることによって有効になります。

ドラッグコマンドファイルタイプ

ドラッグコマンドを実行して得られるアウトプットは常にスニペットとして挿入され、ドラッグコマンドは3つの(追加の)環境変数が用意されています。:

こちらが少し複雑なドラッグコマンドです:

img="$TM_DROPPED_FILE"
echo -n "<img src=\"$img\" "

sips -g pixelWidth -g pixelHeight "$img" \
|awk '/pixelWidth/  { printf("width=\"%d\" ",  $2) }
      /pixelHeight/ { printf("height=\"%d\" ", $2) }'

base=${img##*/}
alt=$(tr <<<${base%.*} '[_-]' ' '|perl -pe 's/(\w+)/\u$1/g')
echo -n "alt=\"\${1:$alt}\">"

まずはじめに<img src="…"の部分のアウトプットします。それから、 イメージに クエリを行うためsipsを使い、そのsipsからのアウトプットをパースするためにawkを使い、適切なwidth="…"height="…"引数(argument)をアウトプットします。

最後にスペースに対して-_をパスに、それぞれの頭文字を大文字にし、これを最後のalt="…"引数として、(全てはスニペットとして挿入されるので)このテキストをプレイスホルダにした場所アウトプットします。

ドラッグコマンドの結果

12 Language Grammars

Language grammars are used to assign names to document elements such as keywords, comments, strings or similar. The purpose of this is to allow styling (syntax highlighting) and to make the text editor “smart” about which context the caret is in. For example you may want a key stroke or tab trigger to act differently depending on the context, or you may want to disable spell check as you type those portions of your text document which are not prose (e.g. HTML tags).

The language grammar is used only to parse the document and assign names to subsets of this document. Then scope selectors can be used for styling, preferences and deciding how keys and tab triggers should expand.

For a more thorough introduction to this concept see the introduction to scopes blog post.

12.1 Example Grammar

You can create a new language grammar by opening the bundle editor (Window → Show Bundle Editor) and select “New Language” from the add button in the lower left corner.

This will give you a starting grammar which will look like the one below, so let us start by explaining that.

 1  {  scopeName = 'source.untitled';
 2     fileTypes = ( );
 3     foldingStartMarker = '\{\s*$';
 4     foldingStopMarker = '^\s*\}';
 5     patterns = (
 6        {  name = 'keyword.control.untitled';
 7           match = '\b(if|while|for|return)\b';
 8        },
 9        {  name = 'string.quoted.double.untitled';
10           begin = '"';
11           end = '"';
12           patterns = ( 
13              {  name = 'constant.character.escape.untitled';
14                 match = '\\.';
15              }
16           );
17        },
18     );
19  }

The format is the property list format and at the root level there are five key/value pairs:

There are two additional (root level) keys which are not used in the example:

12.2 Language Rules

A language rule is responsible for matching a portion of the document. Generally a rule will specify a name which gets assigned to the part of the document which is matched by that rule.

There are two ways a rule can match the document. It can either provide a single regular expression, or two. As with the match key in the first rule above (lines 6-8), everything which matches that regular expression will then get the name specified by that rule. For example the first rule above assigns the name keyword.control.untitled to the following keywords: if, while, for and return. We can then use a scope selector of keyword.control to have our theme style these keywords.

The other type of match is the one used by the second rule (lines 9-17). Here two regular expressions are given using the begin and end keys. The name of the rule will be assigned from where the begin pattern matches to where the end pattern matches (including both matches). If there is no match for the end pattern, the end of the document is used.

In this latter form, the rule can have sub-rules which are matched against the part between the begin and end matches. In our example here we match strings that start and end with a quote character and escape characters are marked up as constant.character.escape.untitled inside the matched strings (line 13-15).

Note that the regular expressions are matched against only a single line of the document at a time. That means it is not possible to use a pattern that matches multiple lines. The reason for this is technical: being able to restart the parser at an arbitrary line and having to re-parse only the minimal number of lines affected by an edit. In most situations it is possible to use the begin/end model to overcome this limitation.

12.3 Rule Keys

What follows is a list of all keys which can be used in a rule.

12.4 Naming Conventions

TextMate is free-form in the sense that you can assign basically any name you wish to any part of the document that you can markup with the grammar system and then use that name in scope selectors.

There are however conventions so that one theme can target as many languages as possible, without having dozens of rules specific to each language and also so that functionality (mainly preferences) can be re-used across languages, e.g. you probably do not want an apostrophe to be auto-paired when inserted in strings and comments, regardless of the language you are in, so it makes sense to only set this up once.

Before going through the conventions, here are a few things to keep in mind:

  1. A minimal theme will only assign styles to 10 of the 11 root groups below (meta does not get a visual style), so you should “spread out” your naming i.e. instead of putting everything below keyword (as your formal language definition may insist) you should think “would I want these two elements styled differently?” and if so, they should probably be put into different root groups.

  2. Even though you should “spread out” your names, when you have found the group in which you want to place your element (e.g. storage) you should re-use the existing names used below that group (for storage that is modifier or type) rather than make up a new sub-type. You should however append as much information to the sub-type you choose. For example if you are matching the static storage modifier, then instead of just naming it storage.modifier use storage.modifier.static.«language». A scope selector of just storage.modifier will match both, but having the extra information in the name means it is possible to specifically target it disregarding the other storage modifiers.

  3. Put the language name last in the name. This may seem redundant, since you can generally use a scope selector of: source.«language» storage.modifier, but when embedding languages, this is not always possible.

And now the 11 root groups which are currently in use with some explanation about their intended purpose. This is presented as a hierarchical list but the actual scope name is obtained by joining the name from each level with a dot. For example double-slash is comment.line.double-slash.

13 スコープセレクタ

スコープセレクタはキャレット(つまり現在のコンテクスト)のスコープに対してマッチして、マッチするかしないかを結果として持つ、CSSセレクタにとても似ています。(この最下にあるマッチのランク付けというところも見てください。)

Scope Selector

バンドルアイテムのアクティベーションの方法が"コメントの中"とか"HTML文書の中"といったようなコンテクストに限られることを可能にします。この利点は、forのようなタブトリガーがいろいろな言語で利用可能になり、HTMLような、CSS, PHP, RubyやJavaScriptが混在したドキュメントでスムーズに動作します。

スコープセレクタは設定アイテムテーマと一緒に使われます。テーマでは、ドキュメントの要素にスタイルを加えます。設定アイテムでは編集のなどさまざまな側面を粒子単位で調整できます。

13.1 要素名

一般的に、一つのドキュメントはたくさんの要素からなります。散文のドキュメントであれば、見出し、パラグラフ、箇条書きのリスト、強調テキストがあります。一方、ソースコードは文字列、コメント、キーワード、保存タイプなどがあります。

TexMateには、ランゲージグラマーがこの要素とマッチして、それぞれに名前を割り当てます。この名前はドットによって区別され、それぞれに追加されたものがマッチした要素の種類に特化します。例えば、Cの二重引用符文字列はstring.quoted.double.cがスコープ名として付与されます。(詳しくは命名規約を見てください。)

最もシンプルな形のスコープセレクタはマッチする要素名です。しかし、実際の要素名の接頭辞のみを指定する必要があるだけです。よって、スコープセレクタとして、stringと指定すると、すべての引用の文字列にマッチします。同じように、string.quotedと指定すると、一重引用符文字列にも二重引用符文字列にも三重引用符文字列にもマッチします。

空のスコープセレクタはすべてのスコープにマッチしますが、一番低いランクになります。(後述のマッチのランク付けを見てください。)

13.2 子孫セレクタ

CSSのように、スコープセレクタで要素のコンテクストを使うことが可能です。下の画像は、(⌃⇧P経由で)ツールチップとして、文字列のスコープを示しています。文字列の直接の親はsource.php.embedded.htmlであり、text.html.basicは祖先になります。

Show Scope

スコープセレクタでは、スペースで区切られたリストで要素名を指定することで、スコープの中で(それと同じ順番で、)それぞれの要素が現れていなければいけないということを指示できます。PHPのすべての文字列をターゲットにしたいなら、source.php stringを使うことができます。あるいは、HTMLに埋め込まれたPHPをターゲットにするためには、text.html source.phpを使うことができます。

13.3 要素を除外する

ドキュメントのサブセットにマッチさせたいが、そのセットの個別のサブセットを除外したいときもあります。

例えば、Rubyでは、#{…}を使って文字列の中にコードを埋め込むことができます。文字列の中で#が押されたときに挿入されるスニペットは役に立つでしょう。そのためのスコープセレクタはsource.ruby stringです。

しかし残念なことに、(文字列に埋め込まれた)コードの中でさえ#が押されると#{…}が挿入されてしまいます。これをさけるためには、マイナス演算子を使って(非対称の)違いを得るためにスコープセレクタを差し引く必要があります。なので、よりよいスコープセレクタはsource.ruby string - string sourceになります。

以下はそのスコープセレクタが何をターゲットにするかを説明しています。

puts "Today is #{Date.today}."
     ^^^^^^^^^^             ^^

13.4 グルーピング

それぞれ別のスコープをマッチングしたものが必要であれば、コンマ演算子を使って、スコープセレクタをグループ化できます。例えば、文字列とコメントの虜法にマッチさせるには、スコープセレクタはstring, commentになります。

13.5 マッチのランク付け

もし一つ以上のスコープセレクタが現在のスコープにマッチすると、それぞれのマッチがどれだけ"よい"かに従ってランク付けされます。

勝者になるスコープセレクタは以下の順番で決まります(優先順位が高い順です。):

  1. スコープの一番深い要素 例えば、スコープがsource.php string.quotedの時、stringsource.phpに勝ちます。

  2. 一番深い要素のなるべく多くにマッチする 例えばstring.quotedstringに勝ちます。

  3. (引き分けのとき)一番深い要素を省いて、ルール1と2がサイドスコープセレクタに適用されてます 例えばtext source stringsource stringに勝ちます。

タブトリガー、キーボードショートカットとドロップされたファイル(ドラッグコマンド)の場合、もしランク上で同一のものは、(それは、つまりスコープセレクタが全く同じ場合、)一番よいマッチのためにメニューが表示されます。

テーマと設定アイテムに関して、プロパティー毎が基準になりますが、もし複数のアイテムが同じスコープセレクタを使うと、勝者は決められません。例えば、あるテーマアイテムがstring.quotedの背景を青にセットして、他のテーマアイテムがstring.quotedの前面を白に設定すると、結果としては、前面は後者から選択されで、背景は前者から選択されます。

14 テーマ(Themes)

TextMateは文字列、コメント、キーワードなどのドキュメントの要素へ名前を割り当てるためにランゲージグラマーを使います。あなたがHTML要素を選択するためにCSSセレクタを使うのと同じようにスコープセレクタを使い、個々の要素を指定することによって可能になります。

TextMateでのドキュメントのスタイリングはHTMLドキュメントとためにスタイルシートを作るのに似ています。このプロセスは、(スタイルシートに似た)テーマを選択したり、あるテーマを編集したり、新しいテーマを作ることができるのは、Preferences → Fonts & Colorsにおいてです。

Fonts And Colors

テーマの変更はグローバルに行われます。つまり、現在のところファイルやファイルタイプごとに個別のテーマを選択することはできません。

テーマは6つのスタンダードのプロパティがあります。こは、バックグラウンド、フォアグラウンド、キャレット、選択、不可視物、ラインの高さのカラーです。それに加えて、テーマは"テーマアイテム”のリストから構成されます。これらのアイテムはおのおの、どのエレメントがどのアイテムに適用されるかを選択するスコープセレクタ、そしてそれから任意にフォアグラウンドとバックグラウンドカラーと(太字、イタリック、下線)のフォントスタイルを持っています。 

Remove Color

もし、テーマアイテムがフォアグラウンドカラーもバックグラウンドカラーも持っていない場合、FGもしくはBGのコラムをクリックして加えることができます。代わりにもし、削除したい場合、FGもしくはBGの色をマウスポインタが消えることを示すまでドラッグしてマウスを放せば色を削除できます。

スコープセレクタが複雑になりうることを忘れないでください。例えば、HTMLの中のRubyブロックに個別の色を設定するためにtext.html source.rubyのバックグラウンドに設定したり、埋め込みコードではない文字列の一部のみをスタイリングするためにstring - string sourceを使うこともできます。

Composite Theme Colors

14.1 共有

TextMateのwikiにはユーザーが自分のテーマを共有することが促される カスタムテーマ のためのページがあります。

15 Preferences Items 設定アイテム

ファイルタイプやドキュメントの中のキャレットの位置などに基づいて、さまざまな値を保つことが有益な設定に関しては, バンドルエディタで、どのスコープが適用されるかを選ぶスコープセレクタを指定することができます。

現在設定は古いスタイルのプロパティーリストフォーマットで指定されています。

Preferences Editor

15.1 Completions 補完

For more info see section on completions.

より詳しい情報は補完のセクションをみてください。

15.2 Indentation インデント

より詳しい情報はインデントルールを見てください。

15.3 Symbol List シンボルリスト

詳しくはシンボルリストのカスタマイズを見てください。

15.4 Paired Characters ペアになる文字

15.5 Other その他

16 Key Bindings

There are basically three types of actions in TextMate and each has its own system when it comes to key bindings (yes, this is not ideal).

16.1 Bundle Items

Bundle items are commands, snippets, macros, language grammars, templates etc. and can all be found in the bundle editor (Window → Show Bundle Editor). Each of these actions has a key equivalent and an associated scope selector which can be edited from the bundle editor.

16.2 Menu Items

Menu items can be edited via System Preferences → Keyboard & Mouse. From here it is possible to change key bindings for either all applications or particular applications based on the menu items title.

This is done by pressing the plus button on the left side below the list on the Keyboard Shortcuts page, which displays the sheet shown below.

Change Menu Key Binding

Some caveats:

  1. Only key bindings which include the command modifier (⌘) will work.

  2. Dynamic menu items i.e. those which change title depending on the programs state (like Fold Current Block / Selection) should be specified with their initial title. The initial title can be found by opening the MainMenu.nib file in Interface Builder (use Show Package Contents on TextMate and navigate to Contents → Resources → English.lproj).

  3. You need to restart an application before key binding changes take effect.

An alternative to the system preferences is Menu Master from Unsanity. This allows you to change the key binding inside the application simply by hovering your mouse on the item and pressing the new key (and does not require a restart).

16.3 Text Move / Edit Actions

The last is probably the most essential, it is the keys which “just work” in the actual text editing area.

Here TextMate uses the Cocoa key bindings system where the master set of keys are defined in /System/‍Library/‍Frameworks/‍AppKit.framework/‍Resources/‍StandardKeyBinding.dict and used by all Cocoa text fields and to some degree other controls also.

The master set of keys can be augmented by ~/Library/‍KeyBindings/‍DefaultKeyBinding.dict. The most common request with respect to key bindings is to have page up/down move the caret and have home/end go to the beginning and end of the line. This article shows how this can be done.

In addition TextMate has a /path/‍to/‍TextMate.app/‍Contents/‍Resources/‍KeyBindings.dict file with some extra key bindings which are specific to TextMate (and thus not appropriate to put in the per user global key bindings file). You can copy this file to ~/Library/‍Application Support/‍TextMate and edit it, this will then take precedence over the bundled file.

The format is explained in the blog post linked to above.

16.3.1 List of Standard Key Bindings

For a list of which keys are available by default (in OS X) please see this list of key bindings created by Jacob Rus.

Apple also has a page about standard key bindings as part of their human Interface Guidelines. TextMate conforms to these and implement majority of the keys shown on that page.

In addition TextMate has the following key bindings, which are not visible in the menus and cannot be found in the standard key binding files:

Key Action

⌥F2

Show context menu — This is equivalent to clicking the mouse at the current caret location while holding down control (⌃). If the current word is misspelled the context menu will contain spelling suggestions.

⌃⎋

Show bundle items menu — this opens the gear menu which is located in the status bar.

⌃S

Forward incremental search.

⌃⇧S

Backward incremental search.

⌘`
⌘~

Switch to the next/previous window. This keyboard shortcut is based on the physical location of the key so on many European keymaps it is instead ⌘< and ⌘> (it is the key to the left of the Z).

⌥⌘`
⌥⌘~

Switch between main window and drawer. Like the previous key this one is also based on physical location. The function is not available on Panther.

⌃⇥

Go backwards through the chain of keyboard accessible controls. Normally this would be the same as ⇤ (⇧⇥) but that one doesn’t work when the text editing control has focus. The previous keyboard accessible control in that situation is the project outline in the drawer, so this key could be considered a “bring focus to the project drawer” key.

16.4 Conventions

Modifiers Purpose
This is for primary actions mostly defined by Apple or already a de-facto standard e.g. New, Open, Save, Print, Hide, Quit, Cut, Copy, Paste, etc.
⇧⌘ Adding the shift modifier often indicates a twist on the plain key equivalent. For example
  • ⌘W is Close Tab — ⇧⌘W is Close Project (in a project)
  • ⌘T is Go to File… — ⇧⌘T is Go to Symbol…
  • ⌘V is Paste — ⇧⌘V is Paste Previous
  • ⌘Z is Undo — ⇧⌘Z is Redo
etc.
⌥⌘ Often (but definitely not always) this modifier sequence is used to toggle an option, e.g. Soft Wrap (⌥⌘W), Show Invisibles (⌥⌘I), Bookmarks (⌥⌘B), Line Numbers (⌥⌘L), Foldings at a given level (⌥⌘0-9) etc.
⌃⌥⌘ This modifier sequence is generally used for actions which open a window. For example Show Bundle Editor (⌃⌥⌘B), Show Clipboard History (⌃⌥⌘V), Show/Hide Project Drawer (⌃⌥⌘D), Show Web Preview (⌃⌥⌘P) etc.
⌃⇧ Less important bundle actions (commands and sometimes snippets) should generally use this modifier sequence.
⌃⇧⌘ This is the secondary modifier sequence for use with less important bundle actions (i.e. when the primary one is taken).
⌃⌥⇧ This is used to switch language grammar, the key is (generally) the first letter of the language grammar name.
⌃⌘ Actions related to projects are in this space, e.g. New Project, Save Project, Reveal in Project, etc.

17 Templates テンプレート

テンプレートはテンプレートの中身に基づいて新しいファイルを作成する(シェル)コマンドからできています。以下は、index.htmlファイルがXHTML 1.1テンプレートの一部になっているのを示しています。

Xhtml Templates

テンプレートのシェルコマンドが実行されると、ファイルを(パスなしの)名前のみで参照できるように、作業をしているディレクトリはテンプレートファイルを含んでいるディレクトリに設定されます。よって、シェルコマンドは(通常の変数に加えて)以下の3つの環境変数にアクセスできます。

新規テンプレートはメニュー (File → New From Template) を使って作成されるか、プロジェクトではプロジェクトドロワの New File ボタン(⇧⌘N)を使って、作成されます。

New File From Template

18 Printing (印刷)

プリント機能を楽しみに思う人もいると思います。、フラストレーションを感じる方もいると思いますが、TextMateは現在のところ、限られたプリント能力しかありません。

つまり、あなたは構文のハイライティングなしでドキュメントフォントを使う事しかできないということです。そした、いかに示すようにヘッダーとフッターとスタンダードのプリントオプション以外にオプションはありません。

Printing Options

ヘッダとフッターのフィールドは普通の変数、バックティックを使った挿入されたコードをサポートします。さらに以下の二つの変数へアクセスできます。

プリント機能を改良するプランはあります。しかし、そのときまで、Source バンドルに View Source as PDFというコマンドがあります。このコマンドは、現在のソースからenscriptを使って、PDFを作成します。そしてサポートされている言語に関しては、シンタックスのハイライティングができます。

19 Saving Files ファイルの保存

TextMateにはファイルの保存の仕方に影響する上級の環境設定にいくつかのオプションがあります。

Prefs Saving

19.1 Atomic Saves 原子性での保存

原子性での保存とは、ファイルを上書きするのではなく、TextMateが新しいファイルを保存し、それが成功したら古いファイルを上書きするということです。これは、もしファイル保存中にマシンがクラッシュした場合、あなたは古い(つまり、最後に保存された)ファイルと新しいファイルの両方を失うというリスクを冒さずにすむという点での長所があります。

欠点は新しいファイルが実際に(新しいinodeとともに)書かれるので、ファイルへのエイリアスを壊してしまうかもしれないということです。しかし、これはファイルを移動したり、移動する予定であるときにのみ置きます。というのは、パスはエイリアスを解決する際にinodeより優先されるからです。また、Finderは保存するたびにファイルのアイコンの位置を変えます。(これはもしそのファイルがあなたの目に見えるフォオル谷あるときだけ問題になります。)

19.2 Creator Code (クリエータコード)

クリエータコードはClassicのMacがファイルとアプリケーションを関連づける方法です。OS Xでは、関連付けは主にファイル拡張子を通じて行われます。もしある日与えられたファイルタイプを扱うもっとよいプログラム(!)が見つかった場合に、あなたは全てのファイルのクリエータコードを変えるのではなく、一カ所の関連付けをアップデートしさえすればよいので、拡張子には利点があります。このため、これをセットせず、ブランク(Blank)に設定しておくよう推奨します。

19.3 Encoding (エンコーディング)

TextMateはかなりUTF-8に偏重しています。UTF-8はASCIIと互換性があるエンコーディングです。なので、これを、grepdiffruby(インタープリタ),gcc(コンパイラ)などといった既存のツールといっしょに使うのに問題はありません。

ファイルシステムはファイル名にUTF-8に使うので、TerminalはデフォルトでUTF-8にセットされています。(例えば、lsが正しく結果子を表示するために)。もしTerminalでnon-ASCIIファイルをcatしたり、(例えば、ellipsisやカーリークォーツなどの)ASCII以外のアウトプットをするスクリプトを実行しても、UTF-8がアウトプットであれば、正しく表示されます。(それは、あなたがTerminalのエンコーディングを変更しない限りですが。)

加えて、UTF-8はあなたがMacでタイプできるすべての文字を表示できる唯一のエンコーディングです。ユーロシンボル(€)のような文字でさえ古い(レガシー)エンコーディングでは問題が生じます。

またさらにボーナスとして、UTF-8はほぼ100パーセントの確実性で認識される、唯一の8bitエンコーディングです。それが意味するのは、UTF-8を使う限り、ファイルを開いて、テキストエディタが使われているエンコーディングについて間違った推測をしてしまうといったことは、もう経験しないでしょう。(もしエンコーディングの間違いにあなたが気づかずにファイルを保存してしまうとファイルは台無しになってしまいます。)

UTF-8を指示する最後の理由は、TextMateはたくさんの機能を可能にするインフラをただ提供しているだけということです。このすべての機能はスクリプトとして書かれていて、こういったスクリプトが現在のファイル、プロジェクト内のファイル、選択範囲などといっしょに働きます。あるアクションはテクストを変形させるものかもしれないし、結果を新しいドキュメントでHTMLで表示させるものかもしれません。たいていの場合、エンコーディングを扱わなければいけないことは、実用的ではなく、不可能であることさえあります。(結果がソースのエンコーディングを使って表示されなければいけないような場合です。)なので、すべてのことにたいして、UTF-8を前提としています。

TextMateのブログには、(ウェブサーバーにデータをPOSTしたり、LaTexドキュメントのエンコーディングを設定したりするなど)多岐にわたるシチュエーションでどのようにしてUTF-8を使うかについての投稿があります。

それでもやはり、デフォルトのエンコーディングを変えることは可能です。もし他のエンコーディングでひとつのファイルを保存しなければいけないだけなら、Save As…ダイアログで調整できます。エンコーディングのリストは短いですが、それは意図的なものです。もし他のエンコーディングを使う必要がある場合、現在のところのアドバイスとしては、iconvを使うことです。

iconv -lを実行して、サポートされている数百ものエンコーディングのリストを得ることができます。

TerminalでいくつかのファイルをUTF-8に変更するには、以下のようにすればできます:

for f in *.txt; do iconv -f mac -t utf-8 "$f" >"$f.utf8"; done

19.4 Extended Attributes (Metadata) 拡張された属性(メタデータ)

TigerからOS Xはsetxattrとその仲間をサポートします。

TextMateは拡張された属性をキャレットのポジション、ブックマーク、どのテキストが折り畳まれているかといった情報を保存するために利用し、将来的には更なる活用をするとのなるでしょう。

(ネットワークでマウントされたディスクなどの)拡張された属性ををネイティブでサポートしないファイルシステムのために、OS Xは代わりにその情報を«filename»がオリジナルのフォイル名である場合、._«filename»というファイルの中に保存します。

すべてのユーザが、TextMateが状態覚えておくために、この特別の(隠された)ファイルが役にたつとは思わないので、この拡張された属性を無効化することができます。TexMateを終了させて、シェルから次のコマンドを実行することで無効化できます。

defaults write com.macromates.textmate OakDocumentDisableFSMetaData 1

19.5 Save Automatically when Focus Is Lost フォーカスがなくなったときに自動的に保存

もしあなたが、Terminalやブラウザのようなアプリケーションに切り替えてテストするようなプロジェクトをしているなら、フォーカスをがなくなったときに、修正されたすべてのファイルを保存するようにTextMateを設定することができます。そうして、ほかのアプリケーションに切り替えたとき、TextMateは自動的にすべての変更をを保存します。

20 正規表現

20.1 イントロダクション

正規表現は、テキストのマッチのための領域固有言語です。テキストのマッチのために小さなプログラムをゼロから作ることもできますが、間違いを起こしやすいですし、面倒くさいですし、あまりポータブルでもフレキシブルでもありません。

代わりにマッチを(シンプルなケースでは)マッチする文字タイプとどれだけの文字をマッチさせたいかを決める数量詞を文字列として表現する正規表現を使います。

例えば、普通の文字と数字は文字通りマッチします。\wは単語の文字にマッチし、\sは(スペース、タブ、改行など)の空白文字にマッチします。ピリオド(.)は(改行をのぞいて)あらゆる文字にマッチします。

基本的な数量詞は、マッチがゼロ回かそれ以上あるアスタリスク(*)、1回かそれ以上nマッチするプラス(+)、{min,max}という形で表される範囲です。

これだけで、語を探す(\w+)機能や画像タグの中のalt属性(<img.*alt=".*">)を探す機能が手に入ります。

もっと長いテキストのマッチも必要ですが、マッチの部分集合(subset)が必要だと感じることも多いと思います。例えば、上記の例では、もしalt属性のテキストを置換したいとします。もし、括弧を使って、正規表現を囲むと、置換のための文字列のなかで使われうる変数を 捕まえる(キャプチャ) ことができます。置換のための文字列のフォーマットはこのセクションの最後で説明しますが、初めに捕まえたもの(キャプチャ)には、$1、2番目は$2を使います。

なので、alt属性のテキストを変えるためには、(<img.*alt=").*(">)を検索して、それを$1Text Intentionally Removed$2に置換できます。

上記の例では.*が使われています。しかしながら、アスタリスク演算子はどん欲(greedy)です。つまり、(マッチする限り)できるだけたくさんの文字にマッチします。なので、どん欲ではなくしたい場合は?を加えて.*?にします。

20.1.1 外部リソース

20.2 TextMateでの正規表現

これはTextMateが正規表現を活用できる機会のリストです:

よって、言うまでもなく正規表現はTextMateでは重要な役割をします。知らなくても幸せな生活を送ることができますが、(もしまだ詳しくないなら)本やチュートリアルなどを使って、正規表現により詳しくなることを強く推奨します。

TextMateだけではなく、(sed, grep, awk, findなどの)多くのシェルコマンドでは正規表現をサポートします。PerlやRubyのような有名なスクリプト言語には、言語の深いレベルで正規表現をサポートしています。

20.3 シンタックス (鬼車)

TextMateではK. Kosakoさんによる鬼車正規表現ライブラリを使います。

以下はhttp://www.geocities.jp/kosako3/oniguruma/doc/RE.ja.txtからの引用です。

    鬼車 正規表現 Version 5.6.0    2007/04/03

    使用文法: ONIG_SYNTAX_RUBY (既定値)


    1. 基本要素

      ¥       退避修飾 (エスケープ)  正規表現記号の有効/無効の制御
      |       選択子
      (...)   式集合   (グループ)
      [...]   文字集合 (文字クラス)


    2. 文字

      ¥t           水平タブ         (0x09)
      ¥v           垂直タブ         (0x0B)
      ¥n           改行             (0x0A)
      ¥r           復帰             (0x0D)
      ¥b           後退空白         (0x08)
      ¥f           改頁             (0x0C)
      ¥a           鐘               (0x07)
      ¥e           退避修飾         (0x1B)
      ¥nnn         八進数表現        符号化バイト値(の一部)
      ¥xHH         十六進数表現      符号化バイト値(の一部)
      ¥x{7HHHHHHH} 拡張十六進数表現  コードポイント値
      ¥cx          制御文字表現      コードポイント値
      ¥C-x         制御文字表現      コードポイント値
      ¥M-x         超  (x|0x80)      コードポイント値
      ¥M-¥C-x      超 + 制御文字表現 コードポイント値

      ※ ¥bは、文字集合内でのみ有効


    3. 文字種

      .        任意文字 (改行を除く)

      ¥w       単語構成文字

               Unicode以外の場合:
                 英数字, "_" および 多バイト文字。

               Unicodeの場合:
                 General_Category -- (Letter|Mark|Number|Connector_Punctuation)

      ¥W       非単語構成文字

      ¥s       空白文字

               Unicode以外の場合:
                 ¥t, ¥n, ¥v, ¥f, ¥r, ¥x20

               Unicodeの場合:
                 0009, 000A, 000B, 000C, 000D, 0085(NEL), 
                 General_Category -- Line_Separator
                                  -- Paragraph_Separator
                                  -- Space_Separator

      ¥S       非空白文字

      ¥d       10進数字

               Unicodeの場合: General_Category -- Decimal_Number

      ¥D       非10進数字

      ¥h       16進数字    [0-9a-fA-F]

      ¥H       非16進数字


      Character Property

        * ¥p{property-name}
        * ¥p{^property-name}    (negative)
        * ¥P{property-name}     (negative)

        property-name:

         + 全てのエンコーディングで有効
           Alnum, Alpha, Blank, Cntrl, Digit, Graph, Lower,
           Print, Punct, Space, Upper, XDigit, Word, ASCII,

         + EUC-JP, Shift_JISで有効
           Hiragana, Katakana

         + UTF8, UTF16, UTF32で有効
           Any, Assigned, C, Cc, Cf, Cn, Co, Cs, L, Ll, Lm, Lo, Lt, Lu,
           M, Mc, Me, Mn, N, Nd, Nl, No, P, Pc, Pd, Pe, Pf, Pi, Po, Ps,
           S, Sc, Sk, Sm, So, Z, Zl, Zp, Zs, 
           Arabic, Armenian, Bengali, Bopomofo, Braille, Buginese,
           Buhid, Canadian_Aboriginal, Cherokee, Common, Coptic,
           Cypriot, Cyrillic, Deseret, Devanagari, Ethiopic, Georgian,
           Glagolitic, Gothic, Greek, Gujarati, Gurmukhi, Han, Hangul,
           Hanunoo, Hebrew, Hiragana, Inherited, Kannada, Katakana,
           Kharoshthi, Khmer, Lao, Latin, Limbu, Linear_B, Malayalam,
           Mongolian, Myanmar, New_Tai_Lue, Ogham, Old_Italic, Old_Persian,
           Oriya, Osmanya, Runic, Shavian, Sinhala, Syloti_Nagri, Syriac,
           Tagalog, Tagbanwa, Tai_Le, Tamil, Telugu, Thaana, Thai, Tibetan,
           Tifinagh, Ugaritic, Yi



    4. 量指定子

      欲張り

        ?       一回または零回
        *       零回以上
        +       一回以上
        {n,m}   n回以上m回以下
        {n,}    n回以上
        {,n}    零回以上n回以下 ({0,n})
        {n}     n回

      無欲

        ??      一回または零回
        *?      零回以上
        +?      一回以上
        {n,m}?  n回以上m回以下
        {n,}?   n回以上
        {,n}?   零回以上n回以下 (== {0,n}?)

      強欲 (欲張りで、繰り返しに成功した後は回数を減らすような後退再試行をしない)

        ?+      一回または零回
        *+      零回以上
        ++      一回以上

        ({n,m}+, {n,}+, {n}+ は、ONIG_SYNTAX_JAVAでのみ強欲な指定子)

        例. /a*+/ === /(?>a*)/


    5. 錨

      ^       行頭
      $       行末
      ¥b      単語境界
      ¥B      非単語境界
      ¥A      文字列先頭
      ¥Z      文字列末尾、または文字列末尾の改行の直前
      ¥z      文字列末尾
      ¥G      照合開始位置


    6. 文字集合

      ^...    否定   (最低優先度演算子)
      x-y     範囲   (xからyまで)
      [...]   集合   (文字集合内文字集合)
      ..&&..  積演算 (^の次に優先度が低い演算子)

         例. [a-w&&[^c-g]z] ==> ([a-w] and ([^c-g] or z)) ==> [abh-w]

      ※ '[', '-', ']'を、文字集合内で通常文字の意味で使用したい場合には、
         これらの文字を'¥'で退避修飾しなければならない。


      POSIXブラケット ([:xxxxx:], 否定 [:^xxxxx:])

        Unicode以外の場合:

          alnum    英数字
          alpha    英字
          ascii    0 - 127
          blank    ¥t, ¥x20
          cntrl
          digit    0-9
          graph    多バイト文字全部を含む
          lower
          print    多バイト文字全部を含む
          punct
          space    ¥t, ¥n, ¥v, ¥f, ¥r, ¥x20
          upper
          xdigit   0-9, a-f, A-F
          word     英数字, "_" および 多バイト文字

        Unicodeの場合:

          alnum    Letter | Mark | Decimal_Number
          alpha    Letter | Mark
          ascii    0000 - 007F
          blank    Space_Separator | 0009
          cntrl    Control | Format | Unassigned | Private_Use | Surrogate
          digit    Decimal_Number
          graph    [[:^space:]] && ^Control && ^Unassigned && ^Surrogate
          lower    Lowercase_Letter
          print    [[:graph:]] | [[:space:]]
          punct    Connector_Punctuation | Dash_Punctuation | Close_Punctuation |
                   Final_Punctuation | Initial_Punctuation | Other_Punctuation |
                   Open_Punctuation
          space    Space_Separator | Line_Separator | Paragraph_Separator |
                   0009 | 000A | 000B | 000C | 000D | 0085
          upper    Uppercase_Letter
          xdigit   0030 - 0039 | 0041 - 0046 | 0061 - 0066
                   (0-9, a-f, A-F)
          word     Letter | Mark | Decimal_Number | Connector_Punctuation



    7. 拡張式集合

      (?#...)           注釈
      (?imx-imx)        孤立オプション
                          i: 大文字小文字照合
                          m: 複数行
                          x: 拡張形式
      (?imx-imx:式)     式オプション

      (式)              捕獲式集合
      (?:式)            非捕獲式集合

      (?=式)            先読み
      (?!式)            否定先読み
      (?<=式)           戻り読み
      (?<!式)           否定戻り読み

                        戻り読みの式は固定文字長でなければならない。
                        しかし、最上位の選択子だけは異なった文字長が許される。
                        例. (?<=a|bc) は許可. (?<=aaa(?:b|cd)) は不許可

                        否定戻り読みでは、捕獲式集合は許されないが、
                        非捕獲式集合は許される。

      (?>式)            原子的式集合
                        式全体を通過したとき、式の中での後退再試行を行なわない

      (?<name>式), (?'name'式)
                        名前付き捕獲式集合
                        式集合に名前を割り当てる(定義する)。
                        (名前は単語構成文字でなければならない。)

                        名前だけでなく、捕獲式集合と同様に番号も割り当てられる。
                        番号指定が禁止されていない状態 (10. 捕獲式集合 を参照)
                        のときは、名前を使わないで番号でも参照できる。

                        複数の式集合に同じ名前を与えることは許されている。
                        この場合には、この名前を使用した後方参照は可能であるが、
                        部分式呼出しはできない。


    8. 後方参照

      ¥n          番号指定参照 (n >= 1)
      ¥k<name>    名前指定参照
      ¥k'name'    名前指定参照

      名前指定参照で、その名前が複数の式集合で多重定義されている場合には、
      番号の大きい式集合から優先的に参照される。
      (マッチしないときには番号の小さい式集合が参照される)

      ※ 番号指定参照は、名前付き捕獲式集合が定義され、
         かつ ONIG_OPTION_CAPTURE_GROUPが指定されていない場合には、
         禁止される。(10. 捕獲式集合 を参照)


      ネストレベル付き後方参照

        ¥k<name+n>     n: 0, 1, 2, ...
        ¥k<name-n>     n: 0, 1, 2, ...
        ¥k'name+n'     n: 0, 1, 2, ...
        ¥k'name-n'     n: 0, 1, 2, ...

        後方参照の位置から相対的な部分式呼出しネストレベルを指定して、そのレベルでの
        捕獲値を参照する。

        例-1.

          /¥A(?<a>|.|(?:(?<b>.)¥g<a>¥k<b+0>))¥z/.match("reer")

        例-2.

          r = Regexp.compile(<<'__REGEXP__'.strip, Regexp::EXTENDED)
          (?<element> ¥g<stag> ¥g<content>* ¥g<etag> ){0}
          (?<stag> < ¥g<name> ¥s* > ){0}
          (?<name> [a-zA-Z_:]+ ){0}
          (?<content> [^<&]+ (¥g<element> | [^<&]+)* ){0}
          (?<etag> </ ¥k<name+1> >){0}
          ¥g<element>
          __REGEXP__

          p r.match('<foo>f<bar>bbb</bar>f</foo>').captures



    9. 部分式呼出し ("田中哲スペシャル")

      ¥g<name>    名前指定呼出し
      ¥g'name'    名前指定呼出し
      ¥g<n>       番号指定呼出し (n >= 1)
      ¥g'n'       番号指定呼出し (n >= 1)

      ※ 最左位置での再帰呼出しは禁止される。
         例. (?<name>a|¥g<name>b)   => error
             (?<name>a|b¥g<name>c)  => OK

      ※ 番号指定呼出しは、名前付き捕獲式集合が定義され、
         かつ ONIG_OPTION_CAPTURE_GROUPが指定されていない場合には、
         禁止される。 (10. 捕獲式集合 を参照)

      ※ 呼び出された式集合のオプション状態が呼出し側のオプション状態と異なっている
         とき、呼び出された側のオプション状態が有効である。

         例. (?-i:¥g<name>)(?i:(?<name>a)){0} は "A" に照合成功する。


    10. 捕獲式集合

      捕獲式集合(...)は、以下の条件に応じて振舞が変化する。
      (名前付き捕獲式集合は変化しない)

      case 1. /.../     (名前付き捕獲式集合は不使用、オプションなし)

         (...) は、捕獲式集合として扱われる。

      case 2. /.../g    (名前付き捕獲式集合は不使用、オプション 'g'を指定)

         (...) は、非捕獲式集合として扱われる。

      case 3. /..(?<name>..)../   (名前付き捕獲式集合は使用、オプションなし)

         (...) は、非捕獲式集合として扱われる。
         番号指定参照/呼び出しは不許可。

      case 4. /..(?<name>..)../G  (名前付き捕獲式集合は使用、オプション 'G'を指定)

         (...) は、捕獲式集合として扱われる。
         番号指定参照/呼び出しは許可。

      但し
        g: ONIG_OPTION_DONT_CAPTURE_GROUP
        G: ONIG_OPTION_CAPTURE_GROUP
        ('g'と'G'オプションは、ruby-dev MLで議論された。)

      これらの振舞の意味は、
      名前付き捕獲と名前無し捕獲を同時に使用する必然性のある場面は少ないであろう
      という理由から考えられたものである。


    -----------------------------
    補記 1. 文法依存オプション

       + ONIG_SYNTAX_RUBY
         (?m): 終止符記号(.)は改行と照合成功

       + ONIG_SYNTAX_PERL と ONIG_SYNTAX_JAVA
         (?s): 終止符記号(.)は改行と照合成功
         (?m): ^ は改行の直後に照合する、$ は改行の直前に照合する


    補記 2. 独自拡張機能

       + 16進数数字、非16進数字  ¥h, ¥H
       + 名前付き捕獲式集合      (?<name>...), (?'name'...)
       + 名前指定後方参照        ¥k<name>
       + 部分式呼出し            ¥g<name>, ¥g<group-num>


    補記 3. Perl 5.8.0と比較して存在しない機能

       + ¥N{name}
       + ¥l,¥u,¥L,¥U, ¥X, ¥C
       + (?{code})
       + (??{code})
       + (?(condition)yes-pat|no-pat)

       * ¥Q...¥E
         但しONIG_SYNTAX_PERLとONIG_SYNTAX_JAVAでは有効


    補記 4. Ruby 1.8 の日本語化 GNU regex(version 0.12)との違い

       + 文字Property機能追加 (¥p{property}, ¥P{Property})
       + 16進数字タイプ追加 (¥h, ¥H)
       + 戻り読み機能を追加
       + 強欲な繰り返し指定子を追加 (?+, *+, ++)
       + 文字集合の中の演算子を追加 ([...], &&)
         ('[' は、文字集合の中で通常の文字として使用するときには
          退避修飾しなければならない)
       + 名前付き捕獲式集合と、部分式呼出し機能追加
       + 多バイト文字コードが指定されているとき、
         文字集合の中で八進数または十六進数表現の連続は、多バイト符合で表現された
         一個の文字と解釈される
         (例. [¥xa1¥xa2], [¥xa1¥xa7-¥xa4¥xa1])
       + 文字集合の中で、一バイト文字と多バイト文字の範囲指定は許される。
         ex. /[a-あ]/
       + 孤立オプションの有効範囲は、その孤立オプションを含んでいる式集合の
         終わりまでである
         例. (?:(?i)a|b) は (?:(?i:a|b)) と解釈される、(?:(?i:a)|b)ではない
       + 孤立オプションはその前の式に対して透過的ではない
         例. /a(?i)*/ は文法エラーとなる
       + 不完全な繰り返し範囲指定子は通常の文字列として許可される
         例. /{/, /({)/, /a{2,3/
       + 否定的POSIXブラケット [:^xxxx:] を追加
       + POSIXブラケット [:ascii:] を追加
       + 先読みの繰り返しは不許可
         例. /(?=a)*/, /(?!b){5}/
       + 数値で指定された文字に対しても、大文字小文字照合オプションは有効
         例. /¥x61/i =~ "A"
       + 繰り返し回数指定で、最低回数の省略(0回)ができる
         /a{,n}/ == /a{0,n}/
         最低回数と最大回数の同時省略は許されない。(/a{,}/)
       + /a{n}?/は無欲な演算子ではない。
         /a{n}?/ == /(?:a{n})?/
       + 無効な後方参照をチェックしてエラーにする。
         /¥1/, /(a)¥2/
       + 無限繰り返しの中で、長さ零での照合成功は繰り返しを中断させるが、
         このとき、中断すべきかどうかの判定として、捕獲式集合の捕獲状態の
         変化まで考慮している
         /(?:()|())*¥1¥2/ =~ ""
         /(?:¥1a|())*/ =~ "a"



    補記 5. 実装されているが、既定値では有効にしていない機能

       + 捕獲履歴参照

         (?@...) と (?@<name>...)

         例. /(?@a)*/.match("aaa") ==> [<0-1>, <1-2>, <2-3>]

         使用方法は、sample/listcap.cを参照

         有効にしていない理由は、どの程度役に立つかはっきりしないため。


    補記 6. 問題点

       + UTF-8で、バイト値が適正な価かどうかのチェックは行なっていない。

         * 先頭バイトとして不正なバイトを一文字とみなす
           /./u =~ "¥xa3"

         * 不完全なバイトシーケンスのチェックをしない
          /¥w+/ =~ "a¥xf3¥x8ec"

         これを調べることは可能ではあるが、遅くなるので行なわない。

    終り

20.4 置換文字列シンタックス(フォーマット文字列)

正規表現の置換を使うとき、置換のための文字列は、キャプチャを参照したり、ケースフォールディングを実行したり、(キャプチャのレジスタに基づいて)条件付きの挿入をしたり、最小限のエスケープ文字列をサポートするフォーマット文字列として解釈されます。

20.4.1 キャプチャ

キャプチャを参照するには、$nを使ってください(nはキャプチャレジスタの番号です)。$0はマッチ全体を意味します。

用例:

   検索: <img src="(.*?)">
置換: <img src="$1" alt="$1">

20.4.2 コードフォールディング

\u\lを先頭に追加することによってその次文字を大文字に変えたり、小文字に変えたりすることができます。これは、主に、その次の文字がキャプチャレジスタに由来するときに便利です。用例:

   検索: (<a.*?>)(.*?)(</a>)
置換: $1\u$2$3

より長い文字列を\U\Lを使って大文字や小文字に変換できます。Eを使って、コードフォールディングを無効にできます。用例:

   検索: (<a.*?>)(.*?)(</a>)
置換: $1\U$2\E$3

20.4.3 条件付きの挿入

置換が何かがマッチしたかどうかによることがあります。これは、キャプチャ«n»がマッチしたら、«insertion»を挿入するために、(?«n»:«insertion»)を使えばできます。キャプチャ«n»がマッチしなかったら、«otherwise»を挿入するために(?«n»:«insertion»:«otherwise»)を使うこともできます。

キャプチャを条件付きにするには、foo|(bar)|fudのように変形の中に置いてください。もしくは、(bar)?のようにクエスチョンマークを加えることができます。(.*)ゼロ個の文字でもマッチしてしまうので、代わりに(.+)?を使ってください。

例えば、もし文字五文字以上の時に、8文字に切り詰めて、省略記号を挿入したい時には、、以下のようにします:

   検索: (\w+(?:\W+\w+){,7})\W*(.+)?
   置換: $1(?2:…)

ここではまず、それぞれの語が語ではない文字(スペースに)先行された、7つの語((?:\W+\w+){,7})が後にくる(\w+)にマッチさせます。その後、、任意で、キャプチャレジスタ2((.+)?)へ(語ではない文字によって区切られた)それに続くものは何でも書き入れます。

置換はまず、マッチした8文字まで($1)を挿入します。それからもしキャプチャ2が何かにしたら、省略記号((?2:…))を挿入します。

20.4.4 エスケープコード

ケースフォールディングのエスケープコードに加えて、\nで改行文字を、\tでタブ文字を、\$でドル文字を挿入できます。

21 他のアプリケーションからTextMateを使用する

21.1 シェル/ターミナル

Mac OS Xにはopenが付属します。このシェルコマンドはTerminalからダブルクリックをシミュレートします。引数-aを使うことによってOpen With…の動作をすることもできます。例えば、open -a TextMate .で現在のフォルダを(まっさらのプロジェクトを)TextMateで開きます。

この標準的なコマンドにはいくつかの欠点があります: 一回に一つのファイルしか開くことができないこと、個別の行のドキュメントを開くことができないこと、ファイルが閉じられるまでシェルを"ストール"させておくことができないことなどです。Subversionのコミットメッセージのようなものを書く際にエディタを使う際に、ストールさせておくと役に立ちます。。

こういうわけで、TextMateにはmateというシェルコマンドが付属します。このコマンドはopenコマンドにとってかわります。使い方は(ターミナルで)mate -hを実行してください。

mateコマンドはTextMateアプリケーションバンドルの中にあります。なので、("インストール"するよりも)、コマンドに対して、シンボリックリンクを作成することが推奨されます。そうすることで、もしコマンドが将来アップデートされても、アップデートされたコマンドを再インストールする必要がありません。

シンボリックリンクを作成するには、メニューからHelp → Terminal Usage… を選択するか、もしくは、次のようなコマンドをシェルで実行することでできます:

ln -s /Applications/TextMate.app/Contents/Resources/mate ~/bin/mate

これは、あなたがパスに~/binを設定していて、なおかつTextMateが/Applicationsにインストールされていることを前提としてます。

このリンクを作った後、TextMateを他のアプリケーションの外部エディタとして使うためのシェル変数を設定する必要があるでしょう。

21.1.1 一般的な EDITOR 変数

EDITOR変数は、svn(subversoin)やCVSのようなたくさんのシェルコマンドで使われます。TextMateをEDITOR変数のエディタとして使うには、次のようにセットしてください(bashユーザは~/bash_profile、zshユーザは~/zshrcのように):

export EDITOR='mate -w'

TextMateがファイルを閉じるまで、コマンドを再会するのを待たせるために-wを加えました。

EDITOR変数で引数をサポートしないコマンドがあります。それは、crontabです。(crontablaunchdがあるためあまり使われませんが。)もし使う必要があれば、mateに、-wを意味する_waitと追加して、シンボリックリンクを作成することができます。例えば:

ln -s mate ~/bin/mate_wait   # run this once to create the link
export EDITOR='mate_wait'    # use in your ~/.bash_profile

21.1.2 Git エディタ

Gitレポジトリにコミットすると、キャレットが最初の行にないことに気づくかもしれません。

これは、Gitがコミットメッセージに使うテンプラリファイルを再利用して、TextMateが(拡張属性経由で)ファイル毎にキャレットを保存するからです。

Gitエディタをmate -wl1に設定することで、この問題を回避できます。こうして、最後に位置していた場所ではなく、1行目にキャレットが位置していた状態でTextMateはファイルを開きます。

このようにGitを設定するには、GIT_EDITOR変数を設定するかGitのcore.editorの設定変数を指定してください。

21.1.3 TeX エディタ

TeXがファイルに関するエラーメッセージを表示する際、eを押すことで、ファイルを編集(し、エラーを訂正)することができます。

TextMateがこのように使われるように設定するためにはTEXEDIT編集を次のようにしてください:

export TEXEDIT='mate -w -l %d "%s"'

21.1.4 lessでの編集

lessページャーはvを押すことで、そのファイルを編集することができます。TextMateをlessで使うためには、LESSEDIT変数をする必要があります:

export LESSEDIT='mate -l %lm %f'

21.2 URLスキーム (HTML)

txmtというURLスキームを使うことによって、例えば、HTMLドキュメント(アンカー)の中にあるハイパーリンク経由でTextMateでファイルを開くことができます。ローカルのファイルを参照できるので次のようなときに役に立ちます:

  1. HTMLアウトプットと一緒にコマンドを使って、現在のドキュメントエラーや警告を表示するしたり、プロジェクトの他のドキュメントを参照する。

  2. あなたが、同じような(テキスト)ファイルから、1セットのウェブページを生成しているときオリジナルのテキストファイルにリンクを張ることができます。なので、(ブラウザで)生成された結果を調べている時に、txmt:リンクを追っていくことでそれぞれのページのソースをすぐに編集できます。

URLスキームはtxmt:で現在はopenというコマンドを使っています。このコマンドには3つまでの引数を使えます:

txmt:のURLの完全な例として、(テストのためにこちらをクリックしてください):

txmt://open/?url=file://~/.bash_profile&line=11&column=2

21.3 ODBエディタスイート

TextMateはODBエディタスイートのサーバーサイドを実装しています。このことによって、そのプロトコルのクライアントサイドを実装しているプログラムの外部エディタとして使うことができます。

しかしながら、どのテキストエディタがプロトコルを実装しているをりすとをハードコードしています。よって、もし、ODBエディタスイートをサポートしているアプリケーションの外部エディタのリストにTextMateがない場合は、そのアプリケーションの作者に、サポートされているエディタのリストにTextMateを加えるようにリクエストしないといけないかもしれません。

外部テキストエディタとして設定できるアプリケーションを追跡するwikiページあります。

21.4 Cocoaテキストフィールド

TextMateには(Mailで使われているのを含めて)TextMateをスタンダードCocoaテキストエディタコントロールからTextMateを呼び出すことができる、"Edit in TextMate"というインプットマネージャーが含まれます。これは、Safariのフォーム要素のように、ODBエディタスイートを実装しないプログラムで使うときに便利です。

詳しい情報は、(ステータスバーのギアメニューからアクセスできる)TextMateバンドルにあるInstall “Edit in TextMate”…を選択してください。実際にインストールする前に必要なドキュメンテーションをすべて提供します。

22 エキスパートのための設定

TextMateにはGUIでは見えない設定がいくつかあります。

これらの設定の変更は defaults シェルコマンドで可能です。しかし、TextMateが起動していないときにこれをしなければいけません。

次のシンタックスのように、与えられた値(value)に対してキー(key)を設定します:

defaults write com.macromates.textmate «key» «value»

いつもデフォルトの値を使ってキーをリセットできます。:

defaults delete com.macromates.textmate «key»

もしくは以下のように使い、値を読むことができます。:

defaults read com.macromates.textmate «key»

22.1 NSDragAndDropTextDelay

あなたが、選択部分の上でマウスをクリックしてマウスをうごかすと、もしあなたが15ミリセカンド待ち、それから選択範囲をドラッグしない限り、TextMateは新しい選択範囲を作ります。この遅延時間はこの設定の値によって変えることができます。

値をゼロ以下(例えば、-1)にセットすると選択範囲をドラッグすることができなくなります。それは、選択範囲の中でマウスをクリックをするとすぐにそれをすぐに感知し、(ボタンが押されている間にマウスを動かせば、)そのポイントから新しい選択範囲を作るという言う意味です。

ゼロにセットすればすぐにドラッグを始めます。

例:

defaults write com.macromates.textmate NSDragAndDropTextDelay 0

22.2 NSRecentDocumentsLimit

これは"Open Recent"メニューに保存されているドキュメントの数を設定します。デフォルト値は25です。

例:

defaults write com.macromates.textmate NSRecentDocumentsLimit 50

22.3 OakBundleItemsPopUpMenuKeyEquivalent

ステータスバーにあるギアメニューを開くキーボードショートカット。このキーはsystem key bindings fileで説明されています。デフォルトの値は"^\033"(コントロール エスケープです)。

キーコードに関する詳しい情報は、このメールを参照してください。

22.4 OakBundleManagerDisambiguateMenuFontSize

もしあなたがメニューで使われているタブトリガーと対応するキーと似たものを明確にするためのフォントが小さすぎると思うなら、次のように実行してください。

defaults write com.macromates.textmate OakBundleManagerDisambiguateMenuFontSize 14

22.5 OakDefaultBundleForNewBundleItems

あなたがはじめにバンドルを選択せずに、バンドルエディタで新しいアイテムを作ると、このデフォルトキーによって使われるUUIDのバンドルがターゲットとして使われます。

これは自動的にあなたが作る最初のバンドルに設定されます。これをどう変更するかの例は このメールを見てください。

22.6 OakDefaultLanguage

新規の(無題の)ドキュメントのデフォルトの言語を設定します。値は使われる言語のUUIDを使います。

さらなる情報はメーリングリストのこのメッセージをみてください。

22.7 OakDisableSessionRestore

あなたがTextMateを起動するとき、最後に使ったプロジェクト/ドキュメントが開きます。しかし、次のコマンドを実行することによってこの機能を無効にできます。

defaults write com.macromates.textmate OakDisableSessionRestore 1

22.8 OakDocumentCustomFSMetaData

TextMateがメタデータ(setxattr replacement)を保存するときに使う関数のためのファイルシステムの配列です。メタデータはAppleDoubleフォーマットで保存されます。デフォルト値は( afpfs, nfs, msdos )になっています。こうなっている理由は、setxattrがこれらのファイルシステムでカーネルパニックを発生させるからです。(rdar://4162474)

例:

defaults write com.macromates.textmate \
   OakDocumentCustomFSMetaData '( afpfs, nfs, msdos, hfs )'

22.9 OakDocumentDisableFSMetaData

詳しい情報はextended attributesをみてください。

22.10 OakFindPanelDisableHistory

これは、検索パネルの履歴を残さないようにするためです。この設定はユーザーの中に検索ダイアログでタブキーを押したときにクラッシュを経験した人がいるからです。履歴のコントロールによってこのクラッシュが発生します。現在のところ、このコントロールを使えなくすることでのみこの問題を回避できます。

defaults write com.macromates.textmate OakFindPanelDisableHistory 1

22.11 OakToolTipMouseMoveIgnorePeriod and OakToolTipMouseDistanceThreshold

コマンドをツールチップを出したときに最初の1秒の間はマウスを動かしてもツールチップは閉じません。1秒後ツールチップが閉じます。ツールチップを閉じるためには、少なくとも5ピクセル分 マウスを動かす必要があります。OakToolTipMouseMoveIgnorePeriodOakToolTipMouseDistanceThresholdを使うことでこの値を変更できます。

22.12 OakWrapColumns

これは、View → Wrap Column サブメニューで使われる値の配列です。デフォルトでは、40と78が使われています。

例:

defaults write com.macromates.textmate OakWrapColumns '( 60, 70, 80, 120 )'

22.13 OakWordsExcludedFromCapitalization

The Text → Convert → to Titlecase action (⌃⌥U) は以下の配列の単語を例外として扱います。

デフォルト値は以下の通り。 ( a, an, and, at, but, by, else, for, from, if, in, nor, of, off, on, or, out, over, the, then, to, up, when )

23 ヘルプをえる

23.1 メーリングリスト

TextMateのためのメーリングリストがあります。アーカイブはパブリックで以下のフォームで検索できます。

23.2 IRC チャンネル

##textmate というIRCが freenode.net上にあります。

23.3 他のリソース

23.3.1 TextMate チートシート

David Powers が、印刷してあなたのコンピュータの隣においておくことができる簡潔なチートシート ( PDFへの直接リンク) を作りました。これは、たくさんの一般的なアクションのキーの組み合わせのリストを示します。

23.3.2 TextMate Tutorials

Soryu は 2つのセットアップと基本的な使用法を扱ったTextMateのチュートリアル書きました。

23.3.3 スクリーンキャスト

スクリーンキャスト RSS フィード をiTunesを通じて購読できます。

Here is a list with direct links to a few of the screencasts in recommended viewing order:

短いようやくと全てのリストはオンラインのスクリーンキャストのページをご覧ください。

24 Appendix

24.1 Property List Format

Normally TextMate presents settings and such using a GUI, but for the language grammars and preferences items it exposes you to the old-style property list format.

For the purposes of TextMate this format has 3 data types which are described below. Notice that the escape rules for strings have been changed slightly compared to Apple's official format. This was done to make the language grammars more readable, since these need a lot of literal escape characters.

24.1.1 Strings

The basic type is a string which can be either single or double quoted.

When the string is single quoted, all characters are verbatim. If you need to put a ' inside a single quoted string, you need to use two, for example:

'Normal string'          => Normal string
'That''s an apostrophe'  => That's an apostrophe
'String with \backslash' => String with \backslash

As you can see, the only interpretation which happens is to convert any occurrence of '' to a single '.

Double quoted strings do support escape sequences, apart from \" and \\. For example:

"Normal string"          => Normal string
"Some \"quoted\" text"   => Some "quoted" text
"Literal \escape"        => Literal \escape
"Escaped \\escape"       => Escaped \escape
"Two \\\escapes"         => Two \\escapes

When a string consists entirely of letters, underscores and dashes, it is possible to omit the quotes. For example the following are all legal strings:

foreground-color
this_is_a_string
justLettersInThisOne

24.1.2 Arrays

Arrays are collections of elements, each element can be another array, a string or a dictionary. Elements are comma separated and the entire list is enclosed in parentheses. Some examples:

( "foo", "bar", "fud" )
( "nested", ( "array", "in" ), "array" )

It is allowable to put a comma after the last element, like this:

( "foo", "bar", "fud", )

24.1.3 Dictionaries

Dictionaries associate a value with a name (key). They are also known as maps, hashes, associative arrays and probably go under a few other terms as well.

The structure is: { «key» = «value»; } here «key» is a string and «value» can be either an array, string or another dictionary. Some examples:

{ color = "black"; }
{ colors = ( "red", "green", "blue" ); }

24.2 Indentation Rules

24.2.1 Introduction

Source code and structured text generally have indentation conventions. TextMate can help you with these if you tell it when to increase and decrease the indent.

Having TextMate figure out the proper indentation is useful when you paste text in another part of the source (where the indentation is different), when you press return on a line that affects the indentation (for next line), or when you press tab at the beginning of the line (and want as much indentation as appropriate for that line).

24.2.2 The System

Some languages go a little beyond a single character/keyword to increase and another to decrease, so TextMate has four (regexp) patterns you can set to tell it about your indentation conventions.

The patterns should be set in the Bundle Editor and are set as preference items with the scope set to the scope for which you want the rules to apply (e.g. source.c++).

Indentation Rules

We will use the following code example to explain the four patterns:

 1  int main (int argc, char const* argv[])
 2  {
 3     while(true)
 4     {
 5        if(something())
 6           break;
 7  #if 0
 8        play_awful_music();
 9  #else
10        play_nice_music();
11  #endif
12     }
13     return 0;
14  }

24.2.3 Increase Pattern

The increaseIndentPattern should match the lines which increase the indent. In our example above, this is the { characters at lines 2 and 4 (the if on line 5 will be discussed later).

The simple preference for this pattern would be:

increaseIndentPattern = '\{';

However, since we could have code like this:

int arr[] = { 1, 2, 3 };

or

str = "foo {";

we need to make it a little more complicated, by ensuring that no }, " or ' will follow the { on the same line. A good choice for languages which use the bracket to start a block would be:

increaseIndentPattern = "^.*\{[^}\"']*$";

24.2.4 Decrease Pattern

The decreaseIndentPattern should match the counterpart of our increase indent pattern. In our example the indent is increased by lines 12 and 14. The character here is } and so the simple decrease indent pattern would be setup as:

decreaseIndentPattern = '\}';

the more complex version may allow only comment end markers in front of the } and whitespace or ; after the }, so with that in mind, we extend the pattern to:

decreaseIndentPattern = '^(.*\*/)?\s*\}[;\s]*$';

24.2.5 Increase Only Next Line

We ignored line 5 in the increase indent pattern, that is because it does not really increase the indent, it only causes the next line to be indented if a block is not started.

For this situation there is the indentNextLinePattern, which should match these lines. We could make it something like:

indentNextLinePattern = 'if|while|for|switch|…';

But generally in C-like languages, all lines not terminated with a semi-colon (or ending with starting a block), cause the next line to be indented. This is (with most conventions) also the case when manually breaking one expression into several lines, e.g.:

some_function(argument1,
   argument2,
   argument3);

more_code;

So instead of explicitly matching known language constructs which have the next line indented, we simply match all lines which are not terminated with a semi-colon or brackets. One thing to remember is single-line comments like this:

some_function(arg); // this is terminated

To solve that, we start with a negative look-ahead assertion in this case and then go on to match lines not terminated by any of the characters mentioned above. The pattern ends up as:

indentNextLinePattern = '^(?!.*;\s*//).*[^\s;{}]\s*$';

24.2.6 Ignoring Lines

Sometimes we have lines which are outside the normal indent, or does not affect the indent despite matching our rather general indentNextLinePattern. In our example these are the preprocessor lines (line 7, 9 and, 11).

To tell TextMate about these lines, there is an unIndentedLinePattern rule. Another case to avoid might be something like this:

 1     some_function();
 2  
 3  /* ignore_first();
 4     ignore_second();
 5  */
 6     more_functions();

Here line 3 and 5 would count as having zero indent, so we want to ignore these.

To instruct it to ignore preprocessor lines, lines with leading comments or a few Objective-C directives (which are not terminated by a semi-colon), we can use this pattern:

unIndentedLinePattern =
   '^\s*((/\*|\*/\s*$|//|#|@interface|@implementation|@end).*)?$';

24.3 Plug-in API

When launched, TextMate loads plug-ins located in ~/‍Library/‍Application Support/‍TextMate/‍PlugIns. The plug-in should be a normal Objective-C bundle with a principal class which will receive an initWithPlugInController: when instantiated.

There is a sample plug-in here. Though other than the startup message, TextMate does not offer any API for the plug-in to use (but will likely do so in the future).

If you are interested in developing plug-ins for TextMate, you can subscribe to the plug-ins mailing list.