Hatena::ブログ(Diary)

Learning to be Me

2009-01-05

[]termtterで補完 17:57

list ユーザ名 とか、uri-open ってうつのがめんどくさいので、補完できるようにした。

require 'set'

class Termtter::Client

  public_storage[:users] ||= Set.new

  add_hook do |statuses, event, t|
    if !statuses.empty?
      case event
      when :update_friends_timeline, :replies, :list_user_timeline
        statuses.each do |s|
          public_storage[:users].add(s.user_screen_name)
          s.text.scan(/@[a-zA-Z_0-9]*/).each do |u| # reply
            public_storage[:users].add(u.gsub("@","")) unless u == "@"
          end
        end
      end
    end
  end

end

module Termtter
  module InputCompletor

    Commands = %w[exit help list pause update resume replies search show uri-open]

    CompletionProc = proc {|input|
      case input
      when /^l(ist)? +(.*)/
        username = $2
        if username.empty?
          Termtter::Client.public_storage[:users].to_a
        else
          Termtter::Client.public_storage[:users].to_a.
            grep(/^#{Regexp.quote username}/).map{|u| "list #{u}"}
        end
      when /^uri-open +(.*)/
        uri_open_com = $1
        if uri_open_com.empty?
          %w[clear list]
        else
          %w[clear list].
            grep(/^#{Regexp.quote uri_open_com}/).map{|c| "uri-open #{c}"}
        end
      else
        Commands.grep(/^#{Regexp.quote input}/)
      end
    }

  end
end

Readline.basic_word_break_characters= "\t\n\"\\'`><=;|&{("
Readline.completion_proc = Termtter::InputCompletor::CompletionProc

これを適当に保存して、.termtter から require すれば、補完できるようになる。

たとえば、

f:id:bubbles:20090105174916p:image

list ってうってタブ押すと、

f:id:bubbles:20090105174915p:image

ユーザ名が出てくるし、

f:id:bubbles:20090105174911p:image

そこで、適当にいれてタブ押すと

f:id:bubbles:20090105174910p:image

こんな感じで補完できる。

コマンドに関しても同様で

f:id:bubbles:20090105174909p:image

urまでうってタブ押せば、

f:id:bubbles:20090105174908p:image

こんな感じに補完される。

jugyojugyo 2009/01/05 18:03 おお!これは素晴らしいですね。
本体に取り込ませてもらっていいですか?

bubblesbubbles 2009/01/05 18:07 是非お願いします!

jugyojugyo 2009/01/05 18:52 本体に取り込みましたー。
require 'termtter/completion' すれば有効になります。

デフォルトで無効にしてるんですが、すごく便利な機能なので、
コマンド追加関連の処理をもうちょっと改良してから標準機能に(デフォルトで有効に)するつもりです。

ujihisaujihisa 2009/01/05 19:01 本体のコミットログみてここに飛んできました。
補完機能つけたいと思いつつもどうすればいいかなあと思っていたのです。ありがとうございます!
uで@をつけるときなども補完されてほしいので、そのあたり修正してコミットしてみたいなと思います。

ujihisaujihisa 2009/01/05 19:47 早速uにも対応させて、
http://github.com/jugyo/termtter/commit/9e936441ab0ef0f7c326c1e1bff3bf0e394f5d8b
ついでに整理してみました
http://github.com/jugyo/termtter/commit/d5238f2e8f42b1050a05035f70ec04bc562e1f61

bubblesbubbles 2009/01/05 20:17 >jugyo さん
ありがとうございます。
コマンドのリストどうやってとればいいかわかんなかったんで、直で書いてしまいました。
termtterすごい便利に使わせてもらってます。

>ujihisa さん
自分が@をあんまり使ってないんで、そこまで気がついてなかったです。
ありがとうございます。

トラックバック - http://d.hatena.ne.jp/bubbles/20090105/1231145823