@peccul is peccu

(love peccu '(emacs lisp cat outdoor bicycle mac linux coffee))

妄想:WebページのショートカットキーをEmacsみたく記述できたら便利そう

ふとショートカットキーと関数の組み合わせをEmacs風に定義できたら便利じゃないかと思い始めた。

コードは書いていない。

Emacsでの定義イメージ

  • モード用キーマップを作成
(defvar some-mode-map
  (let ((map (make-sparse-keymap)))
    (define-key map (kbd "q")   'some-quit)
    (define-key map (kbd "n")   'some-next)
    (define-key map (kbd "p")   'some-previous)
    (define-key map (kbd "RET")   'some-open)
    (define-key map (kbd "e")   'some-edit)
    map)
  "Keymap for some mode.")
  • キーマップの適用
(use-local-map some-mode-map)
  • グローバルなキーマップへの追加
(global-set-key (kbd "<M-f2>") 'bm-toggle)

整理

  • 一つのバッファに対し一つのメジャーモードと複数のマイナーモードが存在する。
  • キーバインドのためにkeymapという考えがあり、メジャーモードやマイナーモードにそれぞれ複数のkeymapが存在しうる。
    • 多分参照する親子関係や順序があるはず。
  • keymapにはキーコードと関数の組みを登録する
  • キーコードを取得するためのヘルパー関数として kbd というものがある。
  • キーイベントとkeymap登録の関数を定義する
  • キーイベントの関数
    • keymapの参照順を考慮して実行する関数を取得して実行する
  • keymap登録の関数
    • キーコードとkeymapと関数を指定する
    • キーコードと関数の組をkeymapに追加する
  • 複数ストロークキーバインドの場合、途中まで入力すると入力中であることをミニバッファに表示する。
    • webだとAndroidのトーストみたいなものか、ステータスラインかなぁ
    • そういえば最近ステータスラインを見なくなった
  • kbd はキーコードのベクタを返してる模様

複数ストロークはどうやって定義するんだったか。。。

JavaScriptでの妄想

  • 利用イメージ
var quit = function(evt){};
var next = function(evt){};
var previous = function(evt){};
var open = function(evt){};
var edit = function(evt){};

var KbdEl = require('kbd-el');
var kbd = KbdEl.kbd;
var defineKey = KbdEl.defineKey;
var keymap = KbdEl.makeKeymap();
keymap = defineKey(keymap, kbd('q'), quit);
keymap = defineKey(keymap, kbd('n'), next);
keymap = defineKey(keymap, kbd('p'), previous);
keymap = defineKey(keymap, kbd('RET'), open);
keymap = defineKey(keymap, kbd('e'), edit);

var activateMode = function(){
  KbdEl.useLocalMap(keymap);
};

Vue.jsならVuexのストアに入れてそこを参照する形にするといいのかな。 コンポーネントまたごうと思ったらview = this してクロージャに閉じ込める。。。?

参考URL