Skip to content

Rewrite defadvice to define-advice#228

Open
taku0 wants to merge 1 commit intoskk-dev:masterfrom
taku0:defadvice_to_define-advice
Open

Rewrite defadvice to define-advice#228
taku0 wants to merge 1 commit intoskk-dev:masterfrom
taku0:defadvice_to_define-advice

Conversation

@taku0
Copy link

@taku0 taku0 commented Aug 2, 2025

defadviceはEmacs 30で非推奨となったため、define-adviceに書き換えます。

ただし、define-adviceはEmacs 25からなので、このPRをマージした場合はEmacs 24はサポート外とする必要があります。

#227 にあるテストを実行済みです。また、一部機能は手動でテストしています:

  • nicola/skk-kanagaki.el: 簡単な変換ができること。
  • skk-dcomp.el: 補完候補が表示されること。
  • skk-isearch.el: isearchで日本語が入力できること。
  • skk-jisx0201.el: 半角カナを入力して送り仮名有りの項目と送り仮名無しの項目を変換できること。
  • skk-jisyo-edit-mode.el: 辞書編集モードでは変換しても辞書に項目が追加されないというメッセージが出ること。辞書編集モードではXで個人辞書の項目の削除ができないこと。
  • skk-show-mode.el: モード切り替え時にモードが表示されること。
  • skk-sticky.el: 指定した複数キーの同時押しで変換位置を指定できること。
  • skk-tut.el: チュートリアル中は一部機能が制限されること。
  • skk-viper.el: viperで日本語が入力できること。

基本方針

単純な場合

(defadvice foo (around skk-foo-ad activate)
  (bar (ad-get-arg 0))
  ad-do-it
  (setq ad-return-value baz))

(define-advice foo (:around (oldfun arg1 arg2) skk-foo-ad)
  (bar arg1)
  (funcall oldfun arg1 arg2)
  baz)
  • defadvicedefine-adviceにする。
  • aroundなどは:aroundなどにする。
  • :aroundなどの後に元の関数のパラメータリストを追加する。:aroundの場合はさらに先頭にoldfunを追加する。
  • ad-do-it(funcall oldfun arg)などとする。arg部分は実際の引数リストに合わせる。
  • ad-get-argは引数リストで受け取ったパラメータにする。
  • ad-return-valuedefine-adviceのボディの戻り値とする。
  • interactiveの指定は不要となった。それに伴いskk-defadviceは不要となったため削除して通常のdefine-adviceとした。

引数を書き換える場合

:aroundではなく:filter-argsを指定して、書き換えた引数リストを返す。

adviceを動的にオンオフする場合

defadviceで定義したadviceは個別に有効化/無効化できるが、define-adviceによるものはadviceの追加と削除として表す必要がある。
adviceの本体となる関数をdefunした上で、advice-addadvice-removeで追加/削除する。

ここで定義する関数の名前は「元の関数の名前 + @ + advice名」としている。これはdefine-adviceが生成する関数名に合わせている。

テスト以外にチェックした事項

  • defadviceがどのファイルにも残っていない。
  • :aroundという文字列の次は(oldfunである。
  • (oldfunという文字列の前は:aroundである。
  • ad-do-it, ad-get-arg, ad-return-valueが残っていない。
  • define-adviceの最後にactivatepreactivateなどの文字列が残っていない。
  • define-adviceで定義した引数リストと(funcall oldfun ...)の引数リストは一致している。ただしこれは機械的にチェックしたのではなく、目視なので漏れている可能性はある。

@taku0 taku0 changed the title Rewrite defadvice' to define-advice' Rewrite defadvice to define-advice Aug 2, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant