lessでの編集NSDragAndDropTextDelayNSRecentDocumentsLimitOakBundleItemsPopUpMenuKeyEquivalentOakBundleManagerDisambiguateMenuFontSizeOakDefaultBundleForNewBundleItemsOakDefaultLanguageOakDisableSessionRestoreOakDocumentCustomFSMetaDataOakDocumentDisableFSMetaDataOakFindPanelDisableHistoryOakToolTipMouseMoveIgnorePeriod and OakToolTipMouseDistanceThresholdOakWrapColumnsOakWordsExcludedFromCapitalizationドキュメンテーションの使用目的はTextMateの主な特徴を説明し、はじめて使うユーザにとってはっきりとわからないかもしれない特徴を明らかにすることです。このドキュメンテーションは包括的ではありません。
あなたはテキストエディタが何であるかについてをよく理解してあるべきです。特にあなたはTextEdit, MailやXcodeなどで使われているCocoaのテキストエディットコントロールの経験があるべきです。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)で提供される)シェルのインフラストラクチャが何かついて知っているべきです。
だいたいの部分に、TextMateとこのドキュメンテーションはAppleの用語に従います。以下は誤解の原因になるかもしれない用語の表です。
| 用語 | 説明 |
|---|---|
キャレット |
テキスト挿入ポイント。 |
カーソル |
マウスポインタ。 |
ドキュメント |
これは、(編集される目的で)TextMateへロードされたファイルを指します。昔からのユーザはよくこれをバッファと呼びます。 |
ディレクトリ |
これはフォルダのかわりによく使われます。フォルダは主にGUIについて話すときにつかわれます、そして、ディレクトリはシェルに関連したことを話す際に使われます。 |
概してTextMateとこのドキュメンテーションはキーのグリフ表示を使います。以下はほとんどのグリフと(よくこのドキュメンテーションで使われるような)キーの名前と短い説明の表です。

