hitode909の日記

趣味はマリンスポーツですの日記です

Emacsで1ファイルにしか出現していないシンボルをハイライトするやつ

前書き

革新的ソフトウェアを作った.

背景

  • 近年,Eclipseやflymakeなど,ソースコード中のエラーを発見するツールの開発が進んでいる
  • PerlやRubyのような言語では静的コード解析が難しく,メソッド名の間違いを実行時にしか発見できないことがあり,頻繁にテストを実行することなどで補っている

提案手法

  • リポジトリ内で1ファイルにしか出現しない色付けする

シンボルの出現について

ソースコード中のシンボルは他のファイルにも登場する場合が多い.
たとえば,あるファイルで宣言されたメソッドを他のファイルから呼ぶと,そのメソッドは2箇所から出現する.

以下の例では,helloというシンボルはファイル1と2の両方に出現している.

# file1
def hello
  puts "Hello, World!"
end
# file2
require './file1'
hello()


以下の例では,helloではなく,hiという関数を呼び出そうとしている.hiという関数は存在しないので呼び出しに失敗する.このとき,hiとhelloはそれぞれ1ファイルにしか出現していない.

# file1
def hello
  puts "Hello, World!"
end
# file2
require './file1'
hi()


hiと書いた瞬間に,「hiはこのファイルにしか出現していない」ということが分かれば,なにかおかしいと思って,hiがあるはずのファイルを見に行ったりできる.

実装

Emacsで1ファイルにしか出現していないシンボルをハイライトするのを作った.
カーソル位置のシンボルがいくつのファイルに出現するか調べて,1ファイルにのみ出現していたら警告っぽい色にする.色はシンボルを編集するとリアルタイム変わる.


さっきの例でhiに色つくとこんな感じ.
f:id:hitode909:20130211232758p:plain
さっきの例では厳密に色付けするとrequireと./file1とdefとputsとHello, Worldとendも色付くはずだけど本当にやるとわけわからなくなるのでこの画像ではhiにだけ色つけてる.


GitHubに置いてある.

こんな感じのことをすれば使える.

(require 'highlight-unique-symbol)
(highlight-unique-symbol t)


1ファイルに出現するかどうか調べるのは,1秒に10回カーソル位置のシンボルを監視してgit grepすることで実現している.
シンボルが変化しなければ一度しか調べないとか,気をつかってる.

雑談

  • コメントとかも1ファイルにしか出現しないので,けっこう赤くなる
  • 1ファイルにしか出現しなくても正しい場合がある(たとえば以下)
    • ファイル内で固有な変数名
    • リポジトリに入ってないクラス名を呼び出す場合
    • ストリングリテラル
    • コメント
  • 警告色が出るよりは,もうちょっと穏やかな見た目のほうが良いかもしれない(背景色がちょっと暗くなるとか)
  • さっき完成したからどれくらい便利か分からないのでしばらく使ってみる

追記(2013-06-20)

今は上で述べた挙動から変わっています.雰囲気は同じ.