Termtterのプロンプトに関するアイディア

というほど大それたものではないのですが……。

Termtterのプロンプトは、コマンドを入力するとき以外は、出ていなくてもいいんじゃないかな、と思ったのが出発点です。
必要なときは、たとえば":"キーなどを入力すると、タイムラインの流れを止めてプロンプトが現れます。コマンドを入力し終わったら、ふたたびタイムラインが流れます。
「日本語入力中にタイムラインが流れて……」というトラブルを避けることができるでしょう。

ショートカット

しかし、上記のような動作をする場合、":"キーのぶん打鍵数が増えるのが業腹ですね(?)。
そこで、よく使うコマンドは、一発で呼び出せるようにするとよいのではないでしょうか。
たとえば、"u"キーを押すと

update >

というようなプロンプトが現れて、いきなりポストする内容を入力する、というようなものです。

さらに、引数をとらないコマンド("exit", "help", etc...)などは、プロンプトを呼ばずに、そのまま実行してしまうのもよさそうです。

とりあえず

百聞は一見になんとやら、上記のような動作をざっくりと実装してみたので、おひまな方は試してみてください。

ktgy's termtter at master - GitHub

動作については、ruby 1.8.7-p174 + Terminal.app + screenという環境で確認をしています。iTermでも大丈夫でした。

デフォルトでは、以下のような設定になっています。

ショートカット・プロンプト
キー コマンド
: なし
d direct
D delete
f fib
F favorite
l list
o open
p profile
R reply
s search
t retweet
u update

プロンプトを呼んだ後、なにもせずプロンプトから抜けるには、"Control + d"です。

ショートカット・プロンプトの実体は、"curry"コマンドを呼んでからプロンプトを呼んでいる、というだけです。そのため、通常の"curry"コマンドが使えなくなっています(プロンプトからコマンド実行後、必ず"uncurry"されるため)。

ダイレクト・コマンド
キー コマンド
c clear
L ラインを引く
q quit
r replies
? help
Esc screenのcopyモードを呼ぶ(screen上での動作を想定)

問題点

  • たぶんWindowsでは動きません
    • Win32APIを使えば可能?
  • プロンプトが出ないぶん、動作が分かりづらいかも
    • 起動時に、簡易ヘルプのようなものを表示するとか?
  • ショートカット・プロンプトでは、タブ補完がうまくいきません

replaceプラグイン

ということで、replaceプラグインを書いてみました。

つかいかた

(01:23:45) $aa ktgy: 児童販売機でコーラ買ってきた。

自分の最新tweetが、上記のようなものであった場合、

> replace /児童/自動/

とすることで、$aa のポストを削除し、"自動販売機でコーラ買ってきた。"と改めてポストします。また、

> replace /児童/自動/g

とすることで、最新tweetの中の、全ての「児童」を「自動」に、

> replace /twitter/Twitter/ig

とすれば、「twitter」でも「TWITTER」でも、まとめて「Twitter」にreplaceして、ポストしなおします。

twitterのタイムラインを読み上げる、saykanjiプラグインを書いてみた

saykanjiコマンドがおもしろそうだったので、termtterのsayプラグインを下敷きに、saykanjiプラグインとして仕立ててみました。

saykanji.rb

とりあえず、Mac OS Xにのみ対応していますが、ちょっと手をいれれば、他のOSへの対応もできそうな気もします。

下準備

SayKanaコマンドMeCabが必要です。
SayKanaはzipアーカイブをダウンロードして展開、pkgファイルからインストールしてください。
MeCabはソースからインストールする場合はMecabのサイトを参考に、MacPorts経由でのインストールは、以下のような感じでいけると思います。

% sudo port install mecab +utf8

いずれの場合も、UTF-8をあつかえるようにインストールしてください。

使い方、設定など

とりあえず、"~/.termtter/config"で"t.plug 'saykanji'"すれば、タイムラインを読み上げてくれると思います。

### 設定例

# 読み上げスピード。値が大きいほど、スピードが速くなります。
# 100が標準で、50から300までの値をとれます。
config.plugins.saykanji.say_speed = '200'

# 指定したユーザを読み上げます。
config.plugins.saykanji.user_to_say = ['p2pquake', 'jihou']
# キーワードを含む投稿を読み上げます。
config.plugins.saykanji.keyword_to_say = ['地震', /^@user_name/]
# ユーザ名、キーワードをいずれも設定しなかった場合、すべての投稿を読み上げます。

