xfumbleとは
概要
xfumbleは、UNIX系OS(Linux等)のデスクトップ(X Window Systemを使用するもの)の使い勝手を、お好みに合わせて、少し良くするためのツールです。
つまり、X Window Systemにおける、キーバインドリコンフィギュレーションツール、その他もろもろ、です。
xfumbleを使えば、カーソルキーやファンクションキーに指を伸ばさなくてもよくなったり、キーボードとマウスを手が行ったり来たりするのを減らしたりできます。
もともと作者は、emacsというテキストエディタを使っておりましたが、このエディタのカーソル移動は、上移動だったらCtrl-p(Ctrlキーを押しながらp)、下移動だったらCtrl-n、ということになっておりました。これに指が慣れているので、emacs以外のアプリでも、ついつい、上移動をするのに Ctrl-pを押してしまい、そうするとたいていのアプリでは、「印刷」ってことになる(pはprintのp)から、とてもイライラしました。「emacs以外のアプリでは、ctrl-pはキーボードのカーソル上移動キーを押したのと同じこと」なんてことが、簡単に設定できる、そんなアプリが、作者には必須のアプリです。MS WindowsにはAutoHotkeyという名前のアプリがあったので、ずいぶんそれを使わせてもらっておりましたが、今使っている Linux(UNIX系OSのX Window環境)では、そういうのが、なかなか無い。それで、自分で作ることにしました。
つまり、X Window Systemにおける、キーバインドリコンフィギュレーションツール、その他もろもろ、です。
xfumbleを使えば、カーソルキーやファンクションキーに指を伸ばさなくてもよくなったり、キーボードとマウスを手が行ったり来たりするのを減らしたりできます。
もともと作者は、emacsというテキストエディタを使っておりましたが、このエディタのカーソル移動は、上移動だったらCtrl-p(Ctrlキーを押しながらp)、下移動だったらCtrl-n、ということになっておりました。これに指が慣れているので、emacs以外のアプリでも、ついつい、上移動をするのに Ctrl-pを押してしまい、そうするとたいていのアプリでは、「印刷」ってことになる(pはprintのp)から、とてもイライラしました。「emacs以外のアプリでは、ctrl-pはキーボードのカーソル上移動キーを押したのと同じこと」なんてことが、簡単に設定できる、そんなアプリが、作者には必須のアプリです。MS WindowsにはAutoHotkeyという名前のアプリがあったので、ずいぶんそれを使わせてもらっておりましたが、今使っている Linux(UNIX系OSのX Window環境)では、そういうのが、なかなか無い。それで、自分で作ることにしました。
動作環境
UNIX系OS(Linux等)で、X Window Systemが動作するデスクトップ...
の、はずなんですが、バージョンの違いにより、動かない環境もあるようです。
一応、下記の環境で、動作確認を行っております。
Fedora8
Fedora10
Ubuntu8.10
Ubuntu9.04
Ubuntu9.10
Ubuntu10.04
また、少なくとも、Ruby、およびruby/GTK2の動作環境(Feroraなら、ruby-gtk2)が必要です。
の、はずなんですが、バージョンの違いにより、動かない環境もあるようです。
一応、下記の環境で、動作確認を行っております。
Fedora8
Fedora10
Ubuntu8.10
Ubuntu9.04
Ubuntu9.10
Ubuntu10.04
また、少なくとも、Ruby、およびruby/GTK2の動作環境(Feroraなら、ruby-gtk2)が必要です。
xfumbleの目指しているところ
MS Windowsには、この手の、キーバインドリコンフィギュレーションツールが、既にたくさんあります。
それらは、大別して、二つのタイプに分かれると思います
(1)ある、特定のアプリケーションのキーバインド(emacsとか、viとか)に特化した、キーバインドを提供するツール。
例えば、emacsだったら、野口さんのkeymacsとか、それの機能拡張版である、OishiさんのXkeymacsなど。
viだったら、easterさんのkeViなど。
(2)アプリケーションに依存しない、汎用的なキーバインド設定ツール。
例えば、作者も愛用していた、ChrisさんのAutoHotkey、あるいは、TAGAさんの窓使いの憂鬱など。
上記のアプリは、みな素晴らしい力作だと思いますが、それぞれ、下記のような長所と短所があると思います。
(1)のアプリは、特定のアプリのキーバインドに特化しているため、そのアプリに特化したキーバインドを求める人には最適。しかし、「基本はemacsなんだけど、自分でキーバインドを替えまくってて、もはや原型はとどめてない」なんて人には、ちょっと使えません。
例えばオイラ。xfumbleの作者は、emacsから入ったんだけど、Ctrl-fとかbとかでカーソル右と左というのが、指がつりそうになったので、Ctrl-lとkに替えました(ATOKの文節拡大縮小がこのキーで、気に入ってたんです)。それから、「行末にジャンプ」は、Ctrl-x Ctrl-lとか、もう、メチャクチャ。作者は、もはや普通のemacsは使えない(笑)。
(2)のアプリは、特定のアプリのキーバインドに依存していないため、どんなキーバインドも作れるのが魅力。しかしそのために、キーバインドのルールを記述する、特殊なプログラミング言語を学習しなければならないので、それが大変。
オイラはヲタクだから、AutoHotkeyのプログラミングにゾッコン惚れて、いろんなアプリを作ったもんです。なまずIMEとか。作者が欧米人で日本語対応してなかったので、AutoHotkey用日本語処理ライブラリとかも作ったんだぜ。
でも、そういうのはプログラミングヲタだからこそ、楽しいと感じるわけで、そうでない人にとってみたら、敷居が高いこと、この上ない。
ということで、xfumbleを作るにあたって、上記の(1)と(2)の真ん中を狙うようなアプリにしたいなぁ、と、思いました。すなわち、
(A)アプリケーションに依存しない、自由なキーバインドルールが作成できる。
(B)上記が、プログラムレス、例えば、メールソフトで、「受信メールのフォルダへの振り分け」ルールを指定する、あれをもうちょっと難しくしたくらいで、実現できる。
といったあたりを目指して開発をしています。
そのために、xfumbleでは、キーバインドのために必要な「機能」(ブロックって呼んでる)を提供し、それを使用者が、好みに応じて組み合わせることで、ルールを作成する、というスタイルを取っています。
例えば、xfumbleは、サンプルで、vi風のキーバインドのルールを提供していますが、これは、ブロックを、XMLの論理記述で、組み合わせたものです。viのためにプログラムを書いたのではありません。
viの動作は標準(コマンド)モードがあったり、挿入モードがあったり、visualモードがあったりと、結構複雑ですが、これらも、XMLの論理記述のみで、実現しています。
当然、emacs風のキーバインドのルールも、ブロックを組み合わせたものです。
emacsで使う「キーマクロ」機能も、xfumbleでは、「ブロック」で提供しています。その同じ「ブロック」を、viのルールの中で使って、viにおける「ピリオドによる繰り返し」の機能を実現してます。
もちろん、プログラム記述が、XML記述に置き換わっただけで、普通の人にとって、敷居が低くなる、わけではありません。
XMLで記述できる程度に、カスタマイズのルールを単純化することで、XML記述を、GUIアプリで実現し、XMLなんか知らなくっても、GUIで、自分好みのルールを作成できるようにすること。ここが、狙いです。
※現在(2010/6/14)のところ、残念ながら、上記のGUIアプリは、完成しておりません。つまり、ルール作成、つまりブロックの組み合わせには、XMLファイルを記述しなければなりません。しかし、いつか、この組み合わせを、GUIアプリで実現し、(B)の目標を達成したいと考えています。
それらは、大別して、二つのタイプに分かれると思います
(1)ある、特定のアプリケーションのキーバインド(emacsとか、viとか)に特化した、キーバインドを提供するツール。
例えば、emacsだったら、野口さんのkeymacsとか、それの機能拡張版である、OishiさんのXkeymacsなど。
viだったら、easterさんのkeViなど。
(2)アプリケーションに依存しない、汎用的なキーバインド設定ツール。
例えば、作者も愛用していた、ChrisさんのAutoHotkey、あるいは、TAGAさんの窓使いの憂鬱など。
上記のアプリは、みな素晴らしい力作だと思いますが、それぞれ、下記のような長所と短所があると思います。
(1)のアプリは、特定のアプリのキーバインドに特化しているため、そのアプリに特化したキーバインドを求める人には最適。しかし、「基本はemacsなんだけど、自分でキーバインドを替えまくってて、もはや原型はとどめてない」なんて人には、ちょっと使えません。
例えばオイラ。xfumbleの作者は、emacsから入ったんだけど、Ctrl-fとかbとかでカーソル右と左というのが、指がつりそうになったので、Ctrl-lとkに替えました(ATOKの文節拡大縮小がこのキーで、気に入ってたんです)。それから、「行末にジャンプ」は、Ctrl-x Ctrl-lとか、もう、メチャクチャ。作者は、もはや普通のemacsは使えない(笑)。
(2)のアプリは、特定のアプリのキーバインドに依存していないため、どんなキーバインドも作れるのが魅力。しかしそのために、キーバインドのルールを記述する、特殊なプログラミング言語を学習しなければならないので、それが大変。
オイラはヲタクだから、AutoHotkeyのプログラミングにゾッコン惚れて、いろんなアプリを作ったもんです。なまずIMEとか。作者が欧米人で日本語対応してなかったので、AutoHotkey用日本語処理ライブラリとかも作ったんだぜ。
でも、そういうのはプログラミングヲタだからこそ、楽しいと感じるわけで、そうでない人にとってみたら、敷居が高いこと、この上ない。
ということで、xfumbleを作るにあたって、上記の(1)と(2)の真ん中を狙うようなアプリにしたいなぁ、と、思いました。すなわち、
(A)アプリケーションに依存しない、自由なキーバインドルールが作成できる。
(B)上記が、プログラムレス、例えば、メールソフトで、「受信メールのフォルダへの振り分け」ルールを指定する、あれをもうちょっと難しくしたくらいで、実現できる。
といったあたりを目指して開発をしています。
そのために、xfumbleでは、キーバインドのために必要な「機能」(ブロックって呼んでる)を提供し、それを使用者が、好みに応じて組み合わせることで、ルールを作成する、というスタイルを取っています。
例えば、xfumbleは、サンプルで、vi風のキーバインドのルールを提供していますが、これは、ブロックを、XMLの論理記述で、組み合わせたものです。viのためにプログラムを書いたのではありません。
viの動作は標準(コマンド)モードがあったり、挿入モードがあったり、visualモードがあったりと、結構複雑ですが、これらも、XMLの論理記述のみで、実現しています。
当然、emacs風のキーバインドのルールも、ブロックを組み合わせたものです。
emacsで使う「キーマクロ」機能も、xfumbleでは、「ブロック」で提供しています。その同じ「ブロック」を、viのルールの中で使って、viにおける「ピリオドによる繰り返し」の機能を実現してます。
もちろん、プログラム記述が、XML記述に置き換わっただけで、普通の人にとって、敷居が低くなる、わけではありません。
XMLで記述できる程度に、カスタマイズのルールを単純化することで、XML記述を、GUIアプリで実現し、XMLなんか知らなくっても、GUIで、自分好みのルールを作成できるようにすること。ここが、狙いです。
※現在(2010/6/14)のところ、残念ながら、上記のGUIアプリは、完成しておりません。つまり、ルール作成、つまりブロックの組み合わせには、XMLファイルを記述しなければなりません。しかし、いつか、この組み合わせを、GUIアプリで実現し、(B)の目標を達成したいと考えています。
なぜ、xfumble(エックスファンブル)という名前?
"x"は、20年以上前からの、伝統的なX Windowアプリケーションの接頭文字。"xeyes"とか"xterm"とか、"x"が頭についたアプリは、やたらと存在します。最近の新しいアプリでは、こういう名前は少なくなったけど、基本部分は20年以上も仕様が変わっていない、優秀なX Windowシステムに敬意を表して、あえてレトロな命名にしてみたわけです。
"fumble"には、「ごそごそ手探りする」「下手な手つきでいじくり回す」といった意味があります。作者が作ってるのはまさにそんな感じで、キー入力やマウス入力をゴソゴソやって横取りし、普通のアプリケーションを「騙す」ことで、コンピュータデスクトップの使い勝手をよくしようというもの。立派な統合アプリ環境を開発して、さぁ、どうです?、と言うよりも、既存のアプリの使い勝手の向上や、既存のアプリ同士の連携を、「下手な手つきでいじくり回す」感じで、まぁ動けばいいじゃん、と実現するのが目的だから、"fumble"という単語は、割とピッタリではないか、と思っています。
さらに、"fumble"は、例えば、「野球でボールを取り損なう」なんて事にも使うように、あんまりいい意味の単語ではないようです。そういう言葉をあえて名前に使ってることが、逆に目立っていいかな?という、多少の色気もありました。
"fumble"には、「ごそごそ手探りする」「下手な手つきでいじくり回す」といった意味があります。作者が作ってるのはまさにそんな感じで、キー入力やマウス入力をゴソゴソやって横取りし、普通のアプリケーションを「騙す」ことで、コンピュータデスクトップの使い勝手をよくしようというもの。立派な統合アプリ環境を開発して、さぁ、どうです?、と言うよりも、既存のアプリの使い勝手の向上や、既存のアプリ同士の連携を、「下手な手つきでいじくり回す」感じで、まぁ動けばいいじゃん、と実現するのが目的だから、"fumble"という単語は、割とピッタリではないか、と思っています。
さらに、"fumble"は、例えば、「野球でボールを取り損なう」なんて事にも使うように、あんまりいい意味の単語ではないようです。そういう言葉をあえて名前に使ってることが、逆に目立っていいかな?という、多少の色気もありました。
ライセンス
ダウンロードページで公開しているxfumbleのソースコードは、GPLバージョン3にて配布を行います。
下記のライセンス条項は、上記すべてのソースコードに適応します。
簡単に言えば、「タダ」「無保証」「改変自由」「再頒布自由」「ただし、改変した内容は、公開する義務を負う。つまり、せっかく改変してくれたんだったら、オイラにも見せてよね。」です。
下記のライセンス条項は、上記すべてのソースコードに適応します。
--------------- xfumble - X Windowにおける動的キーバインド(その他いろいろ)ツール Copyright(C) 2008- 遠藤なまず このプログラムはフリーソフトウェアです。あなたはこれを、フリーソフトウェ ア財団によって発行されたGNU 一般公衆利用許諾書(バージョン3)が定める条 件の下で再頒布または改変することができます。 このプログラムは有用であることを願って頒布されますが、*全くの無保証 *です。商業可能性の保証や特定目的への適合性は、言外に示されたものも 含 め、全く存在しません。詳しくはGNU 一般公衆利用許諾書をご覧ください。 GNU 一般公衆利用許諾書は、 http://www.gnu.org/licenses/ をご覧ください。 ---------------
簡単に言えば、「タダ」「無保証」「改変自由」「再頒布自由」「ただし、改変した内容は、公開する義務を負う。つまり、せっかく改変してくれたんだったら、オイラにも見せてよね。」です。
謝辞
xfumbleを作るにあたって、のぞむさんの、keyfakeが、非常に参考になりました。
xfumbleのもっとも根本の、「XTest extention機能で、擬似キー出力を実現する」というアイデアは、のぞむさんのkeyfakeがなかったら、まだ気がついてなかったかもしれません。のぞむさん、本当にありがとうございました。
xfumbleのほとんどは、プログラミング言語Rubyで書かれています。Rubyの「コードブロック」の仕組みが、極端なイベントドリブン型プログラムのxfumbleの開発を、とてもハッピーなものにしてくれました。まつもとさん、本当にありがとうございました。
xfumbleが、X Window Systemと直接やりとりする部分は、C言語で書かれています。Xlibとやりとりするrubyのクラスを、C言語で作成する方法について、もりきゅうさんのRuby/Xlibが、非常に参考になりました。もりきゅうさん、本当にありがとうございました。
さらに、X.Orgが新しくなって、RECORD extensionが使用できなくなり、それに代わるキーイベント配送方法を考えていたときに、Chris DekterさんのAutoKeyというツールのソースコードが、大変に参考になりました。USBケーブルで複数のキーボードを接続しても動作するように、/dev/input/by-pathを検索して、キーボード関係のデバイスを、全部オープンする、というアイデアは、Chrisさんから頂きました。また、X.Orgのバージョンをチェックして、1.6未満だったら、RECORDを使う、というアイデアも、参考になりました。Chirsさん、本当にありがとうございました。
それから、コーヒー一杯で何時間も粘り、ノートパソコンの電気まで勝手に使う、ずうずうしいヒゲオヤジに、いつもやさしく接してくれる京阪香里園駅のスターバックスの店員の皆さん、本当にありがとう。
xfumbleのもっとも根本の、「XTest extention機能で、擬似キー出力を実現する」というアイデアは、のぞむさんのkeyfakeがなかったら、まだ気がついてなかったかもしれません。のぞむさん、本当にありがとうございました。
xfumbleのほとんどは、プログラミング言語Rubyで書かれています。Rubyの「コードブロック」の仕組みが、極端なイベントドリブン型プログラムのxfumbleの開発を、とてもハッピーなものにしてくれました。まつもとさん、本当にありがとうございました。
xfumbleが、X Window Systemと直接やりとりする部分は、C言語で書かれています。Xlibとやりとりするrubyのクラスを、C言語で作成する方法について、もりきゅうさんのRuby/Xlibが、非常に参考になりました。もりきゅうさん、本当にありがとうございました。
さらに、X.Orgが新しくなって、RECORD extensionが使用できなくなり、それに代わるキーイベント配送方法を考えていたときに、Chris DekterさんのAutoKeyというツールのソースコードが、大変に参考になりました。USBケーブルで複数のキーボードを接続しても動作するように、/dev/input/by-pathを検索して、キーボード関係のデバイスを、全部オープンする、というアイデアは、Chrisさんから頂きました。また、X.Orgのバージョンをチェックして、1.6未満だったら、RECORDを使う、というアイデアも、参考になりました。Chirsさん、本当にありがとうございました。
それから、コーヒー一杯で何時間も粘り、ノートパソコンの電気まで勝手に使う、ずうずうしいヒゲオヤジに、いつもやさしく接してくれる京阪香里園駅のスターバックスの店員の皆さん、本当にありがとう。