妄想: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
してクロージャに閉じ込める。。。?