英語の読み上げ

SayKanaは、英語の読み上げができません。ですから、以下のような形式の辞書を用意することで、対応します。

"あっと","@"
"ついったー","twitter"
"たんぶらー","tumblr"
"ふりっかー","flickr"

辞書は"~/.termtter/tmp/"の中に、"kana_english_dict.csv"という名前で保存してください。文字コードUTF-8です。
NADの部屋2。にて配布されている、NADのカタカナ英語辞書10.6に同梱されている、「NADカタカナ語10.6.txt」を流用することもできます(参考:バイリンガルなsaykanjiにしておく - ザリガニが見ていた...。)。その際は、文字コードUTF-8に変換することを忘れないでください。

英語の読み上げは単語単位ですので、

"ついったったー","twitter user"

などとしても、読み上げてはくれません。
また、ポスト中のユーザIDなども読み上げることができます。たとえば"@yamadaichirou"さんのIDを読み上げるなら

"やまだいちろう","yamadaichirou"

などとします(@は含めないでください)。
ただし、"@yamada_ichirou"さんのように、IDに_(アンダーバー)を含む場合、その部分は単語の区切りと認識されてしまうので

"やまだ","yamada"
"いちろう","ichirou"

というような形で、対応してください。

感想

漢字の読み違いなどはあるものの、思っていた以上にちゃんと読んでくれるので、楽しいですね。
とはいえ、のべつまくなしに喋らせるとちょっとうるさいので、実用性を考えるなら、アラート的な使い方がよいでしょうか。

どうでもいいことですが、ぼくがはじめてタイムラインの読み上げをさせたとき、いきなり「ちんちんがいたい」なんてしゃべりはじめて、どうしてくれようかと思いました。twitterは、おそろしいところです。

MeCabについては、Rubyバインディングが用意されているので、そちらを使うのが本当かもしれません。でも、ちょっと面倒そうだったのと、よみがなを得るためだけにそこまでしなくても、ということで今回は使いませんでした。

typable_idプラグインを書いてみた

termtterは大変に便利なのですが、IDを直接指定するタイプのコマンドの入力が面倒だったので、それを補助するプラグインを書いてみました。これは、tig.rbの機能をまねして作ったものです。
typable_id.rb from ktgy's termtter-plugins - GitHub

これはなに?

termtterのタイムラインのstatusごとに、簡単な仮IDを付与してあげることにより、仮IDを入力するだけでstatusを指定できるようにするものです。当初は、completion_procで補完のために使うことを想定していたのですが、typable_id自体がステータスを持つようにしたため、statusに対して何かしたい場合にも使えるようになりました。
ただし、あくまで仮IDですので、流速がはやい場合などは数分で上書きされてしまいます。ですから、「目の前のstatusをサッと指定したい」という目的のみに割り切って使うのがよいでしょう。
デフォルトの仮IDは、規則性や打鍵数の少なさから、訓令式のローマ字にしてみました。カスタマイズできますので、自分の「手クセ」に合ったものにしたり、仮IDの保持数を変えたりできます。

どうつかうの?

このプラグインは単体では何の役にもたちません。このプラグインと連携するコマンドを用意して、はじめて効果を発揮します。

とりあえず、typable_id.rbを"~/.termtter/plugins"に入れて、~/.termtter/configに

config.plugins.stdout.timeline_format = '<90><%=time%></90> <<%=status_color%>><%=status%></<%=status_color%>> <90><%=id%>[<%=Termtter::Client.typable_id_convert(id)%>]</90>'
plugin 'typable_id'

と記述すると、タイムラインが以下のように表示されるとおもいます。

(12:34:56) screen_name: ここに投稿内容が 1234567890[ka]

末尾の[ka]がこの投稿の仮IDです。たとえば、

> command ka

と入力してやると、1234567890というIDのstatusに対してcommandが実行される、というようなイメージです。
また、

> command ka

と入力したところで[Tab]を押下することにより

> command 1234567890

に補完されるという使いかたも、termtterらしくていいですね(上にも書きましたが、最初はこういう使いかたを想定して作りはじめました)。

サンプル

これだけではしょうがないで、サンプルとしてstatusに含まれるurlを開くプラグインを書いてみました。

typable_idと連携するopen_urlプラグインを書いてみた

