読者です 読者をやめる 読者になる 読者になる

emacsのslimeとddskkとの衝突を回避する設定が機能しなくなってた

slimeにはスペースを挿入して関数のパラメータをミニバッファに表示するslime-spaceという機能がスペースキーに割り当てられてるけど
これがddskkのskk-insertと被っていてddskkが使えなくなる問題がある

その回避方法は調べたらいくつか出てくるけど、それがいつ頃からかslimeの変更で使えなくなってることに気付いて困ってた

ソースを辿って見てみるとslime-autodoc-mode-mapというマイナーモードの
slime-autodoc-spaceというコマンドが使われるようになってたので
このモードのキーマップのスペースの割り当てを変更したら解決した

(defun slime-autodoc-space-or-skk-insert (n)
  (interactive "p")
  (if (and (boundp 'skk-henkan-mode) skk-henkan-mode)
      (skk-insert n)
    (if nil
        (slime-autodoc-space n)
      ;; 上の関数はなぜかミニバッファへの表示が細切れになるので
      ;; 下のslime-autodoc-spaceの中身を少し変更して誤魔化す
      (self-insert-command n)
      (let ((doc (slime-autodoc)))
        (when doc
          (message "%s" doc)       ; 元は(eldoc-message "%s" doc) 
          )))))

(add-hook 'slime-autodoc-mode-hook
          (lambda ()
            (define-key slime-autodoc-mode-map " "
              'slime-autodoc-space-or-skk-insert)))

環境はubuntu 16.04でemacs25.1.1とslime 2.18

追記:

defadviceを使うともっとうまくいった

(defadvice slime-autodoc-space (around slime-autodoc-space-or-skk-insert (n))
  (if (and (boundp 'skk-henkan-mode) skk-henkan-mode)
      (skk-insert n)
    ad-do-it))
(ad-activate 'slime-autodoc-space 'slime-autodoc-space-or-skk-insert)