Emacs Part 44
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。
2013/12/14(土) 17:36:04.45GNU Emacs - GNU Project - Free Software Foundation (FSF)
https://www.gnu.org/software/emacs/
EmacsWiki: サイトマップ
http://www.emacswiki.org/emacs/
前スレ
Emacs Part 43
http://toro.2ch.net/test/read.cgi/unix/1370754332/
0236名無しさん@お腹いっぱい。
2014/01/10(金) 14:13:54.03elc を見てみましたがやっぱり置き換えは発生しておりませんでした。
(eval-and-compile (defconst test-hogehoge "HOGE"))
(defun test-func () test-hogehoge)
=>
(defconst test-hogehoge "HOGE")
(defalias 'test-func #[nil "^H\207" [test-hogehoge] 1])
0237名無しさん@お腹いっぱい。
2014/01/10(金) 14:52:48.48(eval-when-compile (defconst test-hogehoge "HOGE"))
(defun test-func ()
(eval-when-compile test-hogehoge))
eval-when-compile で全部包むと消えるみたいけど、めんどくさいかな。
0238名無しさん@お腹いっぱい。
2014/01/10(金) 16:01:53.67cl-symbol-macrolet はどうだろう。clパッケージに依存するけれど。
(require 'cl-macs)
(cl-symbol-macrolet ((hoge "HOGE")
(fuga "FUGA"))
(defun f ()
(list hoge fuga)))
(symbol-function 'f)
;=> (lambda nil (list "HOGE" "FUGA"))
0239名無しさん@お腹いっぱい。
2014/01/10(金) 19:19:36.12やっぱりその場で eval させないとだめっぽいですね。
>>238
おおおー
スコープ絞ればかなり期待通りの動作です。
ありがとうございます。
cl 奥が深いなあ
0240名無しさん@お腹いっぱい。
2014/01/11(土) 11:37:09.14このようなものです
(mapc (lambda (a b) (print (+ a b)))
'(2 3 4) '(3 4 5))
想定しているのはcommon lispのmapcのようなことなのですが、できないものでしょうか
0241名無しさん@お腹いっぱい。
2014/01/11(土) 11:45:17.84cl の mapc がそのまんま common lisp の挙動だね。
(require 'cl-lib)
(cl-mapc (lambda (a b) (print (+ a b))) '(2 3 4) '(3 4 5))
0242名無しさん@お腹いっぱい。
2014/01/11(土) 13:30:42.74!ばっちりです!ありがとうございました
0243名無しさん@お腹いっぱい。
2014/01/12(日) 06:01:18.50保存時に出るこのエコーを無効にしたいです。
Saving file /usr/home/jk2/.emacs.d/.scratch…
Wrote /usr/home/jk2/.emacs.d/.scratch
「Saving file〜」は message の defadvice で消せました。
「Wrote〜」はどこで無効にすればよいのでしょうか?
0244名無しさん@お腹いっぱい。
2014/01/12(日) 10:22:18.850245名無しさん@お腹いっぱい。
2014/01/12(日) 13:41:13.85ありがとうございます!静かになりました。
0246名無しさん@お腹いっぱい。
2014/01/14(火) 00:34:38.41デバッガを終了した後に signal を投げた箇所から再開させるよう
デバッガの操作ではなくコード側から指示することは可能でしょうか?
(let ((count 100))
(while (> count 0)
;; do something
(when something-happened
(signal 'some-error nil))
;; do something ;; <= エラーが起きてもここから再開したい & ignore-errors でシグナルを無視はしたくない & ループも抜けたくない
(setq count (1- count))))
0247名無しさん@お腹いっぱい。
2014/01/14(火) 02:59:39.10(debug 'some-error)
にする
0248名無しさん@お腹いっぱい。
2014/01/14(火) 10:10:16.95ありがとうございます。
(debug 'hoge) でシグナルと同じようにデバッガに入れるんですね。
いま気がついたんですけど ignore-errors でもどちらにせよエラー起きた場所で止まっちゃうんですね。
(ignore-errors
(signal 'error nil)
(message "ppp") ;; <= ここまで到達はしない
)
basic とかにある、on error resume next みたいなのは無理かー
0249名無しさん@お腹いっぱい。
2014/01/14(火) 20:04:25.19accept-process-output したりすると、(プロセスの出力があれば)フィルタ関数内で
フィルタ関数が呼ばれることになるんでしょうか?
0250名無しさん@お腹いっぱい。
2014/01/14(火) 21:52:26.73Gaucheのリーダマクロ #?= みたいにprintfデバッグを書くのに debug-print.el というのを作ったのですが,
可能であれば函数名を読み取って表示するので要望に合うかもです.
現状では debug-print を上書きすれば表示は変えられるけど, もうちょい変えやすくしますかね.
(debug-printという関数名は twittering-mode.el も使ってるんで現状では少し注意.)
何か要望出してもらえれば反映するかもです.
丁度いい機会なのでいくつか質問を.
1. 既存の函数の戻り値に一時的に少し手を加えたい場合はどうするのが良いのでしょうか.
adviseされた函数をfletで上書きするとエラーが出るのでadviceを使うのが正しいのでしょうが,
常にそのadviceを有効にしたいわけではないのです. 大域変数を使ってadvice内部で
その変数を見て動作を切り替えるというのが標準的なんですかね?
2. そのやり方で何か不都合が出るかどうかが気になります.
因みに上のやり方がパッと思いつかなかったので現状では ad-enable-advice と ad-disable-advice
でadviceの有効/無効を切り替えています. こちらは既にバグがあることがわかっています.
0251名無しさん@お腹いっぱい。
2014/01/14(火) 22:44:00.16enable/disable で問題ない気もするのですがちなみにどんなバグなんでしょう?
ad-activate が抜けてるとか?
0252名無しさん@お腹いっぱい。
2014/01/14(火) 22:52:00.69> 丁度いい機会なのでいくつか質問を.
>
> 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)
を切り換える、とか?
0253名無しさん@お腹いっぱい。
2014/01/14(火) 23:04:51.41advice された関数に対してそれをするとアカンのですよ。
(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 がついてこなくなるとかなんとか。
0254名無しさん@お腹いっぱい。
2014/01/14(火) 23:43:36.78フォント⇒字母
アルゴリズム⇒算法
プログラム⇒算譜
みたいな
0255250
2014/01/14(火) 23:56:40.51; あーこれ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)))
改行が多すぎるので続く.
0256名無しさん@お腹いっぱい。
2014/01/14(火) 23:58:06.38(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)
0257250
2014/01/15(水) 00:04:52.00(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)
0258名無しさん@お腹いっぱい。
2014/01/15(水) 00:33:23.13なるほど。ある advice の有効/無効状態を取得出来るオフィシャルな方法はあるのかってことですね。
もともと enable ならなにもしない、って感じで。
Info みた感じだとなさそう。
結局 advice の実装見ることになっちゃうけど、ad-get-advice-info あたりを使うしかないのかしらん。
describe-function なんかでも使ってるから準公式みたいなもんでしょうきっと。
それと skk-isearch.el なんかでも advice 済みかどうかの判断に ad-get-advice-info を使ってるみたいです。
0259名無しさん@お腹いっぱい。
2014/01/15(水) 01:17:18.21こういうことか? マクロ書き慣れてないから 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)))))
0260名無しさん@お腹いっぱい。
2014/01/15(水) 01:25:37.09状態チェック入るなら展開時に評価はまずいんじゃないでしょうか。
pcase のところまで含めて実行時評価になるようにしないといけないかと。
0261250
2014/01/15(水) 02:59:03.92はい! そういうことです. ありがとうございます.
>>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)))))))
0262名無しさん@お腹いっぱい。
2014/01/15(水) 04:05:06.60> funcallの後ろを ',(if ...) としないといけないのはわからなくはないけど納得いかない.
funcall 使わなければいいのでは?
0263名無しさん@お腹いっぱい。
2014/01/15(水) 09:31:47.01re-builder みたいに書いてるはしから macroexpand-all した結果を表示し続けるやつが欲しいわ・・・
0264名無しさん@お腹いっぱい。
2014/01/15(水) 09:39:36.07onoff その他を引数にとって enable と disable と activate までやってくれる toggle みたいなの書いちゃえば
progn 減ってすごく見やすくなりそうだな
0265名無しさん@お腹いっぱい。
2014/01/15(水) 10:07:46.310266名無しさん@お腹いっぱい。
2014/01/15(水) 20:04:03.590267名無しさん@お腹いっぱい。
2014/01/16(木) 17:20:20.61(少なくともあそこら辺界隈での) emacs の息切れ感が伝わってきて切なくなるな
0268名無しさん@お腹いっぱい。
2014/01/16(木) 18:01:53.840269名無しさん@お腹いっぱい。
2014/01/16(木) 18:29:43.310270名無しさん@お腹いっぱい。
2014/01/16(木) 18:40:25.830271名無しさん@お腹いっぱい。
2014/01/16(木) 18:49:00.730272名無しさん@お腹いっぱい。
2014/01/16(木) 19:30:37.120273名無しさん@お腹いっぱい。
2014/01/16(木) 19:36:16.72型落ち ThinkPad とメイドカフェで C が最高にクールというのが
Emacser の価値観だからねえ。
0274名無しさん@お腹いっぱい。
2014/01/16(木) 19:45:46.240275名無しさん@お腹いっぱい。
2014/01/16(木) 19:50:46.22"p"だと、コマンドを実行するときに指定した前置引数の値が関数の引数になる。
0276名無しさん@お腹いっぱい。
2014/01/16(木) 19:57:05.49Web 界隈だと vim 使ってる人がクールってイメージなんじゃないだろうか。
自分の狭い観測範囲だとそんな感じを受ける。
0277名無しさん@お腹いっぱい。
2014/01/16(木) 20:01:36.290278名無しさん@お腹いっぱい。
2014/01/16(木) 20:06:17.51なるほどそういうことですか
勉強になりました
0279名無しさん@お腹いっぱい。
2014/01/16(木) 20:10:13.80で書いてたら、隣の女の子にじーーーーっと見られて非常にやりづらかった
0280名無しさん@お腹いっぱい。
2014/01/16(木) 20:12:50.32・Emacs が珍しかった
・黒背景ワロス
・イケメンだった
・ブサメンすぎた
・Mac Book(笑)
・別にお前を見ていたわけではない
0281名無しさん@お腹いっぱい。
2014/01/16(木) 20:14:28.570282名無しさん@お腹いっぱい。
2014/01/16(木) 20:34:23.61・実はスパイだった
0283名無しさん@お腹いっぱい。
2014/01/16(木) 20:39:55.260284名無しさん@お腹いっぱい。
2014/01/16(木) 21:06:50.380285名無しさん@お腹いっぱい。
2014/01/16(木) 21:13:22.520286名無しさん@お腹いっぱい。
2014/01/16(木) 21:28:46.61じわじわくるな。
0287名無しさん@お腹いっぱい。
2014/01/16(木) 21:47:50.190288名無しさん@お腹いっぱい。
2014/01/16(木) 21:48:25.45優勝
0289名無しさん@お腹いっぱい。
2014/01/16(木) 21:54:24.100290名無しさん@お腹いっぱい。
2014/01/16(木) 22:07:56.760291名無しさん@お腹いっぱい。
2014/01/16(木) 22:08:12.200292名無しさん@お腹いっぱい。
2014/01/16(木) 22:09:22.680293名無しさん@お腹いっぱい。
2014/01/16(木) 22:12:59.80ぶっちゃけ PC なんかよりスマホで動くかどうかだな
0294名無しさん@お腹いっぱい。
2014/01/16(木) 22:14:42.02「強い」って表現した時点で、たおやかな女子の魅力が損なわれるだろ?
その自己矛盾に陥ってしまうことを防ぐのが目的の一つ。
あと、「力が高い」という、ユルいけど嫌味にならない程度の
頭の悪さを匂わすフレーズを敢えて使うことで、
さらに女子としての魅力を演出している。
それはさておき、emacs 使ってたらとりあえずモテるよね。
0295名無しさん@お腹いっぱい。
2014/01/16(木) 22:15:53.280296名無しさん@お腹いっぱい。
2014/01/16(木) 22:21:25.46能力が高いって言うだろ
つうかそれ位すぐ分かれよ
0297名無しさん@お腹いっぱい。
2014/01/16(木) 22:25:56.330298名無しさん@お腹いっぱい。
2014/01/16(木) 22:30:50.600299名無しさん@お腹いっぱい。
2014/01/16(木) 22:34:02.790300名無しさん@お腹いっぱい。
2014/01/16(木) 22:49:43.970301名無しさん@お腹いっぱい。
2014/01/16(木) 22:58:54.08https://github.com/skeeto/skewer-mode
知らん人は↑ここからリンクしているムービーを見るべし
俺的に久々にヒットだわ
0302名無しさん@お腹いっぱい。
2014/01/16(木) 23:04:55.94js2-modeとskewer-modeがいっぺんに入る
auto-completeは自動で入らないけど入れた方がいいね
0303名無しさん@お腹いっぱい。
2014/01/16(木) 23:16:01.80昔からブラウザ <-> Emacs 間で js や html/css 等は操作できてた
FireFox だったら Mozrepl があったし、よく使われてただろ (Chrome のお陰でもう死んでるけど)
ただ、なぜにこの skewer ってものは js2-mode を必須としているんだ?
0304名無しさん@お腹いっぱい。
2014/01/16(木) 23:40:44.46事実上モダンな js 用のモードは js2 しかない状況だから致し方ない気もするが。
0305名無しさん@お腹いっぱい。
2014/01/16(木) 23:45:14.12そのサイトに書いてあったけど、時前でhttpサーバを持ってるのと
ブラウザに依存しないのが利点かね
js2-modeが必須なのは分からんが、js2-mode自体JavaScript編集には必須だとは思う
0306名無しさん@お腹いっぱい。
2014/01/17(金) 00:55:05.060307名無しさん@お腹いっぱい。
2014/01/17(金) 00:58:12.85って普通に書いてあるじゃん
0308名無しさん@お腹いっぱい。
2014/01/17(金) 01:56:43.56chimeric って形容詞自体、ここでは意味が通じない又は曖昧すぎて意味を無さない。
個人的に、もうその時点で「絶対使いたくない elisp」の仲間入りだわ。
0309名無しさん@お腹いっぱい。
2014/01/17(金) 03:09:34.65もし前にchimericがなかったら of js-mode and js2-mode まで読んだところで
2つのモードのforkってどういうことさ?ってちょっと疑問符が浮かんでしまいそうなもんだから役目は果たしてると思うけどな
ダサイかどうかは判断つきかねるが
0310名無しさん@お腹いっぱい。
2014/01/17(金) 09:53:34.740311名無しさん@お腹いっぱい。
2014/01/17(金) 13:09:25.370312名無しさん@お腹いっぱい。
2014/01/17(金) 13:24:55.58しかしプロダクト名にバージョンっぽいのがくっついてるのは気持ち悪いな。js2 からして。
0313名無しさん@お腹いっぱい。
2014/01/17(金) 21:09:42.790314名無しさん@お腹いっぱい。
2014/01/17(金) 21:18:31.940315名無しさん@お腹いっぱい。
2014/01/17(金) 21:52:29.090316名無しさん@お腹いっぱい。
2014/01/17(金) 21:55:58.430317名無しさん@お腹いっぱい。
2014/01/18(土) 00:32:39.860318名無しさん@お腹いっぱい。
2014/01/18(土) 01:27:12.24バージョンが上がっても機能は衰えるのか。
0319名無しさん@お腹いっぱい。
2014/01/18(土) 02:06:30.770320名無しさん@お腹いっぱい。
2014/01/18(土) 11:49:37.840321名無しさん@お腹いっぱい。
2014/01/18(土) 14:54:06.44(split-string "123[test]456" "\\[")
;; => ("123" "test]456")
(split-string "123[test]456" "\\]")
;; => ("123[test" "456")
(split-string "123[test]456" "[\\[\\]]")
;; ("123[test]456")
最後の例で ("123" "test" "456") を得たいのですが
"[\\[\\]]"をどのように修正すればよいですか?
0322名無しさん@お腹いっぱい。
2014/01/18(土) 14:58:31.820323名無しさん@お腹いっぱい。
2014/01/18(土) 15:02:57.060324名無しさん@お腹いっぱい。
2014/01/18(土) 15:48:11.23ありがとうございます。どちらも思ったとおりの動きです
0325名無しさん@お腹いっぱい。
2014/01/19(日) 00:51:50.970326名無しさん@お腹いっぱい。
2014/01/19(日) 09:06:09.830327名無しさん@お腹いっぱい。
2014/01/19(日) 13:12:34.140328名無しさん@お腹いっぱい。
2014/01/19(日) 14:14:18.790329名無しさん@お腹いっぱい。
2014/01/19(日) 14:41:36.24mapcはemacsがネイティブに用意してる関数
dolistはCommon Lisp互換マクロで本来は(require 'cl)しないと使えない
でも今時は誰かが(require 'cl)してるので何もしなくても使えてしまう
Common Lisp互換マクロを積極的に使うべきかはどうかはいろいろ議論がある/った
0330名無しさん@お腹いっぱい。
2014/01/19(日) 14:55:55.300331名無しさん@お腹いっぱい。
2014/01/19(日) 15:10:34.58素の emacs で使えちゃう
0332名無しさん@お腹いっぱい。
2014/01/19(日) 15:27:06.91mapcの引数FUNCTIONは、関数呼び出しされるので、それがlambda式であり、
bytecompileして使用する場合、
- 関数呼び出しのコスト(実行時間)が、プリミティブによるdolistループ実行コストよ
り大きい
- lexical bindingにおいて、lambda式の外部のローカル変数にアクセスできない
などの可能性がある。
既存の関数をそのまま呼び出せばいい場合だけmapcを使い、他はdollistを使うことが、
一つの有力な選択肢だと思う。
0333名無しさん@お腹いっぱい。
2014/01/19(日) 15:33:55.300334名無しさん@お腹いっぱい。
2014/01/19(日) 15:37:51.11そいでclがロードされてたらsubr側のは使わないような感じになってるのな
0335名無しさん@お腹いっぱい。
2014/01/19(日) 15:41:55.67dolist はリストを元に何かしたい場合にしてる。
■ このスレッドは過去ログ倉庫に格納されています