Vim のキーワード補完
ヒットしたキーワードが書かれているファイル名が preview されるけど、意味ないから引数とか表示させたいなぁ……
でも簡単にはできないっぽいなぁ。
ヒットしたキーワードが書かれているファイル名が preview されるけど、意味ないから引数とか表示させたいなぁ……
でも簡単にはできないっぽいなぁ。
libs/iovm/source/IoVMInit.c (.c だけど実際は Io でほとんど書いてある) に書いてあるけど、
searchPaths := list("io/addons", System installPrefix .. "/lib/io/addons")"から searchPaths/#{addon-name}/build.io があるやつをよむみたい
Io> AddonLoader addons map(name)
==> list("AVCodec", "AppleExtras", "AsyncRequest", "BigNum", "Blowfish", "Box", "CFFI", "CGI", "Cairo", "ContinuedFraction", "Contracts", "Curses", "DBI", "Flux", "Fnmatch", "Font", "GLFW", "Image", "LZO", "LibSndFile", "Libxml2", "Loki", "MD5", "MySQL", "NotificationCenter", "ODE", "ObjcBridge", "OpenGL", "PortAudio", "PostgreSQL", "Postgres", "Python", "QDBM", "Random", "Range", "Rational", "Regex", "SGML", "SHA1", "SQLite", "SQLite3", "SampleRateConverter", "SkipDB", "Socket", "SoundTouch", "SqlDatabase", "Syslog", "SystemCall", "TagDB", "TagLib", "Thread", "UUID", "User", "Zlib")使えるかどうかはロードしてみるまでわからない。トップレベルで参照しようとするとロードされる。
なので、
mkdir -p io/addons/FooBar touch io/addons/FooBar/build.io
とかやって FooBar を評価すると
Io> FooBar Exception: unable to read file 'io/addons/FooBar/depends' --------- contents AddonLoader.io 27 Object FooBar Command Line 1
とかでて、なんかやってるのがわかる。
[1, 2, 3] は squareBrackets(1, 2, 3) と同じっぽいのだけど、デフォルトだと何にも割りあてられてない。
Io> squareBrackets := getSlot("list")
==> # io/A2_Object.io:401
method(
call message argsEvaluatedIn(call sender)
)
Io> [1, 2, 3]
==> list(1, 2, 3)Io> list(1, 2, 3)[0]
Exception: List does not respond to 'squareBrackets'
---------
List squareBrackets Command Line 1
Io> List squareBrackets := List getSlot("at")
==> List_at()
Io> list(1, 2, 3)[0]
==> 1
Io> [1, 2, 3][1]
==> 2Io ではいろいろメッセージセンドになってる (てきと)。:= は setSlot の言いかえである。すなわち
Io> setSlot = method( "This is penis operator.\n" print )
==> method(
"This is penis operator.\n" print
)
Io> seme := uke
This is penis operator.
==> This is penis operator.
Io> seme
Exception: Object does not respond to 'seme'
---------
Object seme Command Line 1ということができる。もちろん上書きしているので変数への代入 (に見えるスロットへのセット) は行なわれない。ついでに uke も評価されないため、エラーが発生しない。仮引数を書かなければ暗黙的な評価はされない。
評価されるケース (仮引数を書いた場合)
Io> setSlot = method(a, b, "This is penis operator. Uke: #{b}\n" interpolate print )
==> method(a, b,
"This is penis operator. Uke: #{b}\n" interpolate print
)
Io> seme := "aaa"
This is penis operator. Uke: aaa
==> This is penis operator. Uke: aaa
Io> seme := uke
Exception: Object does not respond to 'uke'
---------
Object uke Command Line 1
Object setSlot Command Line 1あるいは call evalArgAt(n) で明示的に評価できる。( call sender doMessage(call message argAt(1)) の簡易版 )
Io> setSlot = method(uke := call evalArgAt(1); "This is penis operator. Uke: #{uke}\n" interpolate print )
==> method(
uke := call evalArgAt(1); "This is penis operator. Uke: #{uke}\n" interpolate print
)
Io> seme := uke
Exception: Object does not respond to 'uke'
---------
Object uke Command Line 1
Object setSlot Command Line 1
Io> seme := "uke"
This is penis operator. Uke: uke
==> This is penis operator. Uke: ukeinterpolate というメソッドがでてきたけど、これは #{name} をローカル変数で置換するメソッド (式は書けないっぽい)。
ブロックあるいはメソッドは、そのコンテキストに入るときにオブジェクトが一つ割りあてられる。これは JS でいうところの Activation Object (Io でも変数オブジェクトとして使われる) で、やはり直接それをとりだすことはできない?
Io> block( slotNames ) call
==> list("updateSlot", "call", "self")とやると、上の call evalArgAt(1) で出てきた Call オブジェクトが入った call スロットがあることがわかる。
ちんこ演算子が使える言語なのでおもしろいですね。
タグ自動で閉じるやつ入れてから書くのが苦じゃなくなったなぁ。xyzzy のときぐらいいい感じ。surround.vim もあるからそれより楽かも
無駄なことやりまくる
require "enumerator"
def ngram(data, n)
ret = []
data.split(//u).each_cons(n) do |a|
ret << a.join
end
ret
end
def sim(a, b, n)
agram = ngram(a, n)
bgram = ngram(b, n)
all = (agram | bgram).size.to_f
same = (agram & bgram).size.to_f
same / all
end
require "rexml/document"
require "open-uri"
include REXML
entries = []
doc = Document.new(open("http://d.hatena.ne.jp/cho45/rss").read)
doc.elements.each("//item") do |e|
title = e.elements["title"].text
link = e.elements["link"].text
text = e.elements["content:encoded"].text
text.gsub!(/<[^>]+>/, "")
text.gsub!(/¥s+/, " ")
entries << {
:title => title,
:link => link,
:text => text,
}
end
results = {}
entries.each do |a|
entries.each do |b|
next if a[:link] == b[:link]
key = [a[:link], b[:link]].sort
next if results[key]
results[key] = {
:a => a,
:b => b,
:sim => sim(a[:text], b[:text], 3)
}
end
end
results.sort_by {|k,i| i[:sim] }.each do |k,v|
puts "%s: %s" % [v[:a][:link], v[:a][:title]]
puts "%s: %s" % [v[:b][:link], v[:b][:title]]
puts v[:sim]
puts
end
なんかうまく表示されないのですよ
@namespace url(http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul);
.tabbrowser-tabs * {
width: 100% !important;
}
.tabs-stack {
width: 10em !important;
}とりあえずこうしたらちゃんとした。DOMInspector をインストールする方法さがすほうが大変だった……
http://svn.coderepos.org/share/lang/javascript/userchrome/hatena-multi.uc.js
はてなツールバーにも一応機能があるんだけど、よくわからないタイミングでクリアされたりする (クッキーの使いまわしで実装してるから?) ので tumblr のやつコピペして作った。
このスクリプトは Fx 全体へのフックとかは一切かけていないので、Window の初期化がちょっと遅くなる以外はパフォーマンスに影響しないはず
お、グループにもその場編集機能だ。
--- delegate.rb.orig 2007-10-15 03:54:11.000000000 +0900
+++ delegate.rb 2007-10-15 04:01:23.000000000 +0900
@@ -95,7 +95,7 @@
klass = Class.new
methods = superclass.public_instance_methods(true)
methods -= ::Kernel.public_instance_methods(false)
- methods |= ["to_s","to_a","inspect","==","=~","==="]
+ methods |= ["to_s","to_a","==","=~","==="]
klass.module_eval {
def initialize(obj)
@_dc_obj = obj
@@ -137,6 +137,11 @@
raise NameError, "invalid identifier %s" % method, caller(3)
end
end
+ klass.module_eval do
+ def inspect
+ "#<#{self.class}:#{"%#0x8d"%self.object_id}:DelegateClass->#{@_dc_obj.inspect}>"
+ end
+ end
return klass
end実際にはちゃんとインスタンスが返ってた。でも inspect まで丸投げしてるのでそれがわからなかった。inspect をそのまま委譲するのは正しいとは思えない。inspect が信用できなくなる。
require "delegate"
p Class.new(DelegateClass(Object)).allocate
#=> before: nil
#=> after: #<#<Class:0x1ef50>:0xe6b48d:DelegateClass->nil>location_of... がエラーでるのはこれとはまた別の問題……ここまで気付くのに数時間かかった……
なんとなく Tempfile の親戚だとおもって /tmp/hoge.9999.1 とかかえすとおもったら、たんに /tmp とか返すだけだった。
で、そういうディレクトリが欲しいときって自分で $$ とか書かないといけなくて嫌なんだけど、Tempfile はファイルを作って返すので使えず残念な感じになってしまう。個人的には Pathname に一時的なパスをつくるメソッドがあればいいと思った。
require "tmpdir"
require "pathname"
class Pathname
@@tempname_number = 0
def self.tempname(base=$0, dir=Dir.tmpdir)
@@tempname_number += 1
name = "#{dir}/#{File.basename(base)}.#{$$}.#{@@tempname_number}"
path = new(name)
at_exit do
path.rmtree if path.exist?
end
path
end
end
# ファイル
Pathname.tempname.open("w") do |f|
f << "aaaaa"
end
# ディレクトリ
path = Pathname.tempname
path.mkpath
10.times do |i|
(path+"test#{i}.rb").open("w") {|f| f << "test" }
endこんな感じのやつがほしい。特別ファイルをつくったりせず (Pathname なら作るの簡単だし)、ファイルでもディレクトリでもつかえる。
at_exit とファイナライザだと at_exit のほうが簡単な気がするけど、なんか問題あるのかな。デーモンだとたくさんできすぎるからかな。
そういえば、Pathname#mkpath が nil を返すけど、self を返してほしいと思うなぁ。
dir = Pathname.tempname.mkpathみたいに書けると幸せ