新しいプラグインの仕組みを考える
Reported by jugyo | January 12th, 2009 @ 10:45 PM
今のプラグインの仕組みは若干柔軟性に欠ける部分があると思うので改善したい。 あと、プラグインの定義をもうちょっとわかりやすく書けるようにしたい。
現在 new_plugin_system というブランチにて開発中〜。
Comments and changes to this ticket
-
jugyo January 12th, 2009 @ 10:52 PM
以下のような感じでコマンドを定義できるようにしようかなーと思ってます。
command = Command.new( :names => ['update', 'u'], :pattern => /^(update|u)\s+(.*)/, :exec => proc {|match| # exec command }, :completion => proc {|input| # return array of candidates }, :help => 'test command' )
-
jugyo January 13th, 2009 @ 12:22 PM
新しいコマンドの定義方法ですが、いろいろ考えた結果、以下のような感じになりそうです。
コマンドの定義方法はこんな感じです。
Termtter.Client.add_command( Termtter::Command.new( :name => :update, :exec_proc => proc{|arg| twitter.post(arg)} ) )
もしくは以下のようにして、必要なデータを渡してTermtter::Client 側で Command を new するようにしてもいいかもしれません(こっちのほうがよさそうだな)。追記: このやりかたでもいけるようになりました!
Termtter.Client.add_command( :name => :update, :exec_proc => proc{|arg| twitter.post(arg)} )
今の add_command との大きな違いは、コマンドの処理を行う proc が受け取る引数です。 上の例の「:exec => proc{ ... }」として指定しているのがそれで、arg にはコマンドの後ろにくっついている文字列がそのまま渡されます。 現状の MatchData を受け取るやりかたよりもこっちのほうが楽な気がしてます。
あと、前みいに add_completion しなくても基本的な補完はできるようになっています。
Termtter::Command のコンストラクタには、help や alias、completion なども引数として渡せます。
Termtter::Command.new( :name => :update, :exec_proc => proc{|arg| twitter.post(arg)} :aliases => ['u'] :help => ['update,u TEXT', 'update your status'] :completion_proc => proc {|command, arg| ... } )
既存のコマンドの動作を変更するのも簡単にできます。 以下のような感じで。
Termtter::Client.get_command(:update).exec_proc = proc { |arg| twitter.update(arg + '!') }
-
mattn January 14th, 2009 @ 09:02 AM
ただ、これまでの様に正規表現で書かれている処理のメリットはあったかと思います。 例えば、同じコマンドでも引数があるか無いかで呼び出しを変えたり等...
-
jugyo January 14th, 2009 @ 10:05 AM
それは確かにそうで、悩んだ所ではあるんですよねー。 ま、でも、複数の引数を取るコマンドってそんなにないかなーというのと、 できるだけ簡単にコマンドを追加できるようにしたかったのでこんな感じになりました。 Command オブジェクトのメソッドを再定義するかたちで同様のことはできそうな気がしてるので、調べてみます。
追記
exec_if_match というメソッドを再定義することで、 引数に応じて呼び出す処理を変えるということが一応可能になります。
さらに追記: 当初予定していた実装とは若干変わってきてしまったので、下記のコードは現在はうまく機能しません。現在別の方法を検討中。
command = Termtter::Command.new(:name => :update) class << command def exec_if_match(input) case input when /^update\s+foo\s*(.*)/ foo($1) when /^update\s+bar\s*(.*)/ bar($1) end end def foo(arg) ... end def bar(arg) ... end end
どうですかね?
-
jugyo January 24th, 2009 @ 09:43 PM
- Tag set to enhancement
- State changed from new to resolved
- Assigned user set to jugyo
ちょっとタスクの粒度が大きすぎるので、もうちょっと細分化することにして、このタスクはクローズします。 とりあえずコマンドの登録に関しての諸々は決まったということで。
Please Sign in or create a free account to add a new ticket.
With your very own profile, you can contribute to projects, track your activity, watch tickets, receive and update tickets through your email and much more.
Create your profile
Help contribute to this project by taking a few moments to create your personal profile. Create your profile »
Termtter is a terminal based Twitter client
People watching this ticket
- Nobody is watching this ticket.