Archive for the ‘RTM’ tag
RTM keyconfig の Firefox 3 対応
/* RTM keyconfig */
を Firefox 3 に対応させました。
rtm_keyconfig.user.js [userscript.org]
機能や設定の仕様については変更ありませんので、以前のものをそのままお使い頂けます。
動作確認はFirefox 3.0 + Greasemonkey 0.8で行っています。
/* 原因 */
以前はnew Function(…)でコンフィグから生成したコードを関数化して(グローバルスコープ)、それをRTMの内部クラスであるEventManagerのイベントハンドラbodyKeyPressHandlerに設定していました。しかしこれをFirefox 3で動作させると、いまいち意味のわからないエラーが発生するためどう回避するかで悩んでいました。
EventManager.prototype.bodyKeyPressHandler = new Function("ev", "ignoreCombo", newcode);
その後、よくわからないエラーを発生させている原因はnew Function(…)であることが判明したため、scriptタグを使って生成したコードをhtmlに注入してグローバルスコープの関数を作り、それをEventManagerクラスのインスタンスであるeventMgrのスコープで呼び出して回避しました。
var script = document.createElement('SCRIPT');
script.innerHTML = 'function gm_rtm_keyconfig(ev, ignoreCombo){n' + newcode + 'n}';
document.getElementById('content').appendChild(script);
eventMgr.bodyKeyPressHandler = function(ev, ignoreCombo){
gm_rtm_keyconfig.call(eventMgr, ev, ignoreCombo);
};
/* 最後に */
コメントをくれたOferさんありがとう。
「動かないよー!」とか言っていただけると直す気になります。
使ってもらってるんだなーと実感するというか。
enjoy RTM!
RTM Keyconfig: Remember The Milk のキーボードショートカットを変更するグリモン
/* どんなグリモン */
Remember The Milk のキーボードショートカットを好きなように追加・変更・削除するためのグリモンです。
Remember The Milk (以下、RTM) は本当に良く作り込まれてるタスク管理ツールです。そしてなにより嬉しいのは全ての操作がキーボードから行なえるようにショートカットが割り当てられているという点です。ところがこのキーボードショートカット、残念ながら標準ではカスタマイズできません。本当に残念です。私は選択解除するとき反射的に Esc を押してしまうからです。
なのでカスタマイズするためのグリモンを作ってみました。
/* インストール */
このスクリプトは Userscripts.org に投稿済みです。下記ページからインストールを行なってください。
/* 設定 */
設定項目
| 名前 | 説明 | 取り得る値 | 型 |
| keys | キーボードショートカット文字列と実行する関数。 | ショートカットキー文字列と関数から成る配列を格納した配列。詳細は下記解説を参照。 | Array(Array) |
| interval | リトライ間隔。 | ミリ秒。デフォルト値のままを推奨。通常100から5000とか。 | Number |
サンプル設定
var cfg = {
keys: [
["esc", "taskList.taskSelectNone()"],
["space", "this.keyboardEntrySelect(ev)"],
["j", function(){
var list = view.getViewList();
if(list.keyboardPosition + 1 != list.entries.length){
list.keyboardDown();
}
}],
["k", function(){
var list = view.getViewList();
if(list.keyboardPosition != 0){
list.keyboardUp();
}
}],
["ctrl+d", "pagedown", function(){
var list = view.getViewList();
for(var i = 0; i < 5; i++){
if(list.keyboardPosition + 1 == list.entries.length){break}
list.keyboardDown();
}
}],
["ctrl+u", "pageup", function(){
var list = view.getViewList();
for(var i = 0; i < 5; i++){
if(list.keyboardPosition == 0){break}
list.keyboardUp();
}
}],
["l", "tab", function(){
var tabs = view.getViewTabs();
if(tabs.selected != tabs.entries.length - 1){
tabs.selectRight();
}
}],
["h", "shift+tab", function(){
var tabs = view.getViewTabs();
if(tabs.selected != 0){
tabs.selectLeft();
}
}],
["u", "control.undoLastAction()"]
],
interval: 250
}
/* ショートカット文字列 */
次のような記述が可能です。
| ショートカットキー文字列 | 意味 |
| a | a キー。 |
| shift+a | Shift キーを押しながら a キー。 |
| A | Shift キーを押しながら a キー。 |
| ctrl+alt+esc | Ctrl キーと Alt キーを押しながら Esc キー。 |
| shift+bs | Shift キーを押しながら Backspace キー。 |
ポイントは2つ目と3つ目は同じ意味を持っているということです。
また、配列の一番最後の要素が関数として扱われるため、次のように複数のショートカットキーを1つの関数に割り当てることができます。
["l", "tab", function(){
var tabs = view.getViewTabs();
if(tabs.selected != tabs.entries.length - 1){
tabs.selectRight();
}
}]
["l", function(){
var tabs = view.getViewTabs();
if(tabs.selected != tabs.entries.length - 1){
tabs.selectRight();
}
}],
["tab", function(){
var tabs = view.getViewTabs();
if(tabs.selected != tabs.entries.length - 1){
tabs.selectRight();
}
}]
この2つの割り当ては等価となります。
以下は使用可能な修飾キーと特殊キーの一覧です。
修飾キー
| 装飾キー | id |
| Altキー | alt |
| Controlキー、Ctrlキー | ctrl |
| Shiftキー | shift |
特殊キー
| 名称 | id | 値 |
| エスケープキー、ESC | esc | 27 |
| Delete キー | del | 127 |
| Backspace キー | bs | 8 |
| Enter キー、Return キー | enter | 13 |
| Tab キー | tab | 9 |
| Space キー | space | 32 |
| ←キー(左矢印) | left | 37 |
| ↑キー(上矢印) | up | 38 |
| →キー(右矢印) | right | 39 |
| ↓キー(下矢印) | down | 40 |
| PageUp キー | pageup | 33 |
| PageDown キー | pagedown | 34 |
| Home キー | home | 36 |
| End キー | end | 35 |
| Insert キー | insert | 45 |
/* 関数 */
関数として、関数リテラルと文字列のどちらでも指定可能です。
["esc", "taskList.taskSelectNone()"]
["esc", function(){taskList.taskSelectNone()}]
上記2つのコードは(たぶん)等価です。
内部的には関数リテラルも文字列に変換されるため、スコープなどの情報は残りません。
ここで指定されたコードは RTM 本体のコードに直接挿入されるため、実行スコープは RTM 内のイベントハンドラのスコープになります。
また、関数内で return は使用できませんのでご注意ください。使用した場合、他の部分の動作にも影響が出ます。
/* 最後に */
実を言うと RTM は最近使っていませんでした。大量のタスクを残したまま。原因はキーボードショートカットです。
ちなみに RTM のソースは圧縮されてはいますが、難読化されていません。とても助かりますね。ところがソース容量が 600KB オーバーと半端ないです。ただ、適切な名前とインターフェイスのためか、それほど苦労しませんでした。復元のための PrettyPrinter はこれを使いました。オンラインで使える PrettyPrinter はいろいろ試してみましたが、唯一これだけからレスポンスがあり、他はバッファが溢れたりしてダメでした。
Opera 対応は要望があったらやります。
enjoy Remember The Milk!