9 環境変数

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

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

  • Bash — "$VAR"
  • Perl — $ENV{'VAR'}
  • PHP — $_ENV['VAR']
  • Python — os.environ['VAR'] (初めにimport osを実行するのを忘れないでください。)
  • Ruby — ENV['VAR']

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

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

9.1 動的変数

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

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

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

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

  • 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_TABSYESが値に入ります。そうでなければ、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も参照にしてください。

9.2 静的変数

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

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

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

Shell Variables

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

9.3 コンテクスト依存変数

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

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

Scoped Environment Variables

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

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

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

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

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

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

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