endflow.net blog

/* programming and programming */

Archive for the ‘RTM’ tag

RTM keyconfig の Firefox 3 対応

with 2 comments

/* 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! ;)

Written by kuy

7 5th, 2008 at 3:02

Posted in Uncategorized

Tagged with , , ,

RTM Keyconfig: Remember The Milk のキーボードショートカットを変更するグリモン

with 5 comments

/* どんなグリモン */

Remember The Milk のキーボードショートカットを好きなように追加・変更・削除するためのグリモンです。

Remember The Milk (以下、RTM) は本当に良く作り込まれてるタスク管理ツールです。そしてなにより嬉しいのは全ての操作がキーボードから行なえるようにショートカットが割り当てられているという点です。ところがこのキーボードショートカット、残念ながら標準ではカスタマイズできません。本当に残念です。私は選択解除するとき反射的に Esc を押してしまうからです。

なのでカスタマイズするためのグリモンを作ってみました。

/* インストール */

このスクリプトは Userscripts.org に投稿済みです。下記ページからインストールを行なってください。

rtmkeyconfig.user.js

/* 設定 */

設定項目

名前 説明 取り得る値
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! ;)

Written by kuy

2 10th, 2008 at 8:20

Posted in Uncategorized

Tagged with , , , ,