2010年5月28日金曜日

key chord

Emacsにはキーバインドが不足している。私は矢印キーなどを使う軟弱者なので、幸いC-[bfpn]は開いているが、でも足りない。例えば、replace-stringやreplace-regexpは割と使用頻度が高いが、さてこれをどこに割り当てたものか。あと、1ストロークで実行したいものもたくさんある。
そんな時はkey-chordというelispを使えばいいらしい。(http://www.emacswiki.org/cgi-bin/wiki/download/key-chord.el

;; key-chord
(require 'key-chord)
(key-chord-mode 1)
(setq key-chord-two-keys-delay 0.05)

;; key setting
(key-chord-define-global "gl" 'goto-line)
(key-chord-define-global "as" 'auto-save-buffers-toggle)
(key-chord-define-global "re" 'replace-string)
(key-chord-define-global "zx" 'undo)

key-chord-define-global は、第一引数で指定された文字全てが同時に(key-chord-two-keys-delay秒以内の誤差で)押されたら、関数がコールされるというもの。

例えば、指定行に行きたいときにはgoto-line(M-g g)を使うが、これがgとl同時押しでよいのだ。同じ要領で、reでreplace-stringも使えるようにした。これこそ、私にしてみればワンストロークでやりたかったことだった。
今回は頭文字をとってキーバインドを適当に決めたが、実際にはおしやすさが重要。中途半端に離れているととても打ちづらい。なので、実は現実的な割当数は思ったよりは少ないが、それでも大変な数のキーバインドを手にいれることが出来る。

key-chord.elにはcopyright 2003とか書いてあった。こういうelispを知る度に、一週間くらいずっと拡張ばっかりする時間が欲しいと思うのだが、結局そんな時間は取れた試しが無い。まだ数日しか使っていないが、手放せないelispになりそうだ。

なお、ターミナルではキルリングとクリップボードの共有(とりあえずMac)をやっておかないと、クリップボードから貼りつけると、いろんなキーがほぼ同時に押されたことになって大変なことになるので注意。

キルリングとクリップボードの共有(とりあえずMac)

emacsは独自のキルリングを使っているので、emacsで C-w などでコピーしたところで、例えばFirefoxにそれを貼り付けることはできない。
回避策として、ターミナルなら、それのコピー機能を使用することで、外部アプリケーションに張り付けられる。逆に、クリップボードの文字列も同様の方法でemacsに貼り付けることが出来る。
しかしこれには致命的な欠点があり:
  • 見えたままクリップボードに入るので、ウィンドウ分割していると上手くコピーできない
  • クリップボードからペーストすると、一文字ずつ打ったことになるので、重いしインデントが勝手につく
と、スマートとはいえない状態だ。GUIから起動すると、メニューからコピーなどができるようになっているが、Screenバンザイなのでそちらに行こうとは思えなかった。

そこで、以下のようなelispを、.emacsに書き加えた。(ソース:http://blog.lathi.net/articles/2007/11/07/sharing-the-mac-clipboard-with-emacs
; http://blog.lathi.net/articles/2007/11/07/sharing-the-mac-clipboard-with-emacs
(defun copy-from-osx ()
(shell-command-to-string "pbpaste"))

(defun paste-to-osx (text &optional push)
(let ((process-connection-type nil))
(let ((proc (start-process "pbcopy" "*Messages*" "pbcopy")))
(process-send-string proc text)
(process-send-eof proc))))

(setq interprogram-cut-function 'paste-to-osx)
(setq interprogram-paste-function 'copy-from-osx)
これでシェアされる。ただしMac限定。
仕組みは簡単で、macのコマンドpbcopyとpbpasteを利用しているだけだ。コマンドの名前があまりにも自明なのであえて説明はしない。
要するに、linux, windowsでも同様のコマンドがあれば、コマンド名の書換だけで使用できるようになる。現在度重なる不幸によって(笑)自分用のubuntu開発機を持っていないので、Linuxでの対応はまたその時にしたいと思うが、少し調べたら同様のコマンドはあるみたいだし、GTKを使えば数行のコードで実現出来るはずだ。

2010年5月18日火曜日

まだまだやりたい事は出来ていない・・・

先日、mikutterの着想から半年が経っていたことに気がついた。途中なんども開発を停止しているし、別のこともいろいろとやっていたので本当に半年やっていたわけではないが、結構経ってしまった。
実際には、CHIを書き始めたのは10月であり、今まで何をしていたんだ、と落胆しそうになったが、とりあえずこれだけの機能がつけられた。
  • ホームタイムライン
  • リプライタイムライン
  • 検索
  • saved search
  • 通知
  • URL短縮
  • リプライ元つぶやきの表示
  • リプライ
  • リツイート
  • 公式リツイート
  • お気に入り
と、非常に少ない。亀進行である。未だにプロトタイプのレベルを出ていない。
主観だが、以下の機能が「普通のクライアント」を名乗るためには足りないのではないだろうか。
  • ダイレクトメッセージ
  • お気に入りに入れたつぶやきのタイムライン
  • スマートリスト(フィルタ)
逆に、現時点では以下の機能が普通のクライアントを上回っていると考えている
  • twitter.comからつぶやきを検索出来る
  • ハッシュタグの内容をmikutterから閲覧出来る
  • Webで保存した検索をタブに表示できる
  • あるつぶやきのリプライ元をノークリックで見ることが出来る
特に検索関係は強い。とりあえずだが自動更新も有り、少し改良すればtsudaる用途にもいい線を行くのではないだろうか。
つぶやきのリプライ元表示は良いアイデアで、構想段階からすでにあった。単純に、フォントを変えて下にリプライ元を表示しているだけだが、これだけでタイムラインの見た目はぐっと変わり、一番の長所といっていい。が、こんなものは簡単にパクられる。
# つぶやきの表示にリストビューを使っちゃった人たちには簡単にはパクれないかもしれない

では、構想段階ではどのようなことを考えていたのか、再び挙げてみたい。これは、12月の時点で既に欲しいと思っていた機能だ(既に実現したものは外している)

  • ダイレクトメッセージ
  • お気に入り
  • ふぁぼられ
  • 特定のつぶやきだけをまとめたリスト(Togetterのようなイメージ)
  • 公式リストへの完全対応
  • フォローしている人一覧
  • フォロワー一覧
  • 特定の人のプロフィール確認
  • 自分のプロフィールの編集
  • フォロー・リムーブ・ブロック・ミュート・マーク
  • スマートリスト
  • つぶやきの永久保存及び検索
  • 画像アップロード
  • 画像インライン表示(少なくともブラウザを介さない)
  • Twitlongerを利用したつぶやきの短縮
  • スレッド
Togetterのようなものだが、これは今はどうかな、と思っている。使いたいケースがあまり思いつかないからだ。何故欲しいと思ったんだろう(とはいえ、この程度のことはプラグインで出来るので、後で作ってもいいかも)。
ミュート、マークはオリジナルの概念だ。ミュートは、フォローしているにも関わらず特定の人のつぶやきを一切ホームタイムラインに表示させない。逆にマークは、フォローしていないにもかかわらず特定の人のつぶやきをホームタイムラインに表示させる。相手に知られること無く、フォロー/リムーブができる。幾つかのクライアントソフトには、既に実装されている。
ミュート、マークはスマートリストで実現可能かもしれない。スマートリストは、簡単なフィルタ言語等でつぶやきを絞り込んで表示するタブで、フィルタ言語にはHatsuneLispを検討している。スマートリストは、ホームタイムラインやリプライタイムラインを実現可能なので、これ一つで大抵のことをしてしまう時がくるかもしれない。
つぶやきの永久保存及び検索は、MySQLとSQLiteを用いて実装したが、万人受けするものではない割にライブラリ等の依存関係がややこしいので配布には至っていない。
最後のスレッドとは、つぶやきの親子関係を再帰的に辿り、一連の会話のツリーを構成するるぶやきをタイムラインに並べる機能。これがあれば、つぶやきを一つ拾えば会話全体が見えるようになり、革新的な機能となるだろう。

かなり盛りだくさんに見えるかもしれないが、これくらいないと使い物にならないと考えている。mikutterは、現在のTwitterクライアントに対する問題提起なのだ。作り始めたきっかけが「良いクライアントがない」という現状をなんとかするため、だったからだ。

こうしてみると、やりたい事の半分以下も出来ていないように見える。しかし、拡張可能な基板は整いつつあり、現在はつぶやきの保存方法すらプラグインで拡張出来るようになっている。つぶやきを投稿したら1秒くらいでフォロワー全員のところに届くのが当たり前の時代もついにすぐそこまで来ているし、半年後は今では想像もできない使い方をしているだろう。
# ハッシュタグとか、去年は公式サポートなかったんじゃなかったっけ・・・あと公式リツイート?検索っていつついたっけ?
とにかく・・・Twitterが本気を出す頃には、Twitterをちゃんと使えるクライアントにしておきたい。