typable_idでstatusを指定して、そのstatusに含まれるURLを開く、というプラグインです。"open_uri"メソッドはuri-openプラグインからそのままコピーしたので、Debian環境でのバグもそのまま引き継いでしまっているとおもいます(手元に環境がないので、テストできていません)。
また、typable_idプラグインがないと動作しません。*1依存関係など、ちゃんと処理するべきだとおもうのですが、うまいやりかたがおもいつきませんでした。

open_url.rb from ktgy's termtter-plugins - GitHub

つかいかた

(12:34:56) screen_name: http://www.google.com 1234567890[ka]

上記のような投稿があったとして、

> open_url ka

で、http://www.google.comが開きます。また、

> open_url ka

と入力して[Tab]を押下すると

> open_url 1234567890

に展開します。そのまま[Return]で、やっぱりhttp://www.google.comが開きます。

*1:追記:typable_idがなくても動くようにしました

retweetプラグインを書いてみた

クライアントの違いや文化の違いなどもあってか、ReTweetを積極的に行う日本人ユーザは少なかった印象がありましたが、最近わりとみかけるような気がします。
ということで、retweetプラグインです。
retweet.rb ktgy's termtter-plugins - GitHub

基本フォーマットは、わりと一般的だとおもわれる、"RT @screen_name: text"という形にしてみました。もちろん、好きなようにカスタマイズすることができます。

つかいかた

(12:34:56) screen_name: ほげほげふがふが 1234567890[ka]

typable_idにも対応しておりますので、上記のような投稿をReTweetしたい場合は

> retweet ka

もしくは

> retweet 1234567890

で行えます。
また、そのユーザの最新の発言であれば、

> retweet @screen_name

でもReTweetできます。

補完について

このプラグインは、typable_idを補完する際に、変な動作をします。

> retweet ka

まで入力して[Tab]を押下すると、

> u RT @screen_name:ほげほげふがふが

という形に展開します。
この動作は直感的ではありませんが、コマンドの性質上事前の確認、または編集(retweetが連鎖して長大になった場合など)ができるのも悪くないと思い、やってみました。

gitをインストールしてみた。

せっかくコードを書くようになったので、バージョン管理システムを使ってみることにしました。
ひとくちにバージョン管理といってもいろいろありますが、最近はあちらこちらでgitおよびgithubの話題をみかけるというのもあって、gitにしてみました。「はやりモノ」というのは、情報が手にはいりやすい、という利点もありますね。

ということで、今回はこちらの記事を参考にさせていただきました。
はじめてのgithub - blog.katsuma.tv
以下はリンク先の記事をなぞったものなので、「これからgitをインストールしよう」という方は、リンク先の記事をご覧になることをおすすめします。

インストール

% sudo port -d install git-core

MacPortsが入っていれば、まずはこれだけで入ります。
variants各種は、必要になったらあらためて入れてみることにします。

とりあえず、

% git version

してみて、

git version 1.6.2.2

と表示されたので、大丈夫のようですね。

忘れないうちに、nameとemailを登録しておきます。

% git config --global user.name "ktgy"
% git config --global user.email ktgy1016@gmail.com

githubの登録

せっかくgitをつかうのですから、githubにも登録しましょう。
先に、Gravatarへの登録(アイコン画像がほしい場合)と、SSH鍵の作成(まだ作っていない場合)を済ませておいたほうがスムーズかもしれません。

SSH鍵は

% ssh-keygen

で作成して、

% cat ~/.ssh/id_rsa.pub|pbcopy

とすることで、公開鍵をクリップボードにコピーできます。

githubの登録は、Freeのプランにしました。

ktgy's Profile - GitHub

レポジトリの作成

ぼくが書いたコードは、このBlogで公開したものくらいなので、それをまとめたレポジトリを作ってみました。*1

githubからの公開レポジトリの作成はこちらから。
"termtter-plugins"という名前で作ってみます。

すると、その後にするべき作業が提示されるため、それに従って作業します。
"~/git"というディレクトリを作って、その中にローカルレポジトリを作る、という形にしてみます。

% mkdir -p ~/git/termtter-plugins
% cd ~/git/termtter-plugins
% git init

としたうえで、"~/git/termtter-plugins"内に管理したいファイル置きます。そして、

% git add *
% git commit -m 'first commit'
% git remote add origin git@github.com:ktgy/termtter-plugins.git
% git push origin master

で、こうなりました。
ktgy's termtter-plugins at master - GitHub

ひとまず今回はここまで。

*1:これらは、termtter本体をforkして、それにcommitする形にするのがよいのでしょうか? そのあたりは、またおいおい