🦬
bind-key によって最優先度で定義した C-j や C-q を SKK 起動中だけ取り戻す方法
問題提起
Emacs ではキーボードの一等地にある j
が有効活用されていない。だから、いったん C-j
を殺して C-j
をプレフィクスとしたコマンドを :bind*
[1] でバインドしまくっている。しかし、こうすると SKK で C-j
による「変換確定」ができなくなってしまう。
一応、SKK の設定では skk-kakutei-key
で C-j
以外に変更できるようにはなっている。しかし、例えば C-k
に変更してミニバッファで kill-line
のつもりで C-k
すると、なぜか SKK が起動したりとわけのわからない挙動になったりする。つまり、カスタマイズはできるが C-j
以外への割り当てがあまり考慮されていない。また事実上うまく割り当てられる代替キーもないのだった。
そういうわけで、C-j
から始まるバインドを活かしつつ SKK を使っているときだけ C-j
を変換確定に使う、そんな都合のよい設定はできないだろうか?
結論
SKK を起動したときだけ bind-key を切る。
たったそれだけだが、これに辿りつくのに相当遠回りした。
具体例
(use-package bind-key
:init
(unbind-key "C-j") ; プレフィクスキーとして使いたいのでぶっ殺す
:bind* ( ; bind* はすべてのアサインに勝つ
;; C-j から始まるコマンドを定義しまくる
("C-j a" . some-command1)
("C-j b" . some-command2)
("C-j c" . some-command3)))
(global-set-key (kbd "S-SPC") 'skk-mode) ; ← bind-key で定義してはいけない
(defadvice skk-mode (after skk-mode-ad activate)
(if skk-mode
(override-global-mode 0)
(override-global-mode 1)))
;; To remove this advice.
;; (progn (ad-disable-advice 'skk-mode 'after 'skk-mode-ad) (ad-update 'skk-mode))
注意点として skk-mode は bind-key 側でバインドしてはいけない。してしまうと SKK 起動中は bind-key が切れているため同じトグル操作で戻ってこれなくなる。
悪かった副作用
慣れの問題ではあるが、SKK 中に bind-key で定義した操作をしてしまって戸惑うことがあった。
良かった副作用
C-j
と同様に C-q
[2] もプレフィクスとして利用していたため SKK 中に C-q
が効かなかったのだけど、これも一時的に bind-key を切ったことで取り戻せた。
Discussion