🦬

bind-key によって最優先度で定義した C-j や C-q を SKK 起動中だけ取り戻す方法

2024/11/28に公開

問題提起

Emacs ではキーボードの一等地にある j が有効活用されていない。だから、いったん C-j を殺して C-j をプレフィクスとしたコマンドを :bind*[1] でバインドしまくっている。しかし、こうすると SKK で C-j による「変換確定」ができなくなってしまう。

一応、SKK の設定では skk-kakutei-keyC-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 を切ったことで取り戻せた。

参照

脚注
  1. 優先度の低い :bind だと SKK 以外にも負けてしまう ↩︎

  2. SKK では半角カナに変換する操作 ↩︎

Discussion