2007年 10月 27日

今の Amalgam の曖昧検索と Chemr の補完

r = /(#{str.split(//).map {|c| Regexp.escape(c) }.join(").*?(")})/i
@now.concat @candidates.select {|i|
	r === i.name
}.sort_by {|i|
	# 文字が前のほうに集っているほど高ランクになるように
	m = r.match(i.name)
	(0...m.size).map {|i| m.begin(i) }.inject {|p,i| p + i }
}

もっとうまくかけるかな、というかいいアルゴリズムあるかな……(Chemr にもうつそう)
いまつかってるかぎりだとけっこういい感じ

adp
Adobe Photoshop
fi
Finder
dip
Displays.prefPane
dis
Displays.prefPane
thu
Thunderbird
safa
Safari
tem
Terminal
trm
Terminal
itu
iTunes

みたいにそれっぽくトップにくる。てきとうにうってもあたるのはやっぱいいなぁ。QS もそうだけど


あと Chemr で TAB おしたときに

keys[0].zip(*keys[1..-1]) do |a|
	m = a.first.downcase
	if a.all? {|v| v && (m == v.downcase)}
		common << m
	else
		break
	end
end

ってやってるけど、もっとうまく書けないかなぁ……要素中の先頭から共通の部分を最長でもってくる……

こういうの考えるの苦手すぎる……すなわち頭が悪いというこなんだけど……

Chemr 2007-10-27

http://coderepos.org/share/changeset?new=lang%2Fruby%2FChemr%40759&old=lang%2Fruby%2FChemr%40740

http://lab.lowreal.net/test/chemr/Chemr.2007-10-27.dmg

  • .chm バンドルをサポート
  • 検索結果がなくなった場合自動的に曖昧検索になるように
    • 曖昧検索中はテーブルビューが赤くなる
    • かなり重いのでデフォルトにはできない……
2007年 10月 26日

Chemr TODO

  • chm じゃなくても HTML + index つくればみれるようなの
    • 無駄に時間かかるし、Windows 必要だし……
    • てきとうにバンドルにしたらよさそう
    • そもそも Apple Help を忘れてるだろ……
  • 設定分離 (いい方法考えるのがめんどくさい)

Apple Help メモ

http://developer.apple.com/documentation/Carbon/Conceptual/ProvidingUserAssitAppleHelp/

キーワード機能がない。全文検索だけ。

Amalgam

QuickSilver がスタンバイから復帰するとおかしくなったり、やたら重くなったり、途中から候補がおかしくてアイコンがおかしくて……になったりで度々再起動させられるのにうんざりしたので、それ RubyCocoa でっておもって書きはじめてとりあえず自分でつかえるぐらいにはなってきた。QS をあんまり深く使ってなかった。すぐ作れる RubyCocoa はほんとすばらしい。

http://screencast.com/t/xmHrG0w6

ホットキーおすと、コンボボックスがおもむろに現われて、うちこんで RET で起動する。SO☆RE☆DA☆KE

ホットキーの実装部分は前につくってあったのでそれそのままつかって、あとは最近覚えた IB 上で NSView つくってほげほげみたいな連携とかをしながらできるだけ時間をかけずにつくってみた。

やっぱ完成度50%ぐらいからすすみがわるくなるなぁ……つくりはじめが一番たのしい。

あと設定をてきとうに eval するようにすれば自由に候補を追加してラウンチできるようになりそう。デバッグコマンドとかもコマンド (引数をとる) として分離したらいいかなぁ。

名前は QuickSilver が水銀だから、それっぽいのに

QS の使いかたとか設定を覚えるより、RubyCocoa でかいてしまって、設定を Ruby で書いてしまうほうが他に応用できていいなぁとおもった。


そういえば orderOut したときに他のアプリにフォーカスがうつらないんだよなぁ……

Chemr 2007-10-26

http://lab.lowreal.net/test/chemr/Chemr.2007-10-26.dmg

http://coderepos.org/share/changeset?new=lang%2Fruby%2FChemr%40740&old=lang%2Fruby%2FChemr%40689

いろいろ変更

  • ツリー表示を有効に
    • キーワードがメインなのはもちろんそのまま
    • OutlineView の注意事項はちゃんと読むと書いてあるんだなぁ……冒頭の部分を飛ばしてよんでて、API しかみてないのがバレバレすぎる……
  • UserCSS
    • ~/.chemr/userstyle.css を読む
    • WebView の機能をそのままつかっているのでキャッシュがきいたりするかも
  • 一部の chm で落ちてたのを暫定的に修正
    • .js でおわるファイルを読まないようにした
  • とりあえずの全文検索をつけた (Ctrl+RET すると全文検索)
    • 日本語きかない。でもあんまり困らないからプライオリティひくい
  • ページ内検索
    • キーワードの検索エリアに検索文字列を入れたうえで Cmd-F

usercss はとりいそぎ Cocoa の chm をリコンパイルするのがめんどいのでつけた。

英英 on Mac

どうでもいいけど、WebKit つかっていたりするやつだと Ctrl-Cmd-D でカーソル直下の単語を辞書でひけるのでべんりべんり (おしっぱだとひきっぱなしにできる)。もちろん WebView そのまんまつかっている Chemr も例外でなくて、そのままつかえる。Cocoa はすばらしいなぁ……

2007年 10月 25日

Chemr

今日のスナップショット

http://lab.lowreal.net/test/chemr/Chemr.2007-10-24.dmg

全部入りの dmg です。RubyCocoa さえ同梱してあります (svn head にちかめ)。たれかです。


あとキーバインドを設定からよむようにして (たぶん ~/.chemr/chemr-keys あたりを eval するだけ)、ユーザ CSS はかなぁ。実装自体よりどうやったら簡単かで悩むむ。

キーバインドはいまのところ

keybinds = {
	"C-j" => self.method(:nextCandidate),
	"C-n" => self.method(:nextCandidate),
	"C-k" => self.method(:prevCandidate),
	"C-p" => self.method(:prevCandidate),
	"¥r"  => self.method(:jumpToCurrent),
	"¥t"  => self.method(:completion),
	" "   => Proc.new {|s|
		@webview.stringByEvaluatingJavaScriptFromString <<-JS
			window.scrollBy(0, 200);
		JS
	},
	"C-u" => Proc.new {|s|
		@search.stringValue = ""
	},
	"G-[" => Proc.new {|s|
		@webview.goBack
	},
	"G-]" => Proc.new {|s|
		@webview.goForward
	},
	"G-=" => Proc.new {|s|
		@webview.makeTextLarger(self)
	},
	"G--" => Proc.new {|s|
		@webview.makeTextSmaller(self)
	},
}

こんなかんじにしてある。.call! .call! Duck Typing! JS よんでるのがすこしきもいけど、WebView の API しらべるより簡単だし、いろいろできそうな感じがしてこれはこれでいい気がした

とにかくもう Ruby で書いてあるからもうなんでもできますね。ってかんじだけれど、トピックツリーを処理させるようにすると、NSOutlineView のよびだし (でも delegate メソッドではない) で頻繁に落ちようになったり、あと謎のタイミングで落ちるようになったりしたので機能を無効化してある。どうせキーワード検索しかつかわない。

2ファイルにしか分離せずクラスに機能をめっさ詰めこんでる (デリゲート対象になりまくってる)。これたぶんよくないんだろうけど、めんどいしなぁ。

Enumerable#group_by

なんでないんだろう。いままで partition がこれだとおもってた。

module Enumerable
	def group_by(&block)
		self.inject({}) {|r,i| (r[yield i] ||= []) << i; r}.values
	end
end

foo = Array.new(10) { rand(40) }

require "pp"
pp foo.group_by {|i|
	("%02d" % i)[0]
}

partition より汎用的で、partition にするにも ! 一個足すだけだからこっちがあったほうがいいと思うんだけどなぁ

検索してみると既出すぎる……ActiveSupport にもあるんだ

Chemr どうにかしたいリスト

  • ページ内検索
  • 全文検索 (chmlib binding のほうに API だけは移植した)
  • InputMethod の変換中はキーバインドを無効にしたい (IM の有効無効をどうやってとるか謎い)

実装メモ

  • WebView の performFindPanelAction はうごかない
    • なんでっておもってたけど、そういうもんみたいだ。リファレンスにのっけておくなよ><
  • 全文検索で日本語が検索できない。
    • binding の実装がわるいんだろうけど (文字コードを NKF で変換できる範囲で変えてみたけどだめだった)
    • 実装しなおすにはフォーマットをちゃんと理解しないといけない
    • 閉じた仕様でなおかつ消えていきそうな仕様の理解を深めても……
    • とはいえ実装おったり、http://www.nongnu.org/chmspec/latest/Internal.html#FIftiMain 読んだりした……めんどくさい
  • OutlineView はやっぱ落ちまくる
    • Tree 表示のタブを選択するまで、データソースを設定しないようにしてみた
    • 表示させちゃうと (しかもたくさん CHM ひらいていると) 落ちやすくなる
  • IM 変換中のキーバインド無効はコメントをいただいたのをそのまま条件文に
2007年 10月 24日

RubyCocoa で chm 読むアプリケーションつくりはじめた

Mac でつかえる chm (HTML Help) よむやつでまともなのがないので作ってみた、けど、微妙にうまくいってない。

NSSearchField にフォーカスがあるとき、それ自身をサブクラスにしても親の NSWindow をサブクラスにしてもキーイベントがとれない。なんでだろ。これが解決しないことにはつかえないお……全部メニューコマンドにしちゃうかなぁ……Cmd+L でサーチエリアにフォーカスあたるようにしてる。ぎりぎり使えるかつかえないかレベル。HHK だと使う気にならない。


まともなのっていうのは

  • インデックスのインクリメンタルサーチができる
  • ストレスないぐらいには速い
  • 日本語がおかしかったりしない
  • キーバインドがまとも

っていう最低最低限レベルであって、なんか特別なことやりたいわけじゃない。探しかたがわるいだけなのかほんと見つからない。

作るなら Ruby で書きたいなと思って、chmlib っていう C のライブラリの ruby binding を swig 使って作って、それを利用して RubyCocoa 使ってすかすかつくった。chmlib をやるまえに pure ruby で書いてたんだけど、途中でめんどくさくなってやめた。swig は思ったより簡単だったけどめんどかった (でも一部の関数は使わないのもあって使えるようにしてない)

本体の処理は Chmox からだいたいパクってて、chmlib のバインディングのほうは PyCHM からパクってる。ぜんぶパクり。

あとユーザ CSS ほしいですね。すぐ実装できそう。

あとあと、ぜんぜんどうでもいいかもしれないのだけれど

url = "#{SCHEME}://#{doc.object_id}#{path}"
NSURL.URLWithString_relativeToURL(url, "#{SCHEME}://#{doc.object_id}/")

って感じで内部 URL を作るのに object_id を使っているのに萌えませんか! せんか!

URL はクラスを横断したりするから、ObjectSpace._id2ref だけでとれるとすごいスッキリ! 後処理も doc の参照はずすだけでいいし!