5 Bundles

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

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

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

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

Bundle Editor

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

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

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

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

Key Equivalent

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

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

Key Equivalent Ambiguity

5.1.2 Tab Triggers (タブトリガー)

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

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

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

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

Tab Trigger Menu

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

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

Tab Trigger Ambiguity

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

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

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

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

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

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

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

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

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

defaults read com.macromates.textmate OakBundleManagerDeletedBundles

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

defaults delete com.macromates.textmate OakBundleManagerDeletedBundles

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

5.4 Hiding Bundles バンドルを隠す

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

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

Hiding Bundles

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

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

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

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

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

  • 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コマンドをもつバンドルもたくさんあります。

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

Bundle Actions

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

5.6.1 Diff

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

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

diff -u old_file new_file|mate

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

5.6.2 HTML

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

  • 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でタグを使いたい場合は、PreferencesAdvancedで、TM_XHTMLという変数を新しく作って、‘ /’にセットしてください。(この変数の値は、EMPTY content modelで作成されたタグの>の前に入力されます。)

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

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

5.6.3 LaTeX

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

  • 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

5.6.4 Source

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

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

5.6.5 SQL

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

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

5.6.6 Subversion

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

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

Subversion Commit

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

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

5.6.7 Text

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

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

  • Delete Line (⌃⇧K) — 現在の行を削除する

  • Document Statistics (⌃⇧N) — これは、現在のドキュメントの行数、単語数、文字数をツールチップで表示します。

  • Duplicate Line / Selection (⌃⇧D) — これは現在の行を複製します。キャレットは同じカラムの新しい行にきます。もし選択範囲がある場合は、それを複製します。

  • Sort Lines in Document / Selection (F5) — これは行や選択範囲をアルファベット順に並び替えます。

5.6.8 TextMate

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

Show Scope

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

5.6.9 Xcode

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

Build With Xcode

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

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

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

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

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

  • もしMacPorts を使っているなら、ターミナルを開いて、以下を実行してください:

    sudo port install subversion
    
  • もしFinkを使っているなら、 svn-clientパッケージをインストールしてください。

  • もしFinkもMacPortsも使っていないなら、Martin Ott's homepageのsubversionやここにあるプリビルドバイナリーのどれかを手に入れることができます。

5.7.2 Setting LC_CTYPE LC_CTYPEを設定する

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

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

export LC_CTYPE=en_US.UTF-8

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

setenv LC_CTYPE en_US.UTF-8

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

echo "$TM_SUPPORT_PATH"

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

/Library/Application Support/TextMate/Support

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

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

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