私的良スレ書庫
不明な単語は2ch用語を / 要望・削除依頼は掲示板へ。不適切な画像報告もこちらへどうぞ。 / 管理情報はtwitterでログインするとレス評価できます。 登録ユーザには一部の画像が表示されますので、問題のある画像や記述を含むレスに「禁」ボタンを押してください。
元スレEmacs Part 44
emacs スレッド一覧へ / emacs とは? / 携帯版 / dat(gz)で取得 / トップメニューみんなの評価 : △
レスフィルター : (試験中)
手元のもろもろのパッケージでは機能の有効化/無効化時に ad-enable/disable-advice を使ってるみたいです。
enable/disable で問題ない気もするのですがちなみにどんなバグなんでしょう?
ad-activate が抜けてるとか?
enable/disable で問題ない気もするのですがちなみにどんなバグなんでしょう?
ad-activate が抜けてるとか?
>>250
> 丁度いい機会なのでいくつか質問を.
>
> 1. 既存の函数の戻り値に一時的に少し手を加えたい場合はどうするのが良いのでしょうか.
advice 使わないなら
(defconst original-FUNC (symbol-function 'FUNC))
(defun temporary-FUNC (&rest args)
(let ((retval (apply 'original-FUNC args))
....))
みたいにして
(fset 'FUNC 'original-FUNC) と (fset 'FUNC 'temporary-FUNC)
を切り換える、とか?
> 丁度いい機会なのでいくつか質問を.
>
> 1. 既存の函数の戻り値に一時的に少し手を加えたい場合はどうするのが良いのでしょうか.
advice 使わないなら
(defconst original-FUNC (symbol-function 'FUNC))
(defun temporary-FUNC (&rest args)
(let ((retval (apply 'original-FUNC args))
....))
みたいにして
(fset 'FUNC 'original-FUNC) と (fset 'FUNC 'temporary-FUNC)
を切り換える、とか?
>>252
advice された関数に対してそれをするとアカンのですよ。
(defun dump-me ()
"me me")
(defadvice dump-me (after test-ad activate)
(setq ad-return-value (concat ad-return-value "??")))
(defconst original-dump-me (symbol-function 'dump-me))
(defun temporary-dump-me (&rest args)
(let ((retval (apply original-dump-me args)))
(concat retval "!!"))
)
(fset 'dump-me original-dump-me)
(fset 'dump-me 'temporary-dump-me)
(dump-me) ;; => スタック使い果たす
24.4 では fset 時に advice がついてこなくなるとかなんとか。
advice された関数に対してそれをするとアカンのですよ。
(defun dump-me ()
"me me")
(defadvice dump-me (after test-ad activate)
(setq ad-return-value (concat ad-return-value "??")))
(defconst original-dump-me (symbol-function 'dump-me))
(defun temporary-dump-me (&rest args)
(let ((retval (apply original-dump-me args)))
(concat retval "!!"))
)
(fset 'dump-me original-dump-me)
(fset 'dump-me 'temporary-dump-me)
(dump-me) ;; => スタック使い果たす
24.4 では fset 時に advice がついてこなくなるとかなんとか。
どうでもいいけど、函数ってかなり古い表現だよね
フォント⇒字母
アルゴリズム⇒算法
プログラム⇒算譜
みたいな
フォント⇒字母
アルゴリズム⇒算法
プログラム⇒算譜
みたいな
>>251
; あーこれdefadviceに対して debug-print-eval-last-sexp するとエラーになりますね.
単純にenable/disableするだけだとアドバイスが複数あったときに元の状態に戻せないのです.
advice.elの実装見れば対処法はわかるのかもしれませんがマニュアルしか読んでないので...
; ad-activate入れないといけないってのはわかりにくいですよね. マニュアルにもhelpにもあんまり書いてないですし.
(defmacro keu:with-advice (on-or-off func class advice &rest body)
"[internal] Evaluate BODY with ADVICE enabled/disabled.
Note that there is a bug that it cannot restore the state of ADVICE.
Any ideas?"
`(progn
,(pcase on-or-off
(`'on `(ad-enable-advice ,func ,class ,advice))
(`'off `(ad-disable-advice ,func ,class ,advice))
(_ (error "the first argument must be the symol 'on or 'off")))
(ad-activate ,func)
(let ((keu:with-advice:return-value ,@body))
,(pcase on-or-off
(`'on `(ad-disable-advice ,func ,class ,advice))
(`'off `(ad-enable-advice ,func ,class ,advice))
(_ (error "the first argument must be the symol 'on or 'off")))
(ad-activate ,func)
keu:with-advice:return-value)))
改行が多すぎるので続く.
; あーこれdefadviceに対して debug-print-eval-last-sexp するとエラーになりますね.
単純にenable/disableするだけだとアドバイスが複数あったときに元の状態に戻せないのです.
advice.elの実装見れば対処法はわかるのかもしれませんがマニュアルしか読んでないので...
; ad-activate入れないといけないってのはわかりにくいですよね. マニュアルにもhelpにもあんまり書いてないですし.
(defmacro keu:with-advice (on-or-off func class advice &rest body)
"[internal] Evaluate BODY with ADVICE enabled/disabled.
Note that there is a bug that it cannot restore the state of ADVICE.
Any ideas?"
`(progn
,(pcase on-or-off
(`'on `(ad-enable-advice ,func ,class ,advice))
(`'off `(ad-disable-advice ,func ,class ,advice))
(_ (error "the first argument must be the symol 'on or 'off")))
(ad-activate ,func)
(let ((keu:with-advice:return-value ,@body))
,(pcase on-or-off
(`'on `(ad-disable-advice ,func ,class ,advice))
(`'off `(ad-enable-advice ,func ,class ,advice))
(_ (error "the first argument must be the symol 'on or 'off")))
(ad-activate ,func)
keu:with-advice:return-value)))
改行が多すぎるので続く.
(defun foo (x)
(cons 'foo x))
(defadvice foo (after advice-a)
(setq ad-return-value `(advice-a ,ad-return-value)))
(defadvice foo (after advice-b)
(setq ad-return-value `(advice-b ,ad-return-value)))
(keu:with-advice 'on 'foo 'after 'advice-a
(funcall 'foo 100))
; => (advice-a
; (advice-b
; (foo . 100)))
(foo 100)
; => (advice-b
; (foo . 100))
(keu:with-advice 'on 'foo 'after 'advice-b
(funcall 'foo 100))
; => (advice-b
; (foo . 100))
(foo 100)
; => (foo . 100)
(cons 'foo x))
(defadvice foo (after advice-a)
(setq ad-return-value `(advice-a ,ad-return-value)))
(defadvice foo (after advice-b)
(setq ad-return-value `(advice-b ,ad-return-value)))
(keu:with-advice 'on 'foo 'after 'advice-a
(funcall 'foo 100))
; => (advice-a
; (advice-b
; (foo . 100)))
(foo 100)
; => (advice-b
; (foo . 100))
(keu:with-advice 'on 'foo 'after 'advice-b
(funcall 'foo 100))
; => (advice-b
; (foo . 100))
(foo 100)
; => (foo . 100)
ああ, 複数じゃなくてもいいですよね.
(ad-disable-advice 'foo 'after 'advice-a)
(ad-activate 'foo)
(foo 100)
; => (foo . 100)
(keu:with-advice 'on 'foo 'after 'advice-a
(funcall 'foo 100))
; => (advice-a (foo . 100))
(foo 100)
; => (foo . 100)
(ad-enable-advice 'foo 'after 'advice-a)
(ad-activate 'foo)
(foo 100)
; => (advice-a (foo . 100))
(keu:with-advice 'on 'foo 'after 'advice-a
(funcall 'foo 100))
; => (advice-a (foo . 100))
(foo 100)
; => (foo . 100)
(ad-disable-advice 'foo 'after 'advice-a)
(ad-activate 'foo)
(foo 100)
; => (foo . 100)
(keu:with-advice 'on 'foo 'after 'advice-a
(funcall 'foo 100))
; => (advice-a (foo . 100))
(foo 100)
; => (foo . 100)
(ad-enable-advice 'foo 'after 'advice-a)
(ad-activate 'foo)
(foo 100)
; => (advice-a (foo . 100))
(keu:with-advice 'on 'foo 'after 'advice-a
(funcall 'foo 100))
; => (advice-a (foo . 100))
(foo 100)
; => (foo . 100)
>>250
なるほど。ある advice の有効/無効状態を取得出来るオフィシャルな方法はあるのかってことですね。
もともと enable ならなにもしない、って感じで。
Info みた感じだとなさそう。
結局 advice の実装見ることになっちゃうけど、ad-get-advice-info あたりを使うしかないのかしらん。
describe-function なんかでも使ってるから準公式みたいなもんでしょうきっと。
それと skk-isearch.el なんかでも advice 済みかどうかの判断に ad-get-advice-info を使ってるみたいです。
なるほど。ある advice の有効/無効状態を取得出来るオフィシャルな方法はあるのかってことですね。
もともと enable ならなにもしない、って感じで。
Info みた感じだとなさそう。
結局 advice の実装見ることになっちゃうけど、ad-get-advice-info あたりを使うしかないのかしらん。
describe-function なんかでも使ってるから準公式みたいなもんでしょうきっと。
それと skk-isearch.el なんかでも advice 済みかどうかの判断に ad-get-advice-info を使ってるみたいです。
>>258
こういうことか? マクロ書き慣れてないから eval 沢山あってキモい
(defmacro keu:with-advice (on-or-off func class advice &rest body)
"[internal] Evaluate BODY with ADVICE enabled/disabled.
Note that there is a bug that it cannot restore the state of ADVICE.
Any ideas?"
(let ((adviced (caddr (assq (eval advice)
(assq (eval class)
(ad-get-advice-info (eval func)))))))
(if (or (and (eq (eval on-or-off) 'on) adviced)
(and (eq (eval on-or-off) 'off) (not adviced)))
`(progn
,@body)
`(progn
,(pcase on-or-off
(`'on `(ad-enable-advice ,func ,class ,advice))
(`'off `(ad-disable-advice ,func ,class ,advice))
(_ (error "the first argument must be the symol 'on or 'off")))
(ad-activate ,func)
(let ((keu:with-advice:return-value ,@body))
,(pcase on-or-off
(`'on `(ad-disable-advice ,func ,class ,advice))
(`'off `(ad-enable-advice ,func ,class ,advice))
(_ (error "the first argument must be the symol 'on or 'off")))
(ad-activate ,func)
keu:with-advice:return-value)))))
こういうことか? マクロ書き慣れてないから eval 沢山あってキモい
(defmacro keu:with-advice (on-or-off func class advice &rest body)
"[internal] Evaluate BODY with ADVICE enabled/disabled.
Note that there is a bug that it cannot restore the state of ADVICE.
Any ideas?"
(let ((adviced (caddr (assq (eval advice)
(assq (eval class)
(ad-get-advice-info (eval func)))))))
(if (or (and (eq (eval on-or-off) 'on) adviced)
(and (eq (eval on-or-off) 'off) (not adviced)))
`(progn
,@body)
`(progn
,(pcase on-or-off
(`'on `(ad-enable-advice ,func ,class ,advice))
(`'off `(ad-disable-advice ,func ,class ,advice))
(_ (error "the first argument must be the symol 'on or 'off")))
(ad-activate ,func)
(let ((keu:with-advice:return-value ,@body))
,(pcase on-or-off
(`'on `(ad-disable-advice ,func ,class ,advice))
(`'off `(ad-enable-advice ,func ,class ,advice))
(_ (error "the first argument must be the symol 'on or 'off")))
(ad-activate ,func)
keu:with-advice:return-value)))))
>>258
はい! そういうことです. ありがとうございます.
>>259
一から書き直してみました.
funcallの後ろを ',(if ...) としないといけないのはわからなくはないけど納得いかない.
(defsubst keu:advice-enabled-p (func class name)
(ad-advice-enabled (ad-find-advice func class name)))
(defmacro keu:with-advice (on-or-off func class name &rest body)
"[internal] Evaluate BODY with NAME enabled/disabled."
(let ((onoff
(pcase on-or-off
(`'on t)
(`'off nil)
(_ (error "the first argument must be the symol 'on or 'off")))))
`(let ((enabled (not (not (keu:advice-enabled-p ,func ,class ,name)))))
(if (eq ,onoff enabled)
(progn ,@body)
(prog2 ; return value is that of BODY
(progn
(funcall ',(if onoff 'ad-enable-advice 'ad-disable-advice) ,func ,class ,name)
(ad-activate ,func))
(progn ,@body)
(progn
(funcall ',(if (not onoff) 'ad-enable-advice 'ad-disable-advice) ,func ,class ,name)
(ad-activate ,func)))))))
はい! そういうことです. ありがとうございます.
>>259
一から書き直してみました.
funcallの後ろを ',(if ...) としないといけないのはわからなくはないけど納得いかない.
(defsubst keu:advice-enabled-p (func class name)
(ad-advice-enabled (ad-find-advice func class name)))
(defmacro keu:with-advice (on-or-off func class name &rest body)
"[internal] Evaluate BODY with NAME enabled/disabled."
(let ((onoff
(pcase on-or-off
(`'on t)
(`'off nil)
(_ (error "the first argument must be the symol 'on or 'off")))))
`(let ((enabled (not (not (keu:advice-enabled-p ,func ,class ,name)))))
(if (eq ,onoff enabled)
(progn ,@body)
(prog2 ; return value is that of BODY
(progn
(funcall ',(if onoff 'ad-enable-advice 'ad-disable-advice) ,func ,class ,name)
(ad-activate ,func))
(progn ,@body)
(progn
(funcall ',(if (not onoff) 'ad-enable-advice 'ad-disable-advice) ,func ,class ,name)
(ad-activate ,func)))))))
ああ、マクロ展開だから素でシンボルが頭にくるようにすりゃいいんかな
re-builder みたいに書いてるはしから macroexpand-all した結果を表示し続けるやつが欲しいわ・・・
re-builder みたいに書いてるはしから macroexpand-all した結果を表示し続けるやつが欲しいわ・・・
defsubst ありなら
onoff その他を引数にとって enable と disable と activate までやってくれる toggle みたいなの書いちゃえば
progn 減ってすごく見やすくなりそうだな
onoff その他を引数にとって enable と disable と activate までやってくれる toggle みたいなの書いちゃえば
progn 減ってすごく見やすくなりそうだな
しかし advice は何度説明読んでも preactivate と compile の意味がわからんわ
emacs と vim の advent calendar 見比べてると
(少なくともあそこら辺界隈での) emacs の息切れ感が伝わってきて切なくなるな
(少なくともあそこら辺界隈での) emacs の息切れ感が伝わってきて切なくなるな
Mac book 使ってカフェで JavaScript 書いてる層には確実に受け悪そうだよな Emacs は。
(interactive)と(interactive "p")の違いはどういうものですか?
Mac Book とカフェで JavaScript はダサくて
型落ち ThinkPad とメイドカフェで C が最高にクールというのが
Emacser の価値観だからねえ。
型落ち ThinkPad とメイドカフェで C が最高にクールというのが
Emacser の価値観だからねえ。
emacsってjs2-modeあるしmacとも相性良い気がするんだけど理屈じゃないのかな
>>272
"p"だと、コマンドを実行するときに指定した前置引数の値が関数の引数になる。
"p"だと、コマンドを実行するときに指定した前置引数の値が関数の引数になる。
打ち合わせの時、メモを Mac Book + iTerm2 + Emacs(黒地フルスクリーン)
で書いてたら、隣の女の子にじーーーーっと見られて非常にやりづらかった
で書いてたら、隣の女の子にじーーーーっと見られて非常にやりづらかった
なんでなんだろ
・Emacs が珍しかった
・黒背景ワロス
・イケメンだった
・ブサメンすぎた
・Mac Book(笑)
・別にお前を見ていたわけではない
・Emacs が珍しかった
・黒背景ワロス
・イケメンだった
・ブサメンすぎた
・Mac Book(笑)
・別にお前を見ていたわけではない
>>280
・実はスパイだった
・実はスパイだった
>>285
じわじわくるな。
じわじわくるな。
>>285
優勝
優勝
どういうルートを辿ったら女子小学生が Emacs にリーチするんだろう
ぶっちゃけ PC なんかよりスマホで動くかどうかだな
ぶっちゃけ PC なんかよりスマホで動くかどうかだな
>>290
「強い」って表現した時点で、たおやかな女子の魅力が損なわれるだろ?
その自己矛盾に陥ってしまうことを防ぐのが目的の一つ。
あと、「力が高い」という、ユルいけど嫌味にならない程度の
頭の悪さを匂わすフレーズを敢えて使うことで、
さらに女子としての魅力を演出している。
それはさておき、emacs 使ってたらとりあえずモテるよね。
「強い」って表現した時点で、たおやかな女子の魅力が損なわれるだろ?
その自己矛盾に陥ってしまうことを防ぐのが目的の一つ。
あと、「力が高い」という、ユルいけど嫌味にならない程度の
頭の悪さを匂わすフレーズを敢えて使うことで、
さらに女子としての魅力を演出している。
それはさておき、emacs 使ってたらとりあえずモテるよね。
前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ / 要望・削除依頼は掲示板へ / 管理情報はtwitterで / emacs スレッド一覧へ
みんなの評価 : △類似してるかもしれないスレッド
- Emacs Part 54 (97) - [92%] - 2023/1/25 17:15
- Emacs Part 46 (984) - [92%] - 2014/12/24 14:15
- Emacs Part 34 (1001) - [92%] - 2010/6/21 19:45 ○
- Emacs Part 41 (1001) - [92%] - 2012/12/24 4:15
- Emacs Part 42 (1001) - [92%] - 2013/6/9 5:15 △
- Emacs Part 43 (1001) - [92%] - 2013/12/14 11:30
- Emacs Part 45 (1001) - [92%] - 2014/6/23 9:45
- Emacs Part 40 (1001) - [92%] - 2012/9/7 0:30
- Emacs Part 47 (995) - [92%] - 2015/4/19 13:01
- Emacs Part 49 (974) - [92%] - 2016/12/7 9:45
- Emacs Part 48 (997) - [92%] - 2015/12/9 15:15
- Emacs Part 53 (989) - [84%] - 2022/12/5 12:45
- Emacs Part 31 (1001) - [84%] - 2009/10/23 10:31 ○
- Emacs Part 32 (1001) - [84%] - 2009/12/20 2:04 ○
トップメニューへ / →のくす牧場書庫について