目次
この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
Rails のエラーページにはありがたいことにスタックトレースが表示されていますが、どうせならそこに書かれたファイル名をクリックするだけでエディタが開くようにしてしまおうという作戦です。
手順は以下の3ステップです 。
- スタックトレース中のパスをうさんくさい URL にリンクさせる
- うさんくさい URL を使ってエディタを起動できるようにする
- うさんくさい URL のプロトコルを扱えるよう Windows に教えてやる
スタックトレース中のパスをうさんくさい URL にリンクさせる
Greasemonkey を使って app/ で始まっている文字列をファイルパスとみなし、リンクを作ります。
editor という勝手に決めたプロトコルを使って、editor:///エラーが/発生した/ファイル.rb?行番号
というようなうさんくさい URL にリンクしてやります。
// ==UserScript==
// @name rails trace: link to editor
// @namespace http://userscripts.org/users/59751
// @include http://colinux:3000/*
// ==/UserScript==
(function() {
if (document.title != "Action Controller: Exception caught") return;
var railsRoot = document.body.innerHTML.match(/RAILS_ROOT: ([^\s&]+)/)[1];
if (!railsRoot) return;
// samba のマウントポイントに合わせて書き換える
railsRoot = railsRoot.replace('/home/sugimoto', '/l');
var pattern = /(app\/[^:]+):(\d+)/g;
document.body.innerHTML = document.body.innerHTML.replace(pattern, function(all, path, line) {
var fullPath = railsRoot + "/" + path;
return '&a href="editor://'+fullPath+'?'+line+'">'+all+'&/a>';
})
})()
うさんくさい URL を使ってエディタを起動できるようにする
editor URL にアクセスした時に実行するプログラムを作ります。せっかくなので Ruby で作ってみましょう。
#!/usr/bin/env ruby
require 'uri'
u = URI.parse(ARGV[0])
# Cygwin パスから Windows パスに変換。
# Cygwin を使用していない場合は適当に読み替えてください。
path = `cygpath -w "#{u.path}"`.chomp
system('C:/app/xyzzy/xyzzycli.exe "%s" -go %s' % [path, u.query])
うさんくさい URL のプロトコルを扱えるようWindows に教えてやる
これだけだとリンクをつついても、editor というプロトコルはどのプログラムにも関連づけられておらず……
と言われて悲しい思いをするだけなので、レジストリに以下のエントリを追加してやります。
[HKEY_CLASSES_ROOT\editor]
@="URL:editor Protocol"
"URL Protocol"=""
[HKEY_CLASSES_ROOT\editor\DefaultIcon]
@="\"C:\\app\\xyzzy\\xyzzy.exe\",0"
[HKEY_CLASSES_ROOT\editor\shell]
[HKEY_CLASSES_ROOT\editor\shell\open]
[HKEY_CLASSES_ROOT\editor\shell\open\command]
@="\"C:\\cygwin\\bin\\ruby\" \"C:\\home\\sugimoto\\bin\\run-editor.rb\" \"%1\""
ファイルを開けば上記内容を追加できますが、内容は環境に合わせて変更してください。
おめでとうございます
リンクをつつくと……
エディタが開く!