もしあなたがキーのがどこにあるか自信がない場合、あなたは、キーボードビューワを出すことができます。(それはシステム環境設定の国際ペーンのなかのインプットメニューに加えることが可能です。)
| グリフ | キーの名前 | 説明 |
|---|---|---|
⌃ |
コントロール |
このキーは一般的に左の下側にあります。(そして対照的に右側にもあります。)対応するキーだけでなく、このキーはコンテクストに依存したメニューを出すために、マウスクリックとともに使われることもあります。 |
⌥ |
オプション |
これはコントロールキーの隣にあり、よくAltというラベルがついています。あなたは長方形にテキストを選択するためにマウスを使いながらオプションキーを押さえたままにできます。また、オプションキー(⌥)を押さえながら、一度マウスをクリックすることによって、行の最後より右の場所にキャレットをおくこともできます。シフトといっしょに、オプションキーであなたがクリックする場所へ(長方形の)選択部分を作ることができます。 |
⌘ |
コマンド |
コマンドキーはアップルキーとして呼ばれることもあります。なぜならアップルのシンボル()がついているからです。 |
⇧ |
シフト |
シフトキーはよく知られているはずです。マウスクリックといっしょに使うと、選択範囲を広げることができます。 |
⎋ |
エスケープ |
エスケープキーは一般的にキーボードの左上の角にあります。 このキーはpanelsを退ける(キャンセルする)。panelsとはダイアログや(全てではないが)いくつかのウインドウという意味です。TextMateでは、補完候補を循環するために使われることもあります。 |
⌅ |
エンター |
エンターキーは数字キーパッドにあります(、そしてそれはリターンキーと同じではありません。)ラップトップではファンクション- リターンにあたります。 |
↩ |
リターン |
リターンキーはよく知られているでしょう。 |
⌦ |
フォワード・デリート |
これはよくデリートと呼ばれ、キーボードにDelやDeleteと書かれています。 |
⌫ |
バック・デリート |
よくバックスペースと呼ばれます。たいていのキーボードでは 左向きの矢印がキー(←)にあります。 |
﹖⃝ |
ヘルプ |
ヘルプキーはフォワード・デリートの上に位置します、しかし全てのキーボードにあるわけではありません。一般的にHelpとキーに書かれています。しかし、Insキーとしても知られています。 |
↖ |
ホーム |
ホームキーはドキュメントの最初にスクロールさせます、しかしキャレットは動きません。 |
↘ |
エンド |
エンドキーはドキュメントの最後にスクロールさせます、しかしっキャレットは動きません。 |
⇞ |
ページアップ |
キャレットを動かさずに一ページ分上にスクロールします。オプションキーを使ってキャレットを動かすことができます。シフトキーと使うと、選択部分を作ります。 |
⇟ |
ページダウン |
キャレットを動かさずに一ページ分下にスクロールします。オプションキーを使ってキャレットを動かすことができます。シフトキーと使うと、選択部分を作ります |
⇥ |
タブ |
タブはタブ文字(もしくは、もしソフトタブを有効にしていれば、同等のスペースの数を挿入するのに使われます。通常のコントロールでは、フォーカスを次のコントロールへ進めます。 |
⇤ |
バックタブ |
バックタブキーはシフトを押さえながら、通常のタブキーを押すことによって使われます。 |
TextMateは未完成です。(西洋系以外のユーザにとって)現在の重要な制限は(CJKのような)国際的なインプットモード、プロポーショナルフォント、右から左へのテキストレンダリングと他の(ユニコードの)機能のサポートです。作者として、私はユーザがTextMateにこれらのサポートを望んでいることを理解しています。しかし、今のところ適切なサポートは長期間のto-doアイテムです。
そして、制限のトピックについて、私はまた(s)ftpの統合、コード・ヒント、スプリットビュー、よりよい印刷、インデントされたソフトラップ、コーヒーメイキングそして文字通り何百もの他のユーザリクエストを知っています。あなたは[メーリングリストを検索]することによってアーカイブからほとんどの機能リクエストについての私のコメントを見つけることができるでしょう。しかし、私が何かが現れるバージョン番号以外に、私は見通しや期間を示しません。
現在のTextMateのバージョン(1.5)では、ファイルタブはプロジェクトが作成されているときのみサポートされています。幸運なことに、プロジェクトを作成するのは簡単です。つまり→ New Project (⌃⌘N)を選択するだけです。
これで下のようなウインドウが開きます。

ファイルを(プロジェクト)ドロワにドラッグするか、(ギアのアイコンがついた)プロジェクドロワアクションメニューから、“Add Existing Files…”を使うことによってファイルを追加することが可能です。
プロジェクトを作成する別の方法は、複数のファイルを直接(例えば、Dockにある)TextMateアプリケーションアイコンにドラッグすることです。これは、これらのファイルからなる新しいブロジェクとを作成する近道です。
もうひとつのたいしたことのない詳細は、このようにプロジェクトを作成すると、プロジェクトを閉じるときに、プロジェクトを保存したいかどうかを尋ねられないということです。
プロジェクトを保存すること利点は、(例えばどのファイルが開いていたかという)状態を保全でき、すぐに特定のファイル群を開くことができることにあります。もし、TextMateを修了するときに(保存された)プロジェクトを開いたままにしておくと、そのプロジェクトは次にTextMateを起動したときに自動的に開きます。
またターミナルからプロジェクトを作ることも可能です。たとえば、mateシェルコマンドをつかって。
プロジェクトがディスクにあるファイルとフォルダーを模倣するためには、フォルダーをTextMateのアプリケーションアイコンかプロジェクトドロワにドラッグすることもできます。
TextMateはディスクでの変化にあわせてフォルダの中身を自動的にアップデートする、フォルダレフェレンス (folder reference)を作ります。

現在のところ、アップデートはTextMateにフォーカスが戻ったときにされ、ネットワーク上のマウントされたディスクでは遅いかもしれません。その場合は、プロジェクトに追加したいファイルのみを追加し、解決した方がいいかもしれません。(追加されたファイルはディスクでの構造をまねるために手動でグループ化し並び替えることもできます。)
この、ネットワーク上のマウントされたディスクでの更新の遅れについては、将来のリリースで解決される予定です。
フォルダレフェレンスを使っているとき、あなたはある個別のファイルやフォルダをプロジェクトから除外したいとおもうかもしれません。これは、Preferences → Advanced → Folder Referencesの中にあるファイルとフォルダのパタンを変えることによって可能です。

それぞれのファイルとフォルダの完全なパスにマッチする正規表現があります。もしそのパタンがアイテムとマッチしたら、そのアイテムは含まれます。そうでなければ、除外されます。これを反対にするためには、つまりマッチしたものをプロジェクトから除外するには、感嘆符(!)をパタンの前につけます。
パタンは新しいフォルダを作るときだけ使われます。現在のフォルダレファレンスには、プロジェクトドロワの中のフォルダレフェレンスを使うことができ、プロジェクトドロワの(文字を丸で囲んだIという)インフォボタンを使い、パタンを編集することができます。
このシステムの複雑さは将来のバージョンで解決される予定です。
プロジェクトドロワのファイルはシングルクリックもしくはダブルクリックすることができます。もしシングルクリックをして、そのファイルのタイプがテキストであれば、そのファイルはメインウインドウのタブで開きます。
![]()
もしファイルをダブルクリックすると、そのファイルはデフォルトのアプリケーションで開きます。フォルダーもダブルクリックされることがができることを覚えておいてください。例えばInterface Builderのnibファイルはフォルダとして表示され、ダブルクリックされることができ、(そして、Interface Builderで開きます。)
前述のように、テキストファイルのみがメインウインドウで、シングルクリックされたときに開かれます。TextMateが、ファイルがテキストかどうかを判断する方法は、ファイルの拡張子によってです。 - もし拡張子が不明の場合ファイルの最初の8 KBを読み、それが有効な(ASCIIの上位集合である)UTF-8であるかどうかをチェックします。
もしTextMateがあなたのファイルを開かず、そのファイルがアクションメニューを表示させる拡張子を持っている場合、その最後に以下のように表示されるはずです。Treat Files With “.«ext»” Extension as Text (".«ext»"拡張子をもつファイルをテキストとして扱う)
デフォルトでは、プロジェクトドロワはプロジェクトウインドウの左側に開きます。もし左側に十分なスペースがない場合は、右側に開きます。この設定は固定されます。なので、どちら側でドロワが最後に開いたかを記憶します。

左側に戻すためには、いったんドロワを閉じ、(View → Hide Project Drawer)、それから右側にスペースがないようにプロジェクトウインドウを移動させます。それから、ドロワを再度開きます。そうすればまた左側に開きそれが新しいデフォルトとなります。
右側に強制的に開きたいばあいはその反対を行ってください。
Edit → Find → Find in Project… (⇧⌘F) を使って下にあるようなウインドウを表示させることができます。

ここから現在のプロジェクトのなかのすべての(テキスト)ファイルを検索し置換することができます。Findを押した後、Replace All(全て置換)もしくはどのマッチが置換されるべきかを選択することができます。その場合には、Replace AllボタンはReplace Selectedに変わります。
現在のところ、プロジェクト全体の全てのテキストファイル以外の何かに検索の対象をしぼる事はできます。事前策としては、もしあなたがプロジェクトのサブセットだけを検索したい場合、あなたはプロジェクトドロワのなかのファイルを選択して、その選択をTextMateのアプリケーションアイコンにドラッグして、全く新しいプロジェクトを作ることができます。検索/置換はそのプロジェクトで実行され、そのあと閉じることができます。
プロジェクトで作業をしているとき、開いているファイル間を移動する2、3の方法があります。
もっとも簡単な方法はあなたが使うファイルのタブをクリックすることです。また、キーボードからは⌘1から9を押すことで可能です。ファイルタブの1から9へスイッチできます。
またあなたは、現在のタブの左か右のファイルのタブを選択するためには⌥⌘← と ⌥⌘→を使うことができます。
マウスを使ってファイルタブ並べ直すことが可能です。(タブの上でマウスボタンをクリックしホールドして、その後、新しい場所へドラッグします。)このようにして、キーボードでのスイッチングがより自然になるように、並び替えることができます。
もう一つのキーが⌥⌘↑です。現在のファイルと同じベースネームをもったファイルのテキストファイルへの移動を繰り返します。これは、主にインターフェイスファイル(ヘッダ)と実装ファイル(ソース)をもつ言語での作業で役に立ちます。
もし開いていないファイルへ移動したい場合、NavigationメニューにあるGo to File…(⌘T)アクションを使うことができます。これは、下のようなウインドウを開きます。

このウインドウは最後の使用に従って、プロジェクトの全てのテキストファイルのリストを表示します。つまり、リターンを押すとあなたが最後に使用したファイルへ移動します。このように使うと、最近使ったファイルへ簡単に移動できます。
あなたは表示されるファイルの数を少なくするためにフィルタ文字列を入力することができます。このフィルタ文字列は省略形としてファイルネームに対してマッチします。それでファイルは与えられた省略形に対してどのくらいよくマッチするかによって並べ替えられます。例えば、上の画像ではフィルタ文字列はotvです。それでTextMateはOakTextView.hがベスとマッチだと(一番上に表示することによって)決めています。
私が必要としているファイルは#2にランクしているOakTextView.mmです。しかし、私はすでに過去に修正したので、TextMateはこれがotvというフィルタ文字列とうまくいくマッチだと学びます。つまり、これは適応/順応的であり、あなたの使い方のパタンから学びます。
もしあなたがキャレットをそのドキュメントのどこか別の場所に動かす必要があって、また早く戻ってくる必要があれば、あなたは現在の行にブックマークを設定することができます。
これは、(ブックマークのためにある列の)ガッターをくりっくするか、⌘F2を押すことによってなされます。ブックマークは以下のように星印で示されます。

あなたが、元の場所に戻りたいとき、F2を押してください。F2はあなたをドキュメントの次のブックマークの位置へ動かします。もし、複数のブックマークがある場合、あなたはF2を何回か押すことができます。⇧F2を押すと前のブックマークへ移動します。
{ … }, do … end, <tag> … </tag>のように、もしあなたが、ブロックにスタートとエンドのマーカーを持っている言語を使用しているとき、TextMateはこのブロックを見つけて、上向きと下向きの矢印をスタートとエンドマーカーのガッターに表示します。
この矢印が表示されているとき、上下の矢印の表示をマウスでクリックするか、もしくはF1キーを押すことによってブロックを一つの行にたたむことが可能です。これは、ガッターの矢印を右向きに変え、全てのブロックが行末におかれたellipsisのマーカーを置くことによってたたまれたことを示します。二つのconstructorのサブブロックがたたまれた場合の例は以下のようになります。

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

警告:折り畳む機能は両方がともにはっきりとしたインデントマーカーをもっていて、かつスタートとストップマーカーが同じインデントレベルにあることを基礎としています。つまり折りたたみは純粋にインデントに頼っているため、スタートとストップマーカーがalignしていない場合は現在サポートしていません。
前述したように、折りたたみのシステムははっきりと決められたスタートとストップマーカーを使用します。TextMateはこのことを、あなたがfoldingStartMarkerとfoldingStopMarkerの正規表現を設定できる、language grammarから知ります。

上に見えているのはHTMLの折りたたみのパターンです。これは、行のタグのペアやHTMLコメント、Smartyタグとスタート/ストップのブレース(大括弧)のセットをもとにして折り畳まれているので比較的シンプルです。
<?php if(something) { // user is authenticated ?>
...
<?php } // user is authenticated ?>
行のスペース以外のキャラクターとして{から始まり、行の最初のスペースでないキャラクタとして}で終わるブロックを定義するには、次のようなパターンを使うことができます。
foldingStartMarker = '\{\s*$';
foldingStopMarker = '^\s*\}';
ファンクション(関数)ポップアップをサポートする言語に関しては、ステータスバーの一番右のポップアップが現在の“シンボル”をしめします。(キャレットの上の関数プロトタイプや見出しであることもありますが。)
![]()
ポップアップをクリックして現在のドキュメントの全てのシンボルのリストを出し、他のシンボルへキャレットを移動させることができます。これは以下のように示されます。

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

パネルは表示されたままになりドキュメントが編集されるにつれて自動的にアップデートされます。リストの中のアイテムをシングル・クリックすると、キャレットはクリックされたシンボルへ移動します。ダブルクリックすると同じ動作をしますが、パネルは閉じられます。
シンボルリストはlanguage grammars と scope selectorsを使用して動作します。ランゲージグラマーはドキュメントのそれぞれのエレメントに名前を付与し、スコープセレクタはその名前に基づいてドキュメントのsubsetをターゲットにすることができます。普通は、そのパラレルはHTMLとCSSです。例えば、バックグラウンドを青に設定するテーマアイテムを作り、その後、スコープセレクタでドキュメントのどのエレメンツにこのテーマ(青いバックグラウンド )が適用されるのを必要とするかを選びます。
視覚の設定を変えるのではなく、(一般的に)視覚ではない背ていを変更するという点以外は、バンドル設定もテーマアイテムと同じように動作します。例外のひとつはshowInSymbolListです。これを1に設定して、例えば全ての\関数の名前をターゲットにするスコープセレクタを使用することによって、シンボルリストで使うための、ドキュメントから全ての関数の名前を抽出するクエリとしてスコープセレクタを使っていることになります。
シンボルリストをpopulateするために必要なのは:
ランゲージグラマーが表示したいものに名前を付与していると確かめること。
showInSimbolListを1に設定して、シンボルリストに必要としているシンボルにマッリするスコープセレクタをを作る、バンドル設定アイテムを作ること。
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
';
}
TextMateはほとんどの部分は、MailやSafariや基本的な全ての他のCocoaアプリケーションによって使われているシステムコンポ年とであるNSTextViewの振る舞いをまねようとしています。
このセクションではテキスト編集に関連した、その他の機能の一部をカバーします。
(マークアップやソースコードのような)構造化されたテキストを書くとき、ペアになる文字があります。例えばプログラミング言語では、左中括弧({)を使って、右中括弧(})を使わないといったことは滅多にありません。
あなたがこれらの文字の釣り合いを保つために、TextMateは、あなたが開始文字をタイプしたときにキャレットの後に、適切な閉じる文字を挿入します。もしあなたが閉じる文字をタイプした場合、TextMateはとても賢いので自動的に挿入されたものを上書きします。もしあなたが開始文字をタイプしそれをバックデリート(⌫)を使って削除すると、自動的に挿入された文字も削除されます。もしあなたが自動的に挿入された文字のみを削除したいなら、代わりにフォワードデリート(⌦)を使ってください。
またテキストを選択し、開始文字によって、開始/終了文字で選択範囲を包むことができます。例えば、fooとタイプして、それを選択し、(をタイプします。そうすると、TextMateはそれを(foo)にして、最後の括弧の後にキャレットを移動します。
実際の文字ペアは、さまざまな言語とコンテキストのさまざまな設定といっしょにbundle preferencesで定義されています。例えば、ソースコードではアポストロフィは、コメントや文字列を除き、それ自身が週虜文字として登場するまでセットされます。これはスコープセレクタを使う事によって実現しています。
(Source bundleのマクロとして定義され、いくつかの言語では上書きされる)自動にペアになった文字に関連してふたつのショートカットは:
⌘↩
行の最後に移動し、新しい行を挿入する。
例えば、もしあなたが、以下のように書き:
print("foo
キャレットの右側に")があると、⌘↩を使って、この二つの文字を飛ばして、新しい行を挿入します。
⇧⌘↩
行の最後へ移動し、;を挿入し、新しい行を挿入します。
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拡張子を持っている、現在のディレクトリ(とその直下のサブディレクトリ)にあるいかなるファイルにもマッチとして見つけます。
あなた自身の補完コマンド(またはリスト)を提供すると、デフォルトのマッチを無効化したいかもしれません。これは、disableDefaultCompletionを1にセットすることで可能です。
テキストをコピーまたはカットすると毎回、テキストはスタックにに押し出されます。
⌃⌥⌘Vを押すと全ての過去のクリッピングのリストを見ることができ、そこから矢印キーを使ってペーストしたいものを選ぶことができます。挿入するにはリターン、リストを消すためにはエスケープを使ってください。リストを消すと、現在選択されたクリッピングが次のときにペースト機能を使ったときにペーストされます。

リストからクリップを選ばなくても、リストの前のクリップをペーストするのに、⇧⌘Vを使うことができます。もう一度キーを押すともう一つ前のクリップへと移動します。戻るには、⌥⌘Vを使えます。これらのキーボードショートカットは、一つのドキュメントから複数のコピーを作って、LIFO-style (Last In First Out)で他のドキュメント(もしくは同じドキュメントの他の場所)にペーストする際に便利です。
テキストをペースとするときに、TextMateは、現在のインデントのレベルだけでなく、ペーストされるテキストのインデントを見積もり、現在のインデントとマッチするようにペーストされるテキストを調節します。
テキストをインデントし直すのセクションで触れられるインデントルールを使って見積もられます。
もし一時的にこれを回避したい時は、⌃⌘Vを使ってペーストできます。また、PreferencesのText Editingにて永久にテキストがインデントし直されるのを無効化できます。
Edit → Mode submenu (⌥⌘E)でフリーハンド編集を有効化/無効化でいます。
このモードが有効化されているとき、キャレットの移動は行末やタブストップに制限されません。
これは、いくつかの行のある一定の列に何かを挿入し、(そしてパディングを挿入したくない)ときやその他のシチュエーションで、ASCIIダイアグラムでの作業に役に立ちます。
列の選択をしているときは、フリーハンドモードは(一時的に)有効化されるため、行末を超えて、選択範囲を作ることができます。
オプションキー(⌥)を押しながらマウスをシングルクリックすることによって、行末を超えた場所にキャレットを置くことも可能です。
Edit → Mode サブメニュー (⌥⌘O)で上書きモードを有効にすることによって、ドキュメントにすでにある文字はいつものように挿入されず、あなたがタイプするにしたがって上書きされます。
これは以下のようなカラムデータで作業をするとき便利です:
foo jaz
bar sub
fud dub
最初のカラムの値のいくつかを上書きしたいときを想像してください。同じように、固定された幅のリストがあり、その一部を幅を保ちながら置換したいかもしれません。例えば、カラム20で右寄せしなければいけないが、レーベルを上書きしたい、以下のようなコードがあるかもしれません:
printf("Value is %3d", 37).
スタンダードの検索ダイアログに加えて、TextMateには、検索と置換アクションのためのショートカットをもった(Editメニューにある)Findサブメニューがあります。

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

もしテキストフィールドに改行やタブ文字を挿入する必要がある場合は、タブ(⇥)もしくは、リターン (↩) キーを押すときに、オプション(⌥)をホールドしておく必要があります。これで、リテラルのタブや改行文字が挿入されます。
⌘E と ⌘Gという二つの便利なキーボードショートカットがあります。初めのものは選択範囲を共有された検索クリップボードにコピーします。これは、多くのアプリケーションで動作し、⌘Gによって、その文字列が次にある場所を見つけることができます。
検索クリップボードはSafari, TextEdit, Mail, TextMate, Terminal, Consoleであれ、アプリケーション間で動作します。選択されたキスとを検索クリップボードにコピーして、アプリケーションを切り替え、その文字列を見つけるために、⌘Gを使用できます。
それに加え、TextMateは選択範囲を置換クリップボードにコピーする、⇧⌘Eを提供します。これは検索ダイアログに移動せずにすむため便利です。例えば、もし、アイテムのリストのために改行をパイプ文字(|)と置換したい場合、改行を選択し、それを検索文字列として使うために⌘Eを押してください。そして、|とタイプし、選択して、それが置換クリップボードにコピーされるように⇧⌘Eを押してください。
次のステップは、ドキュメント全体に対して置換を実行するために⌃⌘Fを押すか、置換を実行したい範囲を選択して⌃⇧⌘Fを押してください。
Textメニューには、Shift LeftとShift Rightアクションがあり、それぞれ ⌘[ と ⌘]が割り当てられています。これらは、一つのタブのサイズ毎にインデントの上げ、下げをします。
多くのヨーロッパのキーレイアウトでは、このキーはかなりやりにくい、ので、これに加えて、⌥⇥ と ⌥⇤を使うことができます。(⇤は⇧⇥を使って実現できます。)
もし、一行やブロックを数行分上下に動かしたり、一単語/カラムを動かしたい場合は、⌃⌘をホールドして、矢印キーで選択範囲を動かせます。選択範囲なしだと、行を上下に移動します。
それを選択して、Text → Indent Selectionを使うことができます。(もし選択範囲がない場合は現在の行をインデントします。)
The rules for estimating the indent are setup per-language using bundle preferences. For more details see the indentation rules section.
インデントの見積もりのルールはバンドル設定を使って言語毎に設定されます。インデントルールのセクション詳しくはを見てください。
テキストの選択は、通常の移動に使うキーを使いながら⇧をホールドすることによってできます。それに加えて、Edit → Selectのサブメニューには現在の語、行、パラグラフ、取り囲んでいるブラケットとドキュメント全体を選択するアクションがあります。
一定の長さの複数の行の末尾に文字を追加したり、このこれらの行の最後の部分を編集する必要がある場合がよくあります。
このためにあなたは検索と置換を使うことができますが、より簡単な方法は、編集される必要がある行を選択し、Text → Edit Each Line in Selection (⌥⌘A)を使うと、キャレットが選択範囲の最初の行の最後に置かれます。
そしてあなたは新しいテキストをタイプしたり、削除したり、戻って、もともとのテキストを編集したりできます。これは(その前に選択された)全ての行へミラーされます。このモードを終了するためには、現在の行からキャレットをはずしてください。
カラムデータを⌥をホールドしてマウスで選択範囲を作る事によって、もしくは、普通の選択範囲を作り⌥を一度押すこと(選択範囲のふたつのタイプの間をトグルする)によってカラムデータを選択することが可能です。
カラムの選択にはは全ての普通のアクションが実行可能です。例えば、選択の移動、選択の置換、(行の)トランスポーズ、Textメニューからのアクション、シェルコマンドを通しての、選択範囲のフィルタリングなど。
矢印キーの上下を⌥といっしょに使って、キャレットを現在のカラムの最初/最後の列に移動します。選択するためには⇧をホールドしてください。

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

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

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

行のはじめでタブキーを使うと、TextMateはその行にとって正しいタブの数を推測し挿入します。もし行にテキストがある場合は、キャレットはこのテキストの前へ移動します。
もし行にすでに正しいインデント(もしくはそれ以上のインデント)がある場合は、一つのタブが挿入されます。
TextMateはシステムワイドの'Check Spelling as You Type(タイプしながらスペルチェック)'をサポートします。これはEdit → Spellingで変更可能です。
間違ってスペルが書かれた文字がスペリングのサジェスチョンを得るためにはコンテキストメニューを出すことができます。
TextMateは構造化されたテキストの使用を意図しているため、ドキュメントの一部をチェックの対象から除外することがかのうです。これは、バンドルエディタのpreferences itemを作り、spellCheckingを0に設定し、スコープセレクタをスペルチェックをしないターゲットのセレクタに書き入れることでできます。
デフォルトではスペルチェックはソースコードでは文字列とコメントを除いて、無効化されています。またHTML, LaTex, Markdownなどではキーワードやタグのようなものでも無効化されています。
TextMateはタブ文字の代わりにスペースを使うことができます。これは、ステータスバーの"Tab Size"ポップアップをクリックし、Soft Tabsを有効にすることによって可能です。
この設定はは現在の言語にのみ影響します、共通の基礎をもった全ての言語はそのオプションがまだセットされていません。同じ事がスペルチェックの状態やソフトラップ、実際のタブサイズについていえます。

ソフトタブが有効な状態のとき、TextMateはたいていの場合まるであなたがハードタブを使っているかのように振る舞います、しかしドキュメントは実際にはスペースを含んでいます。
TextMateのたくさんの機能はさまざまなバンドルを通じて提供されます。多くのものは言語に依存です。
デフォルトのバンドルは、/path/to/TextMate.app/Contents/SharedSupport/Bundlesにあります。普通であればこのことは意識しなくてもいいです。Windowメニューにあるバンドルエディタを通して、バンドルをみたり、(編集したり)するからです。
Bundles → Bundle Editor → Show Bundle EditorでTextMateをカスタマイズするためのコマンドセンタを表示できます。

このウインドウからスニペットやコマンド、言語の文法を作ったり編集したりします。詳しくは、後のセクションで説明します。
Bundle Editorで編集されるほとんどのアイテムはテキストを編集しているときに実行したいアクションを示します。TextMateはそのためにいくつかの方法を提供し、アクティベーションの方法がどのアクションにつながるかを調べる際に、現在のコンテクストを理解する、シンプルですが、パワフルな方法があります。このシステムは、後のチャプタで説明されますが、スコープセレクタとよばれます。
キーボードからアクションを実行する一番簡単な方法は、キーボードショートカットです。キーボードショートカットは任意のmodifierと任意のキーからなり、key equivalent フィールドを有効化してアクションと結びつけられるキーを押すことによって設定できます。
![]()
もしキーボードショートカットとアイテムの関係をなくしたいのであれば、key equivalentが入力されるmモードのときに、Xを押してください。
もし複数のアイテムに同じキーボードショートカットが付与されていると、そのショートカットが押されたときに、下のようなメニューが現れます。(Mathバンドルのすべてのアイテムが⌃⇧Cに割り当てられているので、すべての選択肢がメニューといっしょに表示されます。

バンドルアイテムにショートカットを割り当てることができるとともに、アイテムに対してタブトリガーを割り当てられます。これは、タブキー(⇥)の前に、あなたがドキュメントに入力するテキストです。これは、あなたが入力したテキストを削除し、バンドルアイテムを入力します。
例えば、TextバンドルにはISO 8601 (YYYY-MM-DD)に準拠した現在の日付を入力するスニペットがあります。このスニペットのためのタブトリガーは(ISO Dateの略である)isoDです。ドキュメントの中で、isoDとタイプし、タブを押すことで、そのテキストを現在の日付に”展開"することができます。
このようにして、あなたが文字通り実行したいものをタイプするように、あなたのバンドルアイテムに覚えやすい言葉を作ることができます。一般的に、この目的は思い出しやすくするためなので、省略語を使うのではなくて、実際の言葉を用いた方がよいです。(例えばlstの代わりにlistを使うように)。よってタブトリガーは最初に頭に浮かぶ、省略されていない形が使われるべきです。
タブトリガーは、少し丸みを持った四角の背景にタブトリガーの末尾に表示されたタブ文字(⇥)でメニューアイテムの右側に表示されます。

タブトリガーはプログラムのキーワードとマッチさせて(例えばスニペットを挿入するように)あなたがいつもキーワードを入力した後に実行したいアクションを引き起こす際ににも便利です。例えば、Rubyではメソッドはdefではじまります。なので、Rubyのメソッドのためのスニペットを作って、defというタブトリガーを作れば、自然な流れになります。というのは、いつものようにdefとタイプして、そのまま普通に書いていくのではなくタブを使うことができるからです。もし仮に(Rubyで)メソッドを作るためのタブトリガーがmethodか何かであれば、あなたは、"私はメソッドののスニペットを挿入できる"とdefとタイプする前に覚えていなくてはいけません。一方defをタブトリガーに設定していれば、def と書いてその後にスペースを打つ前に思いだせばいいです。(基本的には、スペースの代わりにタブを押すだけです。)
キーボードショートカットと一緒で、タブトリガーを入力して、タブを押したときに、もし複数のアイテムが同じタブトリガーを使っていればメニューが表示されます。これは、簡易的な形のコード補完として使うことも可能です。例えばCSSではlistというタブトリガーはlistで始まるすべてのプロパティーに割り当てられています。なので、CSSでlistとタイプして、タブを押すと、そこからどのリストプロパティーが挿入されるベキかを選択できる、実用的なメニューを提供します。

デフォルトのアイテムにはあなたの好みに合わないものもあるかもしれません。例えばスニペットのコーディングスタイルがあなたのコーディングスタイルと違ったりするとです。なので、ほかのタブトリガーやショートカットが欲しくなったり、修正をしたいと思うでしょう。
もしあなたがデフォルトのアイテムを編集すると、その新しいものとデフォルトのものの違いは~/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からその変更を削除することが現在できる唯一の方法です。
バンドルエディタから簡単にデフォルトのバンドルを削除したりバンドルアイテムを削除したりできます。しかし、アイテムは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
これは少し複雑に聞こえるかもしれませんが、一般的に詳細についてあなたが気をつかう必要はありません。ただバンドルエディタを使って、アイテムを作成、編集、削除してください。予想通り動くはずです。
デフォルトのバンドルを削除する代わりに、(いつかそのデフォルトのバンドルが必要になる日がくるかもしれないので、)ただ隠したいと思うかもしれません。
バンドルエディタのリストの下のFilter list... をクリックすればできます。ここでバンドルアイテムのリストで表示させたくたいのものチェックをはずすことができます。

バンドルや個別のバンドルアイテムを共有したいなら、バンドルエディタから(ウインドウの左側のリストから)直接Finderへドラッグすることでできます。
このアイテムは他の人に送られて、その人がダブルクリックしてインストールすることができます。(注意:これはスニペットやコマンドのような、ひとつひとつのアイテムでも同様です。)
たいていの場合は、バンドルは個別の言語のサポートを提供します。(Source, Text, TextMateバンドルといったような例外はありますが。)バンドルがどのような機能を提供するかを知るには(Windowメニューからアクセスできる)バンドルエディタでそのバンドルを調べてみるとよいでしょう。適切な場合、言語のバンドル、次のもの、キーボードショートカットといっしょに提供します。
Build (⌘B) — 現在のソース/プロジェクトをビルドします。たいていの場合コンパイルと同じです。
Run (⌘R) — 現在のソース(スクリプト)やプロジェクトでビルドされたものを実行します。
Documentation for Word (⌃H) — (たいていの場合はオンラインで)現在の単語(または"unit")をドキュメンテーションで調べます。
Validate Syntax (⌃⇧V) — 現在のドキュメントタイプのためのシンタックスチェッカーを何らかの形で通じて、シンタックスを実行します。たいていツールチップとしてエラーが表示されます。より複雑な検証に関してはHTMLのアウトプットがよく使われます。
Wrap in «Something» (⌃⇧W) — 現在のドキュメントタイプで意味をなす形で選択範囲をラッピング/覆います。例えば、HTMLの開始/終了タグ、Latex のenvironementの開始と終了など。
Convert to «Something» (⌃⇧H) — ドキュメントを意味をなすものに変換します。例えば、HTMLではtidyを実行したり、MarkdownではHTMLに変換したり、XMLのプロパティーリストを読みやすいASCIIバージョンに変更したりします。一般的にこれはその場で行われ、現在のドキュメントに上書きされます。
Continue «Something» (⌅) — 現在のconstruct(構成概念)を次の行で続けます。例えば、ラインコメント、リストアイテムなど。
Preview Document (⌃⌥⌘P) — デフォルトではウェブプレビューを開きます、しかしその言語により沿ったマークアップ言語のプレビューのために使われます。(例えば、HTMLの変換をして、それを表示するための基礎的なスタイルシートをセットアップします。)
Insert Close Element (⌥⌘.) — デフォルトでは適切な終了タグ(HTML)を挿入しますが、コンテクストによっては、(LaTexの\end{environment}ような)閉じる要素をなすものであればなんでも挿入します。
Comment Toggle (⌘/) — 現在の行や選択範囲の周りにコメント文字をつけたり、はずしたりします。
また使い方やカスタマイズの仕方についての詳細のためのHelpコマンドをもつバンドルもたくさんあります。
バンドルアクションははステータスバーのギアポップアップをからアクセスすることができます。このメニューは⌃⎋を押すことによっても使うことができます。
![]()
以下はその他のバンドルのハイライトです。
Diff バンドルは、diffシェルコマンドからのアウトプットのための言語文法です。
ターミナルで以下のコマンドを実行してTextMateで二つのファイルの違いを表示させることができます:
diff -u old_file new_file|mate
またこのバンドルでは現在のドキュメントと保存されたコピーとの違い、プロジェクトドロワで選択されたファイル同士の違い(HTMLアウトプットでの表示オプション付き)を表示させることもできます。さらにAppleのopendiffを使うFileMergeで選択されたファイルを開くコマンドもあります。(デベロッパツールがインストールされている必要があります。)
HTMLバンドルはHTMLを扱うのに役にたつものを含みます。特に役に立つものは以下の通りです:
Insert Open/Close Tag (⌃<) — このコマンドはタイプしたばかりの単語を使って、<word></word>に変換し、キャレットは真ん中におきます。hrのような、終了タグが許されない場合のタグもちゃんと認識され、代わりに<word>を挿入し、そのタグの後にキャレットを置きます。
Wrap Selection in Open/Close Tag (⌃⇧W) — これは選択範囲を<p>…</p>で囲います。しかし、p(とアーギュメント)を上書きすることができます。終わったら、タブを押せば</p>の後ろにキャレットがきます。
Wrap Selection as Link (⌃⇧L) — これは、選択範囲をURLを入力できるアンカーのリンクテキストに変えます。
またHTMLバンドルは、正しい面積(幅/高さ)とファイル名に由来するaltテキストをもった画像を挿入するためのドラッグコマンドがあります。
HTMLバンドルにあるたくさんのアクションはタグを挿入するものです。例えば⌃↩は<br>を挿入し、HTMLドキュメントに画像をドロップすると、<img …>が挿入されたりします。
最小化された(XHTML)の形(つまり<br>の代わりに、<br />)を使うためにEMPTY content modelでタグを使いたい場合は、Preferences → Advancedで、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をみてください。
LaTeXバンドルにはとても役に立つ3つのコマンドがあります:
Typeset & View (PDF) (⌘B) — これは現在のファイルに対してpdflatex、もしくは(もし変数がセットされている場合)TM_LATEX_MASTERを実行します。もしエラーがあれば、クリックできるリンクが表示されます。そうでなければHTMLアウトプットの中で最終的なPDFが表示されます。(TigerもしくはSchubert’s PDF Browser PlugInが必要。)
Insert Environment Based on Current Word (⌘{) — これは、現在の単語を\begin{word} … \end{word}に変えて、その間にキャレットをおくという点でHTMLバンドルの⌃<に似たものです。このコマンドにはさまざまな設定オプションがあります。詳細はLaTexバンドルのHelpコマンド、もしくは(バンドルエディタから)コマンド自体のソースを見てください。
Insert Command Based on Current Word (⌘}) — 前のコマンドに似ていますが、単語を\word{}に変えて括弧の中にキャレットを動かします。
もしLaTexをインストールしていなければ、i-installer (binaries)を使うことができます。
あるいは、もしMacPortsを使っているなら、ターミナルを開いて以下のコマンドを実行しください:
sudo port install teTeX
Sourceバンドルはソースコードのためのデフォルトのアクションや設定を含みます。興味深いのは、現在の行や選択範囲をコメント文字でトグルするComment Line / Selection (⌘/)です。このコマンドは3つのコンテクスト依存の変数(context dependent variables)を通して、様々な言語で設定されています。
行末に移動して行末のターミネータ文字(デフォルトでは;)を挿入して、新しい行を挿入したりする、いろいろなマクロはとても実用的です。
SQLバンドルには現在の行もしくは選択範囲をMySQLかPostgresのクエリを送り(⌃⇧Q)、結果をHTMLアウトプットで表示するコマンドがあります。
いくつかの接続の詳細を保持するために環境変数を使います。バンドルのHelpファイルに説明されています。
Subverionsのアイテムはすべて、⌃⇧Aを通じてアクセスできます。このアクションは日常的なワークフローで使われるコマンドを提供します。
どのコマンドもパスワードを求めることはありません。WebDav (つまり http や https)を通じて提供されるレポジトリには、svnはあなたの認証をキャッシュしなくてはいけません。Secure-shell tunneling (ssh)に関して、sshキーペアの作り方をこのポストで説明しています。

コミットのアクションはプロジェクトドロワの選択されたファイルか、もし何も選択されてない場合は現在のファイルがコミットされます。コミットウインドウでは実際のコミットをする前にファイルを除外することもできます。
コミットウインドウでは, 右下の"Commit"ボタンの代わりにエンターキー(⌅)を使うことができます。
Textバンドルは基本的なテキスト編集に関するアクションや設定に関連したものです。ユーザーの視点からすると、いくつかの機能はひとつのバンドルであるよりもよりネイティブな位置にあるべきだろうと思うかもしれません。
最も実用的な4つのアクションは以下のものです:
Delete Line (⌃⇧K) — 現在の行を削除する
Document Statistics (⌃⇧N) — これは、現在のドキュメントの行数、単語数、文字数をツールチップで表示します。
Duplicate Line / Selection (⌃⇧D) — これは現在の行を複製します。キャレットは同じカラムの新しい行にきます。もし選択範囲がある場合は、それを複製します。
Sort Lines in Document / Selection (F5) — これは行や選択範囲をアルファベット順に並び替えます。
TextMateバンドルはメタバンドルの一種です。つまりテキストエディティングのためのアクションではなく、新しいバンドルアイテムを作ったり、メーリングリストのアーカイブを検索したり、現在の選択範囲をIRCチャンネルなどにペーストします。

テーマや言語文法(ランゲージグラマー)を扱う際に役に立つコマンドが、現在のキャレットのスコープを表示するShow Scope (⌃⇧P)です。(スコープに関しては後で詳しく)。
Xcodeバンドルには現在のドキュメントやプロジェクトを含むフォルダのXcodeプルジェクトをビルドしたり結果として生じたターゲットを実行するアクションがあります。

Xcodeプロジェクトをインポートするコマンドもありますが、たいていはXcodeプロジェクトと一緒にフォルダをTextMateのアプリケーションアイコンにドラッグしたほうがよいです。なぜなら現在はTM_PROJECT_DIRECTORYという変数がインポートされたプロジェクトでは正しくセットアップされません。多くのバンドルアクションはこれに依存します。(例えばSubversion関連)
人気のあるバンドルのみTextMateに含まれます。さまざまな言語のサポートを主とした、多数のほかのバンドルのためのSubversionレポジトリがあります。こちらでバンドルのリストをみることができます。
Leopardを使っていない方でバンドルをインストールしたい方は、subversionクライアントがインストールされていることが必要です。
もしMacPorts を使っているなら、ターミナルを開いて、以下を実行してください:
sudo port install subversion
もしFinkを使っているなら、 svn-clientパッケージをインストールしてください。
もしFinkもMacPortsも使っていないなら、Martin Ott's homepageのsubversionやここにあるプリビルドバイナリーのどれかを手に入れることができます。
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を使うように変更しなければいけません。
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を選択するのと同じことです。
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をアップデートすると、(古い可能性がある)コピーはデフォルトのコピーを上回ることはありません。
バンドルに対しての変更は普通のリリースノートに含まれません。代わりにRSSフィードで手に入れることができます。
TextMateは記録可能なマクロをサポートします。マクロはBundlesメニューからMacros → Start Recordingを選択することによって記録されます。
記録をしている間、赤い点がステータスバーの右側で点滅し、すべてのテキストを編集するアクションが、検索、コマンド実行、スニペット挿入などといっしょに記録されます。終わったら、Stop Recordingを選択します。そうすると記録されたマクロを再生または後で使うために保存できます。
マクロを保存する際に、バンドルエディタに、他のバンドルエディタと同様に、activation sequenceとスコープセレクタを決めることができる、(今のところは)リードオンリーのマクロとして現れます。
実行中にマクロがローカルのクリップボードを使うかどうかを決めることも可能です。ローカルのクリップボードあ一般的に都合がいいので、(なのでデフォルトでそうなっているのですが、)しかし、あなたはマクロが「本当の」クリップボードに効果を与えるようにしたいと思うこともあるかもしれないので、このオプションを無効にすることもできます。
スニペットとははドキュメントに挿入するテキストです。スニペットには、時間、(選択されたテキストのような)変数、タブストップやあなたが挿入後タブを使う欠けている情報のためのプレースホルダを挿入したり、プレースホルダに入力したデータの変更を実行するコードを含むことができます。

もっとも単純な場合は、あなたが何度も何度も入力したくないテキストを挿入するスニペットを使う事が来ます。あなたが、何度も入力したり、実際に入力するテキストを覚えているのが大変だからといった理由でです。例えばあなたの銀行口座の詳細やAppleの修飾キーのHTMLの実体参照などがあります。
もしあなたがプレーンテキストを挿入するスニペットを使う際に知っていなければいけないことは、$と`は予約語であるということです。もしあなたがそれらを入力したい場合は、( \$のように)その語の前に置いてエスケープしてください。この二文字が後ろにないエスケープ(つまり他のエスケープにが後ろにくる)エスケープはリテラル文字として挿入されます。
あなたは、$と一緒に変数名をつけることによって変数の値を入力することもできます。全ての普通の動的な変数はサポートされています。おそらく一番役に立つは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}
スニペットが挿入されたときにシェルコードを実行させるために、あなたはバックティックを用いることができます。そのコードを実行することによって得られた結果がスニペットに挿入されます。(もしあれば)最後の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.
シェルコードの中で、唯一エスケープが必要になるのはバックティックです。
挿入後キャレットはスニペットの最後の文字のうしろにきます。これはいつも理想的とは限りません。なので、私たちはキャレットが来てほしい場所に印をつけるために$0を使って変更することができます。例えば、HTMLのdivのスニペットを作ってキャレットが開始タグと終了タグの間にようにできます。それは以下のようになります。
<div>
$0
</div>
しかし、私たちはスニペットの中のいくつかの場所を埋める必要がよくあります。$1-$nを挿入することによって複数のタブストップを与えられます。タブストップがなくなるまで、キャレットは$1で始まり、次にタブを押すと$2へ、次のタブで$3へと動きます。もしあなたが明示的に$0をセットしなければキャレットはスニペットの最後にきます。
例えば、上のコードを次のように変更できます。
<div$1>
$0
</div>
これで引数を埋めた後、$0の位置へタブで移動できます。
また、変数のように、タブストップはデフォルト値をもつことができ、(そして、それは一般的にプレースホルダと言われます。)シンタックスは同じです:${«tab stop»:«default value»}。そしてデフォルト値はテキストとシェルコードと他のプレースホルダを含むことができます。なので私たちは前回の例をさらに洗練させることができます。
<div${1: id="${2:some_id}"}>
$0
</div>
このスニペットは選択された状態のid引数とdivタグを挿入します。そしてそれから私たちはその引数を上書き(つまり削除)して、タブを押し$0の場所へ行く、もしくは、すぐにタブで二つ目のタブストップ(引数の値)へ行き、それを編集するかを決める事ができます。
プレースホルダのテキストを編集すると、あらゆる埋め込まれたタブは削除されます。
挿入されたテキストのいくつかの場所へ同じ値を入れる必要がある場合、そんなときは、その場所にミラーされたものが必要ということを示すためにタブストップを再利用できます。だから、例えば、スニペットを使ってLaTex環境を作るためには、私たちは以下のようにできます。
\begin{${1:enumerate}}
$0
\end{$1}
このスニペットを挿入したあと、enumerateが挿入され、編集されれば、その変化はendにも反映されます。
プレースホルダのテキストがミラーされてほしいが、少しだけ変化が必要な場合やプレースホルダの値/存在によってテキストを表示させたい場合があります。
(ミラーをするときに)プレースホルダのテキストに対して正規表現の置換をすることによってこれを達成できます。シンタックスは以下のようになります:${«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: というテキストを挿入します。
シェルはいろいろなプログラム(シェルコマンド)を統合するためのスクリプト言語で、例えば、ターミナルを起動して実行するコマンドを入力したときのようにインタラクティブに使われることも多いです。
シェルスクリプト言語の紹介については、このAppleによるシェルのチュートリアルを見てください。
TextMateではさまざまなコンテクストでシェルコマンドを実行できます。実用的な方法には次のようなものがあります:
現在のドキュメントで、現在の行をシェルコマンドとして実行するためには、何も選択せずに、⌃Rを押してください、もしくは、 s選択範囲をシェルスクリプトとして実行するためには、1行以上を選択して⌃Rを押してください。(shebangもサポートされています。)

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

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

ターミナルでコマンドを実行すると、(絶対パスなしで設定されている)シェルは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シェルを使わないなら、(tcshやzshのようなものでは)いつも使うパスを設定しなければいけないでしょう。例えば、~/.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.plistでPATHを設定することによって引数をとることができます。
よって、もし/opt/local/binをパスに追加したいなら、~/.MacOSX/environment.plistというファイルを作って、次のものを追加してください:
{ PATH = "/opt/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"; }
このファイルを作成(または編集)した後には、その効果を得るためにあなたのアカウントにログインし直す必要があります。
なお、このファイルには$HOMEを使うことはできません。なので代わりに$HOME/binには/Users/allan/binのように書いてください。(allanをあなたのユーザ名に変えてください。)
環境変数は情報とともにスクリプトやコマンドを提供するためにTextMateでは広範囲に使われています。
さまざまなスクリプト言語で(VARという名前の)変数の値を読み込むにはこのようにします。
"$VAR"$ENV{'VAR'}$_ENV['VAR']os.environ['VAR'] (初めにimport osを実行するのを忘れないでください。)ENV['VAR']シェルスクリプトで使われる変数は必ず二重引用符を使ってください。そうでないと、bashは初めに変数を値に展開してinput-field-separator characters(read as the IFS 変数, defaults to スペース, タブ and 改行)に従って分割されます。つまり、もしTM_FILENAMEがMy Document.txtであり、rm $TM_FILENAMEを実行すると、rmは実際には二つの引数を持ちます。一つ目はMyで二つ目は Document.txtです。
bashでの環境変数でできることについての情報について、問題点はこのブログポストを見てください。また、bashのmanファイルを確認してください。
次の変数はユーザーの現在の設定を反映します。その設定とは、どのファイルが開かれていて、そのファイルのどこにキャレットがあり、プロジェクトドロワのの選択しているところはどこかなどです。
スクリプトはこの変数を読み込んで、それに従って決定をします。
変数の中には、いつも現れていないものもあります。例えばもし現在のファイルに名前がついていない(untitled)場合や選択範囲がない場合は、それに対応する変数はセットされません。これは例えば、あるコマンドを選択範囲に対して実行して、もし選択範囲がない場合は現在の行や単語に対して実行させるときなど便利です。
Bashには変数がセットされていないときにでデフォルトの値を提供する簡易な記述法があります。例えば選択範囲がない場合に現在の単語を代替としてつかうには、"${TM_SELECTED_TEXT:-$TM_CURRENT_WORD}"を使うことができます。
TM_BUNDLE_SUPPORT — バンドルアイテム(コマンド, ドラッグコマンド, マクロ, もしくは スニペット)から(間接的に)使われるシェルコマンドは、(もしあれば)そのアイテムを実行するバンドルのサポートフォルダを指す、この変数を持ちます。さらに、$TM_BUNDLE_SUPPORT/binがパスに追加されます。
TM_CURRENT_LINE — 現在の行のテキストの内容
TM_CURRENT_WORD — キャレットがある場所の単語
TM_DIRECTORY — 現在のドキュメントのあるフォルダ(セットされていないかもしれません。)
TM_FILEPATH — 現在のドキュメントのパス(ファイル名を含む)(セットされていないかもしれません。)
TM_LINE_INDEX — キャレットの位置を示す現在の行のインデックス。このインデックスはゼロを起点にして(例えばTM_CURRENT_LINEで読み込まれる)その行のutf-8エンコーディングを考慮します。なので、その行をキャレットの左と右に分けるためには、以下のようにできます:
echo "Left: »${TM_CURRENT_LINE:0:TM_LINE_INDEX}«"
echo "Right: »${TM_CURRENT_LINE:TM_LINE_INDEX}«"
TM_LINE_NUMBER — (1から数えられた)キャレットの行の場所。例えば、もしキャレットのある場所より前の部分を使う必要がある場合は、コマンドインプットを“Entire Document”(ドキュメント全体)とし現在の行とその下全てを削除するために次のコマンドを使うことができます:
head -n$((TM_LINE_NUMBER-1))
TM_PROJECT_DIRECTORY — プロジェクトドロワの最上位のフォルダ(セットされていないかもしれません。)
TM_SCOPE — キャレットがある場所のスコープ。スコープについてはスコープセレクタを見てください。
TM_SELECTED_FILES — パスはシェルでエスケープされます。よって使うときは(変数が展開された後、シェルがその行を評価するように)evalをその行の始めに加えてください。例えば、プロジェクトドロワで、選択された全てのファイルにfileコマンドを実行するためには、次のようなコマンドが使えます。
eval file "$TM_SELECTED_FILES"
また、(bashの)配列に変換して、それに対してiterateすることもできます。以下は例:
eval arr=("$TM_SELECTED_FILES")
for (( i = 0; i < ${#arr[@]}; i++ )); do
file "${arr[$i]}"
done
TM_SELECTED_FILE — プロジェクトドロワで最初に選択されているファイルもしくはフォルダの完全なパス(セットされていないかもしれません。)
TM_SELECTED_TEXT — 選択範囲の全ての内容(セットされていないかもしれません。)。環境変数には代替64 KBというサイズ制限があります。なので、もしそれ以上を選択すると、この変数は実際の選択内容を反映しません。(一般的に、そのような選択範囲を使う必要があるコマンドは、標準インプット(standard input)を使うべきでしょう。)
TM_SOFT_TABS — YESが値に入ります。そうでなければ、NOが入っています。これは、シェルコマンドがインデントされた結果を表示し、そのインデントがタブかスペースを、ユーザーの設定によってマッチさせたい時に便利です。
TM_SUPPORT_PATH — TextMateアプリケーションバンドルは、(CocoaDialog, Markdown, the SCM commit window, Textile, tidyなどの)デフォルトコマンドで使われるアイテムを含むサポートフォルダを含みます。$TM_SUPPORT_PATH/binがパスに追加されるので、一般的にこの変数を直接使う必要はありません。よって、バンドルコマンドにはその完全なパスを指定しなくても使えるものがあります。
TM_TAB_SIZE — ステータスバーで表示されるタブサイズ。現在のドキュメントを(Tidy, convert to HTMLなどの)別の形で表示する必要があり、その結果を表示する際にドキュメントのタブサイズをマッチされた結果を作り出すためのコマンドを作る時に便利です。TM_SOFT_TABSも参照にしてください。
TextMateが自動的に提供する動的変数だけでなく、静的な変数のリストがあれば便利な時もあります。
例えば、会社名を挿入するテンプレートやスニペットがありその値を直接書き込みたくないときや、ローカライズされた設定が必要な共有コマンドがあるかもしれません。例えばSQLバンドルにはユーザ名、パスワード、データベースに変数を使うクエリコマンドがあります。
このため、Preferences → Advanced → Shell Variablesにて環境変数のデフォルトのリストをセットすることができます。

この変数は、TextMateから実行される全てのシェルコマンドに与えられます。また、(動的変数と同じように)スニペットで使うこともできます。
変数には動的にも静的にもなるものもあります。例えば、Sourceバンドルは現在の行か選択範囲をコメントにしたり、コメントアウトするToggle Commentコマンドがあります。このコマンドはユーザのが必要としているコメントのスタイルを決めるために3つの変数を使用します。
しかしながら複数の言語を使うユーザは言語毎にこれを指定しなければいけません。バンドルの設定のshellVariablesをセットし、この変数を制限するために、適切なスコープセレクタを与える必要があります。

これは、キャレットの位置に基づいて行われることに利点があります。というのは、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';
},
);
プロジェクトによって、別にカスタマイズされたコマンドがあると便利な時もあります。そういう理由で、個別のプロジェクト毎に変数を設定することが可能です。
この方法は現在では、少し隠されていいます。プロジェクトドロワの全てから選択をはずし、(Iに丸がついている)インフォボタンをクリックすると、変数を設定するパネルが現れます。
この変数はプロジェクトファイル(*.tmproj)に保存され、そのプロジェクトの中で実行されるスニペットと(シェル)コマンドのみ保持します。
コマンドはbashや#!/usr/bin/rubyのように最初の行にあるshebang記法で定められたインタープリターで実行されるスクリプトです。
Bundles → Bundle Editor → Edit Commands…を洗濯してバンドルエディタを開きコマンドを編集することができます。

コマンドが実行される前に、現在のドキュメントかプロジェクトの中にある編集された全てのドキュメントが保存されます。これは、一番上のポップアップで設定できます。ドキュメントは変更された場合のみ保存されます。
コマンドを実行するときには、いろいろな環境変数を使用することができます。また、コマンドでは、インプット(標準入力)として、ドキュメント全体を読みこむこともできるほか、選択されたテキストを読みこむことができます。
もしインプットが“Selected Text”に設定されているにもかかわらず、何も選択されていない場合は、他のインプットポップアップで設定されているユニットにフォールバックします。フォールバックが使用され、もしアウトプットが“Replace Selection”に設定されていれば、インプットは置換されます。もしtr '[a-z]' '[A-Z]'(小文字を大文字に)というコマンドを実行して、インプットがSelected Textに設定されていて、一語にフォールバックする場合し、アウトプットがReplace Selected Textに設定されている場合、選択範囲なしでコマンドを実行すると、現在の単語を大文字に変換します。

フォールバックユニットについてですが、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.”として実行されます。
アウトプット(標準出力)ではさまざまなことができます。以下ではさまざまなオプションを説明します。
Replace Selected Text / Document — これは主に選択範囲やドキュメントを変形するコマンドで使われます。例えば、ドキュメント全体にtidyを実行したり、標準入力から読み込まれた行をソートしたりするときに使われます。
Insert as Text / Snippet — 生成されたアウトプットがドキュメントに挿入されるコマンド、例えば、(標準入力からキャレットの位置までのドキュメントを解析して)足りない閉じるタグを挿入したりするときに使うことができます。
Show as Tool Tip — これは、主に選択範囲をペースティング・サービスに送信したりしたあとに、そのアクションのステータスをツールチップを使ってリポートするといったようなことに使われます。

Show as HTML — アプトプットをただ単にHTMLとして表示します。これについての利点は次のセクションで説明します。 Xcode Buildのように、インクリメンタルに進捗をリポートする必要があるコマンドではとても有用です。

Create New Document — MarkdownをHTMLに変換するというような変換が必要な場合は、今使っているドキュメントを上書きするよりも、結果を新しいドキュメントで表示させるほうがよいかもしれません。そのような場合には、このオプションが最適です。また、結果をドキュメントして表示するのがふさわしいコマンドもあります。例えば、diffの結果は新しいドキュメントでシンタックス・カラーリングがある状態で見た方がよいでしょう。

HTMLアウトプットには、WebKitのHTML/CSSエンジンの機能に加えていくつかの機能があります。
HTMLアウトプットを使ったコマンドが実行中でも、TextMateがストール(停止)してしまうことはありません。進捗インディケータがコマンドが実行されている間に右上の角に表示されます。もし終了(abort)したい場合は、アウトプットのウインドウを閉じるだけです。(閉じようとすると確認のダイアログが表示されます。)
![]()
アウトプットの一部で実行されている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を参照してください。
HTMLアプトプットでは、元のドキュメントに戻るために、TextMate URL スキームを使用できます。例えば、(ビルドコマンドやバリデータのように)コマンドが現在のドキュメントのエラー(や警告)をレポートしたりするときに便利です。また、svn statusのようにコマンドがプロジェクト内の他のファイルを参照する際にも便利です。
4. TigerかSchuberts PDF Browser Plug-inを使えば、HTMLアウトプットにPDFファイルを表示させることもできます。これは主にLaTeXのような活字を組むプログラムには便利でしょう。これによって、TextMateから離れることなく活字をセットして結果を確認することができます。
他のページにリダイレクトして、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を参照してください。.
コマンド内でコマンドのアウトプットオプションを変更したいときもあるかもしれません。例えば、現在の単語のドキュメンテーションを調べるコマンドは、もしドキュメンテーションが見つからなければ、"no documentation found"というツールチップを見せたいですし、そうでない場合は、結果をHTMLアウトプットで表示したいでしょう。

TextMateには、この目的で使うために定期済みのbash関数があいます。これはの関数は任意に最初に標準出力へechoされた引数を文字列としてとります。
この関数は初期のアウトプットオプションが"Show as HTML"ではないときに使用できます。以下が関数のリストです。
exit_discardexit_replace_textexit_replace_documentexit_insert_textexit_insert_snippetexit_show_htmlexit_show_tool_tipexit_create_new_document例えば、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
コマンドを実行するときには、以下に挙げる定期済みのbash関数を使うと便利です。
require_cmd — これは、与えられた最初の引数がパスに存在することを確認します。存在しない場合は、ユーザーにエラーをレポートし、コマンドを中断します。もし、OS Xに付属しないコマンドを使わなければいけないときで、あなたが作ったものを配布したいときに便利です。例えば、Subversionコマンドは以下のように始まります。
require_cmd svn
rescan_project — 現在のところプロジェクトドロワーはフォーカスがあたったときだけアップデートされ、外部から変更された場合は現在のファイルをリロードします。もしあなたのコマンドが(ディスク上の)現在のドキュメントが修正したり、もしくは、現在のドキュメントのあるフォルダのファイルを変更するときに便利です。
pre — このコマンドは標準入力からテキストを読み込みHTMLのエスケープをされたものを標準出力へ出力します。その際にテキストをワードラップが使用可能になっていますが<pre>…</pre>の中に入れます。そして、<と>と&をHTMLエンティティに変換します。これは、生のアウトプットをHTMLアウトプットオプションを使って表示したいときに便利です。もっともシンプルな例では、コマンドとしてpreを指定して、インプットに"Entire Document"、そして、アウトプットに"Show as HTML"を設定すればよいだけです。しかしたいていは、preにパイプでなんらかのコマンドを結果として表示したいでしょう。例えば、次のように。
make clean|pre
この関数はすべて$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/"
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.

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"

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 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.

ドラッグコマンドは普通のコマンドに似ています。しかし、このコマンドは特定の(ファイルタイプ拡張子のリストによって特定された)ファイルタイプを編集中のウインドウにドロップすることによって有効になります。
![]()
ドラッグコマンドを実行して得られるアウトプットは常にスニペットとして挿入され、ドラッグコマンドは3つの(追加の)環境変数が用意されています。:
TM_DROPPED_FILE — (現在のディレクトリとして設定されたドキュメントのディレクトリに相対した)ドロップされたファイルの相対パス。
TM_DROPPED_FILEPATH — ドロップされたファイルの絶対パス。
TM_MODIFIER_FLAGS — ファイルがドロップされたときに押し続けられた修飾キー。これはbitwiseもしくは以下の形です: SHIFT|CONTROL|OPTION|COMMAND (もし全ての修飾キーが押さえられた状態であれば。)
こちらが少し複雑なドラッグコマンドです:
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="…"引数として、(全てはスニペットとして挿入されるので)このテキストをプレイスホルダにした場所アウトプットします。
![]()
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.
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:
scopeName (line 1) — this should be a unique name for the grammar, following the convention of being a dot-separated name where each new (left-most) part specializes the name. Normally it would be a two-part name where the first is either text or source and the second is the name of the language or document type. But if you are specializing an existing type, you probably want to derive the name from the type you are specializing. For example Markdown is text.html.markdown and Ruby on Rails (rhtml files) is text.html.rails. The advantage of deriving it from (in this case) text.html is that everything which works in the text.html scope will also work in the text.html.«something» scope (but with a lower precedence than something specifically targeting text.html.«something»).
fileTypes (line 2) — this is an array of file type extensions that the grammar should (by default) be used with. This is referenced when TextMate does not know what grammar to use for a file the user opens. If however the user selects a grammar from the language pop-up in the status bar, TextMate will remember that choice.
foldingStartMarker / foldingStopMarker (line 3-4) — these are regular expressions that lines (in the document) are matched against. If a line matches one of the patterns (but not both), it becomes a folding marker (see the foldings section for more info).
patterns (line 5-18) — this is an array with the actual rules used to parse the document. In this example there are two rules (line 6-8 and 9-17). Rules will be explained in the next section.
There are two additional (root level) keys which are not used in the example:
firstLineMatch — a regular expression which is matched against the first line of the document (when it is first loaded). If it matches, the grammar is used for the document (unless there is a user override). Example: ^#!/.*\bruby\b.
repository — a dictionary (i.e. key/value pairs) of rules which can be included from other places in the grammar. The key is the name of the rule and the value is the actual rule. Further explanation (and example) follow with the description of the include rule key.
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.
What follows is a list of all keys which can be used in a rule.
name — the name which gets assigned to the portion matched. This is used for styling and scope-specific settings and actions, which means it should generally be derived from one of the standard names (see naming conventions later).
match — a regular expression which is used to identify the portion of text to which the name should be assigned. Example: '\b(true|false)\b'.
begin, end — these keys allow matches which span several lines and must both be mutually exclusive with the match key. Each is a regular expression pattern. begin is the pattern that starts the block and end is the pattern which ends the block. Captures from the begin pattern can be referenced in the end pattern by using normal regular expression back-references. This is often used with here-docs, for example:
{ name = 'string.unquoted.here-doc';
begin = '<<(\w+)'; // match here-doc token
end = '^\1$'; // match end of here-doc
}
A begin/end rule can have nested patterns using the patterns key. For example we can do:
{ begin = '<%'; end = '%>'; patterns = (
{ match = '\b(def|end)\b'; … },
…
);
};
The above will match def and end keywords inside a <% … %> block (though for embedded languages see info about the include key later).
contentName — this key is similar to the name key but only assigns the name to the text between what is matched by the begin/end patterns. For example to get the text between #if 0 and #endif marked up as a comment, we would do:
{ begin = '#if 0(\s.*)?$'; end = '#endif';
contentName = 'comment.block.preprocessor';
};
captures, beginCaptures, endCaptures — these keys allow you to assign attributes to the captures of the match, begin, or end patterns. Using the captures key for a begin/end rule is short-hand for giving both beginCaptures and endCaptures with same values.
The value of these keys is a dictionary with the key being the capture number and the value being a dictionary of attributes to assign to the captured text. Currently name is the only attribute supported. Here is an example:
{ match = '(@selector\()(.*?)(\))';
captures = {
1 = { name = 'storage.type.objc'; };
3 = { name = 'storage.type.objc'; };
};
};
In that example we match text like @selector(windowWillClose:) but the storage.type.objc name will only be assigned to @selector( and ).
include — this allows you to reference a different language, recursively reference the grammar itself or a rule declared in this files repository.
To reference another language, use the scope name of that language:
{ begin = '<\?(php|=)?'; end = '\?>'; patterns = (
{ include = "source.php"; }
);
}
To reference the grammar itself, use $self:
{ begin = '\('; end = '\)'; patterns = (
{ include = "$self"; }
);
}
To reference a rule from the current grammars repository, prefix the name with a pound sign (#):
patterns = (
{ begin = '"'; end = '"'; patterns = (
{ include = "#escaped-char"; },
{ include = "#variable"; }
);
},
…
); // end of patterns
repository = {
escaped-char = { match = '\\.'; };
variable = { match = '\$[a-zA-Z0-9_]+'; };
};
This can also be used to match recursive constructs like balanced characters:
patterns = (
{ name = 'string.unquoted.qq.perl';
begin = 'qq\('; end = '\)'; patterns = (
{ include = '#qq_string_content'; },
);
},
…
); // end of patterns
repository = {
qq_string_content = {
begin = '\('; end = '\)'; patterns = (
{ include = '#qq_string_content'; },
);
};
};
This will correctly match a string like: qq( this (is (the) entire) string).
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:
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.
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.
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.
comment — for comments.
line — line comments, we specialize further so that the type of comment start character(s) can be extracted from the scope.
double-slash — // commentdouble-dash — -- commentnumber-sign — # commentpercentage — % commentblock — multi-line comments like /* … */ and <!-- … -->.
documentation — embedded documentation.constant — various forms of constants.
numeric — those which represent numbers, e.g. 42, 1.3f, 0x4AB1U.character — those which represent characters, e.g. <, \e, \031.
escape — escape sequences like \e would be constant.character.escape.language — constants (generally) provided by the language which are “special” like true, false, nil, YES, NO, etc.other — other constants, e.g. colors in CSS.entity — an entity refers to a larger part of the document, for example a chapter, class, function, or tag. We do not scope the entire entity as entity.* (we use meta.* for that). But we do use entity.* for the “placeholders” in the larger entity, e.g. if the entity is a chapter, we would use entity.name.section for the chapter title.
name — we are naming the larger entity.
function — the name of a function.type — the name of a type declaration or class.tag — a tag name.section — the name is the name of a section/heading.other — other entities.
inherited-class — the superclass/baseclass name.attribute-name — the name of an attribute (mainly in tags).invalid — stuff which is “invalid”.
illegal — illegal, e.g. an ampersand or lower-than character in HTML (which is not part of an entity/tag).deprecated — for deprecated stuff e.g. using an API function which is deprecated or using styling with strict HTML.keyword — keywords (when these do not fall into the other groups).
control — mainly related to flow control like continue, while, return, etc.operator — operators can either be textual (e.g. or) or be characters.other — other keywords.markup — this is for markup languages and generally applies to larger subsets of the text.
underline — underlined text.
link — this is for links, as a convenience this is derived from markup.underline so that if there is no theme rule which specifically targets markup.underline.link then it will inherit the underline style.bold — bold text (text which is strong and similar should preferably be derived from this name).heading — a section header. Optionally provide the heading level as the next element, for example markup.heading.2.html for <h2>…</h2> in HTML.italic — italic text (text which is emphasized and similar should preferably be derived from this name).list — list items.
numbered — numbered list items.unnumbered — unnumbered list items.quote — quoted (sometimes block quoted) text.raw — text which is verbatim, e.g. code listings. Normally spell checking is disabled for markup.raw.other — other markup constructs.meta — the meta scope is generally used to markup larger parts of the document. For example the entire line which declares a function would be meta.function and the subsets would be storage.type, entity.name.function, variable.parameter etc. and only the latter would be styled. Sometimes the meta part of the scope will be used only to limit the more general element that is styled, most of the time meta scopes are however used in scope selectors for activation of bundle items. For example in Objective-C there is a meta scope for the interface declaration of a class and the implementation, allowing the same tab-triggers to expand differently, depending on context.
storage — things relating to “storage”.
type — the type of something, class, function, int, var, etc.modifier — a storage modifier like static, final, abstract, etc.string — strings.
quoted — quoted strings.
single — single quoted strings: 'foo'.double — double quoted strings: "foo".triple — triple quoted strings: """Python""".other — other types of quoting: $'shell', %s{...}.unquoted — for things like here-docs and here-strings.interpolated — strings which are “evaluated”: `date`, $(pwd).regexp — regular expressions: /(\w+)/.other — other types of strings (should rarely be used).support — things provided by a framework or library should be below support.
function — functions provided by the framework/library. For example NSLog in Objective-C is support.function.class — when the framework/library provides classes.type — types provided by the framework/library, this is probably only used for languages derived from C, which has typedef (and struct). Most other languages would introduce new types as classes.constant — constants (magic values) provided by the framework/library.variable — variables provided by the framework/library. For example NSApp in AppKit.other — the above should be exhaustive, but for everything else use support.other.variable — variables. Not all languages allow easy identification (and thus markup) of these.
parameter — when the variable is declared as the parameter.language — reserved language variables like this, super, self, etc.other — other variables, like $some_variables.スコープセレクタはキャレット(つまり現在のコンテクスト)のスコープに対してマッチして、マッチするかしないかを結果として持つ、CSSセレクタにとても似ています。(この最下にあるマッチのランク付けというところも見てください。)

バンドルアイテムのアクティベーションの方法が"コメントの中"とか"HTML文書の中"といったようなコンテクストに限られることを可能にします。この利点は、forのようなタブトリガーがいろいろな言語で利用可能になり、HTMLような、CSS, PHP, RubyやJavaScriptが混在したドキュメントでスムーズに動作します。
スコープセレクタは設定アイテムとテーマと一緒に使われます。テーマでは、ドキュメントの要素にスタイルを加えます。設定アイテムでは編集のなどさまざまな側面を粒子単位で調整できます。
一般的に、一つのドキュメントはたくさんの要素からなります。散文のドキュメントであれば、見出し、パラグラフ、箇条書きのリスト、強調テキストがあります。一方、ソースコードは文字列、コメント、キーワード、保存タイプなどがあります。
TexMateには、ランゲージグラマーがこの要素とマッチして、それぞれに名前を割り当てます。この名前はドットによって区別され、それぞれに追加されたものがマッチした要素の種類に特化します。例えば、Cの二重引用符文字列はstring.quoted.double.cがスコープ名として付与されます。(詳しくは命名規約を見てください。)
最もシンプルな形のスコープセレクタはマッチする要素名です。しかし、実際の要素名の接頭辞のみを指定する必要があるだけです。よって、スコープセレクタとして、stringと指定すると、すべての引用の文字列にマッチします。同じように、string.quotedと指定すると、一重引用符文字列にも二重引用符文字列にも三重引用符文字列にもマッチします。
空のスコープセレクタはすべてのスコープにマッチしますが、一番低いランクになります。(後述のマッチのランク付けを見てください。)
CSSのように、スコープセレクタで要素のコンテクストを使うことが可能です。下の画像は、(⌃⇧P経由で)ツールチップとして、文字列のスコープを示しています。文字列の直接の親はsource.php.embedded.htmlであり、text.html.basicは祖先になります。

スコープセレクタでは、スペースで区切られたリストで要素名を指定することで、スコープの中で(それと同じ順番で、)それぞれの要素が現れていなければいけないということを指示できます。PHPのすべての文字列をターゲットにしたいなら、source.php stringを使うことができます。あるいは、HTMLに埋め込まれたPHPをターゲットにするためには、text.html source.phpを使うことができます。
ドキュメントのサブセットにマッチさせたいが、そのセットの個別のサブセットを除外したいときもあります。
例えば、Rubyでは、#{…}を使って文字列の中にコードを埋め込むことができます。文字列の中で#が押されたときに挿入されるスニペットは役に立つでしょう。そのためのスコープセレクタはsource.ruby stringです。
しかし残念なことに、(文字列に埋め込まれた)コードの中でさえ#が押されると#{…}が挿入されてしまいます。これをさけるためには、マイナス演算子を使って(非対称の)違いを得るためにスコープセレクタを差し引く必要があります。なので、よりよいスコープセレクタはsource.ruby string - string sourceになります。
以下はそのスコープセレクタが何をターゲットにするかを説明しています。
puts "Today is #{Date.today}."
^^^^^^^^^^ ^^
それぞれ別のスコープをマッチングしたものが必要であれば、コンマ演算子を使って、スコープセレクタをグループ化できます。例えば、文字列とコメントの虜法にマッチさせるには、スコープセレクタはstring, commentになります。
もし一つ以上のスコープセレクタが現在のスコープにマッチすると、それぞれのマッチがどれだけ"よい"かに従ってランク付けされます。
勝者になるスコープセレクタは以下の順番で決まります(優先順位が高い順です。):
スコープの一番深い要素 例えば、スコープがsource.php string.quotedの時、stringはsource.phpに勝ちます。
一番深い要素のなるべく多くにマッチする 例えばstring.quotedはstringに勝ちます。
(引き分けのとき)一番深い要素を省いて、ルール1と2がサイドスコープセレクタに適用されてます 例えばtext source stringはsource stringに勝ちます。
タブトリガー、キーボードショートカットとドロップされたファイル(ドラッグコマンド)の場合、もしランク上で同一のものは、(それは、つまりスコープセレクタが全く同じ場合、)一番よいマッチのためにメニューが表示されます。
テーマと設定アイテムに関して、プロパティー毎が基準になりますが、もし複数のアイテムが同じスコープセレクタを使うと、勝者は決められません。例えば、あるテーマアイテムがstring.quotedの背景を青にセットして、他のテーマアイテムがstring.quotedの前面を白に設定すると、結果としては、前面は後者から選択されで、背景は前者から選択されます。
TextMateは文字列、コメント、キーワードなどのドキュメントの要素へ名前を割り当てるためにランゲージグラマーを使います。あなたがHTML要素を選択するためにCSSセレクタを使うのと同じようにスコープセレクタを使い、個々の要素を指定することによって可能になります。
TextMateでのドキュメントのスタイリングはHTMLドキュメントとためにスタイルシートを作るのに似ています。このプロセスは、(スタイルシートに似た)テーマを選択したり、あるテーマを編集したり、新しいテーマを作ることができるのは、Preferences → Fonts & Colorsにおいてです。

テーマの変更はグローバルに行われます。つまり、現在のところファイルやファイルタイプごとに個別のテーマを選択することはできません。
テーマは6つのスタンダードのプロパティがあります。こは、バックグラウンド、フォアグラウンド、キャレット、選択、不可視物、ラインの高さのカラーです。それに加えて、テーマは"テーマアイテム”のリストから構成されます。これらのアイテムはおのおの、どのエレメントがどのアイテムに適用されるかを選択するスコープセレクタ、そしてそれから任意にフォアグラウンドとバックグラウンドカラーと(太字、イタリック、下線)のフォントスタイルを持っています。
![]()
もし、テーマアイテムがフォアグラウンドカラーもバックグラウンドカラーも持っていない場合、FGもしくはBGのコラムをクリックして加えることができます。代わりにもし、削除したい場合、FGもしくはBGの色をマウスポインタが消えることを示すまでドラッグしてマウスを放せば色を削除できます。
スコープセレクタが複雑になりうることを忘れないでください。例えば、HTMLの中のRubyブロックに個別の色を設定するためにtext.html source.rubyのバックグラウンドに設定したり、埋め込みコードではない文字列の一部のみをスタイリングするためにstring - string sourceを使うこともできます。

TextMateのwikiにはユーザーが自分のテーマを共有することが促される カスタムテーマ のためのページがあります。
ファイルタイプやドキュメントの中のキャレットの位置などに基づいて、さまざまな値を保つことが有益な設定に関しては, バンドルエディタで、どのスコープが適用されるかを選ぶスコープセレクタを指定することができます。
現在設定は古いスタイルのプロパティーリストフォーマットで指定されています。

completions — 現在のドキュメントから補完の候補を順番に表示するときのための追加候補の配列completionCommand — (TM_CURRENT_WORD変数から得られる)現在の単語を補完するための候補のリストを返すシェルコマンド(文字列)disableDefaultCompletion — 補完候補が求められたとき、もし現在のドキュメントからマッチを除外したいなら、1をセットしてください。(あなたが自分の補完コマンドを使うときに役にたちます。)For more info see section on completions.
より詳しい情報は補完のセクションをみてください。
decreaseIndentPattern — 正規表現.increaseIndentPattern — 正規表現indentNextLinePattern — 正規表現unIndentedLinePattern — 正規表現より詳しい情報はインデントルールを見てください。
showInSymbolList — シンボルリストに含むためには1をセットしてください。symbolTransformation — 引き出された"symbol"に対して適用される 一つ以上のs/«regexp»/«format»/«options»;という変形からなる"プログラム"。詳しくはシンボルリストのカスタマイズを見てください。
highlightPairs — もし見つかれば、キャレットが二つ目を超えたとき、一つ目が短い間強調して表示される場合の、それぞれが文字のペアを持っている配列の配列。smartTypingPairs — 一つ目がタイプされたときに、二つ目が挿入される場合の、それぞれが文字のペアを持っている配列の配列。 例えば、以下のようなものがあります。自動でペアになる文字を見てください。
smartTypingPairs = (
( '"', '"' ),
( '(', ')' ),
( '{', '}' ),
( '[', ']' ),
( '“', '”' ),
( "'", "'" ),
( '`', '`' ),
);
shellVariables — キー/値のペアの配列 コンテクスト依存変数をみてください。spellChecking — スペルチェックを無効化/有効化するには、0/1をセットしてください。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).
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.
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.

Some caveats:
Only key bindings which include the command modifier (⌘) will work.
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).
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).
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.
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. |
| 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
|
| ⌥⌘ | 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. |
テンプレートはテンプレートの中身に基づいて新しいファイルを作成する(シェル)コマンドからできています。以下は、index.htmlファイルがXHTML 1.1テンプレートの一部になっているのを示しています。

テンプレートのシェルコマンドが実行されると、ファイルを(パスなしの)名前のみで参照できるように、作業をしているディレクトリはテンプレートファイルを含んでいるディレクトリに設定されます。よって、シェルコマンドは(通常の変数に加えて)以下の3つの環境変数にアクセスできます。
TM_NEW_FILE — パス全体、作られるファイルの名前を含む(つまり、ユーザがGUIで入力するもの)。
TM_NEW_FILE_BASENAME — 作られるファイルのベースの名前。もしTM_NEW_FILEが/tmp/foo.txtであれば、この変数はフォルダ名もファイル拡張子もないfooになります。
TM_NEW_FILE_DIRECTORY — 作られるファイルのフォルダ名。
新規テンプレートはメニュー (File → New From Template) を使って作成されるか、プロジェクトではプロジェクトドロワの New File ボタン(⇧⌘N)を使って、作成されます。

プリント機能を楽しみに思う人もいると思います。、フラストレーションを感じる方もいると思いますが、TextMateは現在のところ、限られたプリント能力しかありません。
つまり、あなたは構文のハイライティングなしでドキュメントフォントを使う事しかできないということです。そした、いかに示すようにヘッダーとフッターとスタンダードのプリントオプション以外にオプションはありません。

ヘッダとフッターのフィールドは普通の変数、バックティックを使った挿入されたコードをサポートします。さらに以下の二つの変数へアクセスできます。
TM_PAGE — プリントされる現在のページ(全てのページがプリントされるように、これが実際のページ番号です。なのでもしページ3のみをプリントする際、この変数は、1ではなく3になります。)
TM_PAGES — ドキュメントの総ページ数。
プリント機能を改良するプランはあります。しかし、そのときまで、Source バンドルに View Source as PDFというコマンドがあります。このコマンドは、現在のソースからenscriptを使って、PDFを作成します。そしてサポートされている言語に関しては、シンタックスのハイライティングができます。
TextMateにはファイルの保存の仕方に影響する上級の環境設定にいくつかのオプションがあります。

原子性での保存とは、ファイルを上書きするのではなく、TextMateが新しいファイルを保存し、それが成功したら古いファイルを上書きするということです。これは、もしファイル保存中にマシンがクラッシュした場合、あなたは古い(つまり、最後に保存された)ファイルと新しいファイルの両方を失うというリスクを冒さずにすむという点での長所があります。
欠点は新しいファイルが実際に(新しいinodeとともに)書かれるので、ファイルへのエイリアスを壊してしまうかもしれないということです。しかし、これはファイルを移動したり、移動する予定であるときにのみ置きます。というのは、パスはエイリアスを解決する際にinodeより優先されるからです。また、Finderは保存するたびにファイルのアイコンの位置を変えます。(これはもしそのファイルがあなたの目に見えるフォオル谷あるときだけ問題になります。)
クリエータコードはClassicのMacがファイルとアプリケーションを関連づける方法です。OS Xでは、関連付けは主にファイル拡張子を通じて行われます。もしある日与えられたファイルタイプを扱うもっとよいプログラム(!)が見つかった場合に、あなたは全てのファイルのクリエータコードを変えるのではなく、一カ所の関連付けをアップデートしさえすればよいので、拡張子には利点があります。このため、これをセットせず、ブランク(Blank)に設定しておくよう推奨します。
TextMateはかなりUTF-8に偏重しています。UTF-8はASCIIと互換性があるエンコーディングです。なので、これを、grepやdiff、ruby(インタープリタ),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
TigerからOS Xはsetxattrとその仲間をサポートします。
TextMateは拡張された属性をキャレットのポジション、ブックマーク、どのテキストが折り畳まれているかといった情報を保存するために利用し、将来的には更なる活用をするとのなるでしょう。
(ネットワークでマウントされたディスクなどの)拡張された属性ををネイティブでサポートしないファイルシステムのために、OS Xは代わりにその情報を«filename»がオリジナルのフォイル名である場合、._«filename»というファイルの中に保存します。
すべてのユーザが、TextMateが状態覚えておくために、この特別の(隠された)ファイルが役にたつとは思わないので、この拡張された属性を無効化することができます。TexMateを終了させて、シェルから次のコマンドを実行することで無効化できます。
defaults write com.macromates.textmate OakDocumentDisableFSMetaData 1
もしあなたが、Terminalやブラウザのようなアプリケーションに切り替えてテストするようなプロジェクトをしているなら、フォーカスをがなくなったときに、修正されたすべてのファイルを保存するようにTextMateを設定することができます。そうして、ほかのアプリケーションに切り替えたとき、TextMateは自動的にすべての変更をを保存します。
正規表現は、テキストのマッチのための領域固有言語です。テキストのマッチのために小さなプログラムをゼロから作ることもできますが、間違いを起こしやすいですし、面倒くさいですし、あまりポータブルでもフレキシブルでもありません。
代わりにマッチを(シンプルなケースでは)マッチする文字タイプとどれだけの文字をマッチさせたいかを決める数量詞を文字列として表現する正規表現を使います。
例えば、普通の文字と数字は文字通りマッチします。\wは単語の文字にマッチし、\sは(スペース、タブ、改行など)の空白文字にマッチします。ピリオド(.)は(改行をのぞいて)あらゆる文字にマッチします。
基本的な数量詞は、マッチがゼロ回かそれ以上あるアスタリスク(*)、1回かそれ以上nマッチするプラス(+)、{min,max}という形で表される範囲です。
これだけで、語を探す(\w+)機能や画像タグの中のalt属性(<img.*alt=".*">)を探す機能が手に入ります。
もっと長いテキストのマッチも必要ですが、マッチの部分集合(subset)が必要だと感じることも多いと思います。例えば、上記の例では、もしalt属性のテキストを置換したいとします。もし、括弧を使って、正規表現を囲むと、置換のための文字列のなかで使われうる変数を 捕まえる(キャプチャ) ことができます。置換のための文字列のフォーマットはこのセクションの最後で説明しますが、初めに捕まえたもの(キャプチャ)には、$1、2番目は$2を使います。
なので、alt属性のテキストを変えるためには、(<img.*alt=").*(">)を検索して、それを$1Text Intentionally Removed$2に置換できます。
上記の例では.*が使われています。しかしながら、アスタリスク演算子はどん欲(greedy)です。つまり、(マッチする限り)できるだけたくさんの文字にマッチします。なので、どん欲ではなくしたい場合は?を加えて.*?にします。
これはTextMateが正規表現を活用できる機会のリストです:
よって、言うまでもなく正規表現はTextMateでは重要な役割をします。知らなくても幸せな生活を送ることができますが、(もしまだ詳しくないなら)本やチュートリアルなどを使って、正規表現により詳しくなることを強く推奨します。
TextMateだけではなく、(sed, grep, awk, findなどの)多くのシェルコマンドでは正規表現をサポートします。PerlやRubyのような有名なスクリプト言語には、言語の深いレベルで正規表現をサポートしています。
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"
これを調べることは可能ではあるが、遅くなるので行なわない。
終り
正規表現の置換を使うとき、置換のための文字列は、キャプチャを参照したり、ケースフォールディングを実行したり、(キャプチャのレジスタに基づいて)条件付きの挿入をしたり、最小限のエスケープ文字列をサポートするフォーマット文字列として解釈されます。
キャプチャを参照するには、$nを使ってください(nはキャプチャレジスタの番号です)。$0はマッチ全体を意味します。
用例:
検索: <img src="(.*?)">
置換: <img src="$1" alt="$1">
\uか\lを先頭に追加することによってその次文字を大文字に変えたり、小文字に変えたりすることができます。これは、主に、その次の文字がキャプチャレジスタに由来するときに便利です。用例:
検索: (<a.*?>)(.*?)(</a>)
置換: $1\u$2$3
より長い文字列を\Uや\Lを使って大文字や小文字に変換できます。Eを使って、コードフォールディングを無効にできます。用例:
検索: (<a.*?>)(.*?)(</a>)
置換: $1\U$2\E$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:…))を挿入します。
ケースフォールディングのエスケープコードに加えて、\nで改行文字を、\tでタブ文字を、\$でドル文字を挿入できます。
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を他のアプリケーションの外部エディタとして使うためのシェル変数を設定する必要があるでしょう。
EDITOR変数は、svn(subversoin)やCVSのようなたくさんのシェルコマンドで使われます。TextMateをEDITOR変数のエディタとして使うには、次のようにセットしてください(bashユーザは~/bash_profile、zshユーザは~/zshrcのように):
export EDITOR='mate -w'
TextMateがファイルを閉じるまで、コマンドを再会するのを待たせるために-wを加えました。
EDITOR変数で引数をサポートしないコマンドがあります。それは、crontabです。(crontabはlaunchdがあるためあまり使われませんが。)もし使う必要があれば、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
Gitレポジトリにコミットすると、キャレットが最初の行にないことに気づくかもしれません。
これは、Gitがコミットメッセージに使うテンプラリファイルを再利用して、TextMateが(拡張属性経由で)ファイル毎にキャレットを保存するからです。
Gitエディタをmate -wl1に設定することで、この問題を回避できます。こうして、最後に位置していた場所ではなく、1行目にキャレットが位置していた状態でTextMateはファイルを開きます。
このようにGitを設定するには、GIT_EDITOR変数を設定するかGitのcore.editorの設定変数を指定してください。
TeXがファイルに関するエラーメッセージを表示する際、eを押すことで、ファイルを編集(し、エラーを訂正)することができます。
TextMateがこのように使われるように設定するためにはTEXEDIT編集を次のようにしてください:
export TEXEDIT='mate -w -l %d "%s"'
lessでの編集lessページャーはvを押すことで、そのファイルを編集することができます。TextMateをlessで使うためには、LESSEDIT変数をする必要があります:
export LESSEDIT='mate -l %lm %f'
txmtというURLスキームを使うことによって、例えば、HTMLドキュメント(アンカー)の中にあるハイパーリンク経由でTextMateでファイルを開くことができます。ローカルのファイルを参照できるので次のようなときに役に立ちます:
HTMLアウトプットと一緒にコマンドを使って、現在のドキュメントエラーや警告を表示するしたり、プロジェクトの他のドキュメントを参照する。
あなたが、同じような(テキスト)ファイルから、1セットのウェブページを生成しているときオリジナルのテキストファイルにリンクを張ることができます。なので、(ブラウザで)生成された結果を調べている時に、txmt:リンクを追っていくことでそれぞれのページのソースをすぐに編集できます。
URLスキームはtxmt:で現在はopenというコマンドを使っています。このコマンドには3つまでの引数を使えます:
url — (url=file://~/.bash_profileのような)開く(ファイル)URL。もし設定されてなければ、現在のドキュメントがターゲットになります。
line — ファイルが開かれた後に、どのラインにキャレットが置かれるか(例えば、line=11)
column — ファイルが開かれた後に、どのカラムにキャレットがくるか(例えば、column=3)
txmt:のURLの完全な例として、(テストのためにこちらをクリックしてください):
txmt://open/?url=file://~/.bash_profile&line=11&column=2
TextMateはODBエディタスイートのサーバーサイドを実装しています。このことによって、そのプロトコルのクライアントサイドを実装しているプログラムの外部エディタとして使うことができます。
しかしながら、どのテキストエディタがプロトコルを実装しているをりすとをハードコードしています。よって、もし、ODBエディタスイートをサポートしているアプリケーションの外部エディタのリストにTextMateがない場合は、そのアプリケーションの作者に、サポートされているエディタのリストにTextMateを加えるようにリクエストしないといけないかもしれません。
外部テキストエディタとして設定できるアプリケーションを追跡するwikiページあります。
TextMateには(Mailで使われているのを含めて)TextMateをスタンダードCocoaテキストエディタコントロールからTextMateを呼び出すことができる、"Edit in TextMate"というインプットマネージャーが含まれます。これは、Safariのフォーム要素のように、ODBエディタスイートを実装しないプログラムで使うときに便利です。
詳しい情報は、(ステータスバーのギアメニューからアクセスできる)TextMateバンドルにあるInstall “Edit in TextMate”…を選択してください。実際にインストールする前に必要なドキュメンテーションをすべて提供します。
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»
NSDragAndDropTextDelayあなたが、選択部分の上でマウスをクリックしてマウスをうごかすと、もしあなたが15ミリセカンド待ち、それから選択範囲をドラッグしない限り、TextMateは新しい選択範囲を作ります。この遅延時間はこの設定の値によって変えることができます。
値をゼロ以下(例えば、-1)にセットすると選択範囲をドラッグすることができなくなります。それは、選択範囲の中でマウスをクリックをするとすぐにそれをすぐに感知し、(ボタンが押されている間にマウスを動かせば、)そのポイントから新しい選択範囲を作るという言う意味です。
ゼロにセットすればすぐにドラッグを始めます。
例:
defaults write com.macromates.textmate NSDragAndDropTextDelay 0
NSRecentDocumentsLimitこれは"Open Recent"メニューに保存されているドキュメントの数を設定します。デフォルト値は25です。
例:
defaults write com.macromates.textmate NSRecentDocumentsLimit 50
OakBundleItemsPopUpMenuKeyEquivalentステータスバーにあるギアメニューを開くキーボードショートカット。このキーはsystem key bindings fileで説明されています。デフォルトの値は"^\033"(コントロール エスケープです)。
キーコードに関する詳しい情報は、このメールを参照してください。
OakBundleManagerDisambiguateMenuFontSizeもしあなたがメニューで使われているタブトリガーと対応するキーと似たものを明確にするためのフォントが小さすぎると思うなら、次のように実行してください。
defaults write com.macromates.textmate OakBundleManagerDisambiguateMenuFontSize 14
OakDefaultBundleForNewBundleItemsあなたがはじめにバンドルを選択せずに、バンドルエディタで新しいアイテムを作ると、このデフォルトキーによって使われるUUIDのバンドルがターゲットとして使われます。
これは自動的にあなたが作る最初のバンドルに設定されます。これをどう変更するかの例は このメールを見てください。
OakDefaultLanguage新規の(無題の)ドキュメントのデフォルトの言語を設定します。値は使われる言語のUUIDを使います。
さらなる情報はメーリングリストのこのメッセージをみてください。
OakDisableSessionRestoreあなたがTextMateを起動するとき、最後に使ったプロジェクト/ドキュメントが開きます。しかし、次のコマンドを実行することによってこの機能を無効にできます。
defaults write com.macromates.textmate OakDisableSessionRestore 1
OakDocumentCustomFSMetaDataTextMateがメタデータ(setxattr replacement)を保存するときに使う関数のためのファイルシステムの配列です。メタデータはAppleDoubleフォーマットで保存されます。デフォルト値は( afpfs, nfs, msdos )になっています。こうなっている理由は、setxattrがこれらのファイルシステムでカーネルパニックを発生させるからです。(rdar://4162474)
例:
defaults write com.macromates.textmate \
OakDocumentCustomFSMetaData '( afpfs, nfs, msdos, hfs )'
OakDocumentDisableFSMetaData詳しい情報はextended attributesをみてください。
OakFindPanelDisableHistoryこれは、検索パネルの履歴を残さないようにするためです。この設定はユーザーの中に検索ダイアログでタブキーを押したときにクラッシュを経験した人がいるからです。履歴のコントロールによってこのクラッシュが発生します。現在のところ、このコントロールを使えなくすることでのみこの問題を回避できます。
defaults write com.macromates.textmate OakFindPanelDisableHistory 1
OakToolTipMouseMoveIgnorePeriod and OakToolTipMouseDistanceThresholdコマンドをツールチップを出したときに最初の1秒の間はマウスを動かしてもツールチップは閉じません。1秒後ツールチップが閉じます。ツールチップを閉じるためには、少なくとも5ピクセル分
マウスを動かす必要があります。OakToolTipMouseMoveIgnorePeriodとOakToolTipMouseDistanceThresholdを使うことでこの値を変更できます。
OakWrapColumnsこれは、View → Wrap Column サブメニューで使われる値の配列です。デフォルトでは、40と78が使われています。
例:
defaults write com.macromates.textmate OakWrapColumns '( 60, 70, 80, 120 )'
OakWordsExcludedFromCapitalizationThe 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 )
TextMateのためのメーリングリストがあります。アーカイブはパブリックで以下のフォームで検索できます。
##textmate というIRCが freenode.net上にあります。
David Powers が、印刷してあなたのコンピュータの隣においておくことができる簡潔なチートシート ( PDFへの直接リンク) を作りました。これは、たくさんの一般的なアクションのキーの組み合わせのリストを示します。
Soryu は 2つのセットアップと基本的な使用法を扱ったTextMateのチュートリアル書きました。
スクリーンキャスト RSS フィード をiTunesを通じて購読できます。
Here is a list with direct links to a few of the screencasts in recommended viewing order:
短いようやくと全てのリストはオンラインのスクリーンキャストのページをご覧ください。
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.
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
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", )
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" ); }
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).
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++).

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 }
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 = "^.*\{[^}\"']*$";
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]*$';
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*$';
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).*)?$';
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.