Tracy からエディタでファイルを開くには(IDE との統合)

エラーのページが表示されているとき、ファイル名をクリックすると、対応する行にカーソルを置いた状態でエディタが開きます。ファイルを作る(create file の操作)ことも、その中の不具合を直す(fix it の操作)こともできます。そのためにはブラウザとシステムを設定する必要があります。

Tracy は editor://open/?file=%file&line=%line の形の URL、つまり editor:// のプロトコルでファイルを開きます。このプロトコルの独自のハンドラをシステムに登録する必要があります。このハンドラは、パラメータを処理してお好みのエディタを起動する実行可能なファイルなら何でもかまいません。

URL は Tracy\Debugger::$editor 変数で変えられますし、Tracy\Debugger::$editor = null にすればクリックで開く機能を切れます。

Windows

  1. 必要なファイルを Tracy のリポジトリから ディスクにダウンロードします。
  2. open-editor.js ファイルを編集し、settings オブジェクトの中で、あなたのエディタへのパスのコメントを外して、必要なら書き換えます。
var settings = {

	// PhpStorm
	editor: '"C:\\Program Files\\JetBrains\\PhpStorm 2018.1.2\\bin\\phpstorm64.exe" --line %line% "%file%"',
	title: 'PhpStorm',

	// NetBeans
	// editor: '"C:\\Program Files\\NetBeans 8.1\\bin\\netbeans.exe" "%file%:%line%" --console suppress',

	// Sublime Text 2
	// editor: '"C:\\Program Files\\Sublime Text 2\\sublime_text.exe" "%file%:%line%"',

	...
}

...

パスの中の二重のバックスラッシュはそのまま残すよう気をつけてください。

3. editor:// のプロトコルのハンドラをシステムに登録します。

これは install.cmd を実行して行います。管理者として実行する必要があります。 これで open-editor.js のスクリプトが editor:// のプロトコルを受け持ちます。

本番のサーバーや Docker など、ほかのサーバーで作られたリンクを開けるようにするには、リモートからローカルへのパスの対応づけを open-editor.js に足します。

	mappings: {
		// リモートのパス: ローカルのパス
		'/var/www/nette.app': 'W:\\Nette.web\\_web',
		'/var/www/second.app': 'W:\\Second.web'
	}

Windows では open-editor.js は Windows Script Host の上で動きます。その JScript のエンジンは ECMA-262 第 3 版(1999 年)しか解しません。このスクリプトを編集するときは、昔ながらの JavaScript にとどめてください。letconst ではなく var を使い、アロー関数は避け、オブジェクトの最後の項目のうしろにコンマを置かないでください。今どきの書き方はスクリプトのエラーを起こし、editor:// のプロトコルは黙ってエディタを開かなくなります。

リモートからローカルへの対応づけは、PHP の側でも Debugger::$editorMappingで定義できます。こちらはエディタのハンドラやプラットフォームに関わらず働きます。

Linux

  1. 必要なファイルを Tracy のリポジトリから ~/bin ディレクトリにダウンロードします。
  2. open-editor.sh ファイルを編集し、editor 変数の中であなたのエディタへのパスのコメントを外して、必要なら書き換えます。
#!/bin/bash

# Emacs
#editor='emacs +$LINE "$FILE"'

# gVim
#editor='gvim +$LINE "$FILE"'

# gEdit
#editor='gedit +$LINE "$FILE"'

# Pluma
#editor='pluma +$LINE "$FILE"'

...

実行できるようにします。

chmod +x ~/bin/open-editor.sh

使っているエディタがパッケージから入れたものでない場合、その実行ファイルがシステムの $PATH にないかもしれません。これは簡単に直せます。~/bin ディレクトリに、そのエディタの実行ファイルへのシンボリックリンクを作ってください。

3. editor:// のプロトコルのハンドラをシステムに登録します。

これは install.sh ファイルを実行して行います。これで open-editor.sh のスクリプトが editor:// のプロトコルを受け持ちます。

macOS

PhpStorm や TextMate などのエディタは特別な URL でファイルを開けます。それを設定するだけです。

// PhpStorm
Tracy\Debugger::$editor = 'phpstorm://open?file=%file&line=%line';
// TextMate
Tracy\Debugger::$editor = 'txmt://open/?url=file://%file&line=%line';
// MacVim
Tracy\Debugger::$editor = 'mvim://open?url=file:///%file&line=%line';
// Visual Studio Code
Tracy\Debugger::$editor = 'vscode://file/%file:%line';

Tracy を単独で使っているなら、この行を Tracy\Debugger::enable() の前に置きます。Nette を使っているなら、Bootstrap.php$configurator->enableTracy() の前に置きます。

残念ながら create filefix it の操作は macOS では動きません。

デモ

不具合を直す様子です。

新しいファイルを作る様子です。

うまくいかないとき

  • Firefox では about:confignetwork.protocol-handler.expose.editorfalse に、network.protocol-handler.expose-alltrue にして、独自のプロトコルの実行を許す必要があるかもしれません。とはいえ既定で許されているはずです。
  • すぐに動かなくても慌てないでください。リンクをクリックする前にページを何度か読み込み直すか、ブラウザやコンピュータを再起動してみてください。たいていそれで直ります。
  • Input Error: There is no script engine for file extension ".js"Maybe you associated ".js" file to another app, not JScript engine. のようなエラーを直すリンクです。

Google Chrome のバージョン 77 からは、リンク経由でエディタが起動されるとき「この種類のリンクを常に関連付けられたアプリで開く」のチェックボックスが出なくなりました。Windows での回避策として、fix.reg ファイルを作ります。

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Chrome]
"AutoLaunchProtocolsFromOrigins"="[{\"allowed_origins\": [\"*\"],\"protocol\": \"editor\"}]"

ダブルクリックで取り込んで Chrome を再起動します。AutoLaunchProtocolsFromOrigins のポリシーは、ブラウザの確認のダイアログを完全に抑えます。install.cmd のスクリプトはこれを自動的に設定し、Vivaldi 向けのコメントアウトされた行(HKLM\SOFTWARE\Policies\Vivaldi の下の同じポリシー)も含みます。

さらに質問や提案があればフォーラムへお越しください。