私的良スレ書庫
不明な単語は2ch用語を / 要望・削除依頼は掲示板へ。不適切な画像報告もこちらへどうぞ。 / 管理情報はtwitterでログインするとレス評価できます。 登録ユーザには一部の画像が表示されますので、問題のある画像や記述を含むレスに「禁」ボタンを押してください。
【叩かれて】Emacs Lisp道場【強くなれ】
emacs スレッド一覧へ / emacs とは? / 携帯版 / dat(gz)で取得 / トップメニューみんなの評価 : ○
レスフィルター : (試験中)
包囲アドバイスって訳語は、日本語infoで使われちゃっていますけど、
あまり良さそうに思えないですね。語感が合わなくて。
あまり良さそうに思えないですね。語感が合わなくて。
>>103
FUD?
FUD?
>>105
広瀬さんの本はどう?
広瀬さんの本はどう?
2章を頭からちょっと読んでみたが
- nil を偽値として紹介した直後に not でなく null を紹介。
その後で空リスト。
偽値と空リストがごっちゃになってる taste がしてイヤでつ。
同じ lisp ばかりじゃねえんだぞと。
- predicate は「述語」でなしに「断言する」でよかったんだっけか?
- "\n" が改行文字にすりかわるのは評価じゃなくてリーダーの問題だろ
\n ならいいけど \\ が出てきたらこんな理解で困るんじゃないか。
regexp を扱うようになったらパニックだろ。
とか考えた漏れは逝ってよしでつか
- nil を偽値として紹介した直後に not でなく null を紹介。
その後で空リスト。
偽値と空リストがごっちゃになってる taste がしてイヤでつ。
同じ lisp ばかりじゃねえんだぞと。
- predicate は「述語」でなしに「断言する」でよかったんだっけか?
- "\n" が改行文字にすりかわるのは評価じゃなくてリーダーの問題だろ
\n ならいいけど \\ が出てきたらこんな理解で困るんじゃないか。
regexp を扱うようになったらパニックだろ。
とか考えた漏れは逝ってよしでつか
>>111
あのー、罵倒されても構いませんから、
(lambda ...)
と
(function (lambda ...))
で具体的に何が変わってくるのか、
もうちょっと詳しく教えてください。
俺の理解では、バイトコンパイルされてしまえば同じ。
そのままだったら、functionのほうがマクロ展開ないぶん、
微妙に速いかもしれない(俺の勝手な推測)というところなんですが。
# quoteの場合が違うのは分かっています。
あのー、罵倒されても構いませんから、
(lambda ...)
と
(function (lambda ...))
で具体的に何が変わってくるのか、
もうちょっと詳しく教えてください。
俺の理解では、バイトコンパイルされてしまえば同じ。
そのままだったら、functionのほうがマクロ展開ないぶん、
微妙に速いかもしれない(俺の勝手な推測)というところなんですが。
# quoteの場合が違うのは分かっています。
それでいいんじゃないの? 個人的には (lambda ...) よりも #'(lambda ...)
のほうがパッと見たときにわかりやすいので好み。
のほうがパッと見たときにわかりやすいので好み。
時間がかかる処理をしていて、何かキーが押されたら中断する、ということを
考えています。試しに下のようなのを書いてみました。
(defun g ()
(interactive)
(let ((i 0))
(while t
(setq i (1+ i))
(when (input-pending-p)
(keyboard-quit)))))
これはうまくいきました。
今、やりたいのは 上記のwhile部分がブラックボックス扱いのときで、
(defun heavy-proc ()
(let ((i 0))
(while t
(setq i (1+ i)))
i))
という関数の中身を変更せずに、呼び出した後でキー入力があれば中断して戻
るということがしたいのです。割り込みのような感じです。
(defun f2 ()
(interactive)
(condition-case nil
(heavy-proc)
.....
とやればいいのかなと思ったのですが、肝心のキーが押されたらエラーを発生
するやり方がさっぱり見当がつかないのです。
なにか良い方法を知っておられましたら、教えてやってくださいまし。
考えています。試しに下のようなのを書いてみました。
(defun g ()
(interactive)
(let ((i 0))
(while t
(setq i (1+ i))
(when (input-pending-p)
(keyboard-quit)))))
これはうまくいきました。
今、やりたいのは 上記のwhile部分がブラックボックス扱いのときで、
(defun heavy-proc ()
(let ((i 0))
(while t
(setq i (1+ i)))
i))
という関数の中身を変更せずに、呼び出した後でキー入力があれば中断して戻
るということがしたいのです。割り込みのような感じです。
(defun f2 ()
(interactive)
(condition-case nil
(heavy-proc)
.....
とやればいいのかなと思ったのですが、肝心のキーが押されたらエラーを発生
するやり方がさっぱり見当がつかないのです。
なにか良い方法を知っておられましたら、教えてやってくださいまし。
>>115
アドバイスありがとうございます。
(defun heavy-proc ()
(let ((i 0))
(while t
(setq i (1+ i)))
i))
(defun f2 ()
(interactive)
(condition-case nil
(heavy-proc)
((quit)
(message "aborted."))))
こういうことでしょうか。
これだと、C-g以外のキーを押したときは中断できません。
もうちょっと練ってみます。
アドバイスありがとうございます。
(defun heavy-proc ()
(let ((i 0))
(while t
(setq i (1+ i)))
i))
(defun f2 ()
(interactive)
(condition-case nil
(heavy-proc)
((quit)
(message "aborted."))))
こういうことでしょうか。
これだと、C-g以外のキーを押したときは中断できません。
もうちょっと練ってみます。
全てのキーに signal発生させるよう設定したキーマップ使用すれば
いけるかも? signalの代わりに throwでもいいけど。
いけるかも? signalの代わりに throwでもいいけど。
>>117
試しにこうしてみましたが…
(defvar tmp-map nil
"temporary key map for aborting.")
(defun f2 ()
(interactive)
(let ((previous-keymap (copy-keymap (current-local-map))))
(if tmp-map
nil
(setq tmp-map (make-sparse-keymap))
(define-key tmp-map "a" 'keyboard-quit)
(define-key tmp-map "b" 'keyboard-quit)
(define-key tmp-map "c" 'keyboard-quit))
(use-local-map tmp-map)
(condition-case nil
(heavy-proc)
((quit)
(message "aborted.")))
(use-local-map previous-keymap)))
中断してくれない(^^;
試しにこうしてみましたが…
(defvar tmp-map nil
"temporary key map for aborting.")
(defun f2 ()
(interactive)
(let ((previous-keymap (copy-keymap (current-local-map))))
(if tmp-map
nil
(setq tmp-map (make-sparse-keymap))
(define-key tmp-map "a" 'keyboard-quit)
(define-key tmp-map "b" 'keyboard-quit)
(define-key tmp-map "c" 'keyboard-quit))
(use-local-map tmp-map)
(condition-case nil
(heavy-proc)
((quit)
(message "aborted.")))
(use-local-map previous-keymap)))
中断してくれない(^^;
>>119
今度は以下のようにsignalを使ってみましたが…
(defvar tmp-map nil
"temporary key map for aborting.")
(defun my-quit ()
(interactive)
(signal 'quit nil))
(defun f2 ()
(interactive)
(let ((previous-keymap (copy-keymap (current-local-map))))
(if tmp-map
nil
(setq tmp-map (make-sparse-keymap))
(define-key tmp-map "a" 'my-quit))
(use-local-map tmp-map)
(condition-case nil
(heavy-proc)
((quit)
(message "aborted.")))
(use-local-map previous-keymap)))
相変わらず、中断せずでした。
edebugで追いかけてみると、キーマップ自体は変わってくれているのですが、
heavy-procを呼び出したらC-g以外をセンスしてくれないような感じがします
です。
今度は以下のようにsignalを使ってみましたが…
(defvar tmp-map nil
"temporary key map for aborting.")
(defun my-quit ()
(interactive)
(signal 'quit nil))
(defun f2 ()
(interactive)
(let ((previous-keymap (copy-keymap (current-local-map))))
(if tmp-map
nil
(setq tmp-map (make-sparse-keymap))
(define-key tmp-map "a" 'my-quit))
(use-local-map tmp-map)
(condition-case nil
(heavy-proc)
((quit)
(message "aborted.")))
(use-local-map previous-keymap)))
相変わらず、中断せずでした。
edebugで追いかけてみると、キーマップ自体は変わってくれているのですが、
heavy-procを呼び出したらC-g以外をセンスしてくれないような感じがします
です。
助言を元に調べました。
なんとなく分かってきた気がします。(気がするだけかも…)
(defun heavy-proc ()
(let ((i 0))
(while t
(setq i (1+ i)))
i))
(defun f3 ()
(interactive)
(let ((previous-keymap (copy-keymap (current-local-map)))
(previous-input-mode (current-input-mode)))
(set-input-mode t nil 0 ?a)
(condition-case nil
(heavy-proc)
((quit)
(message "aborted.")))
(use-local-map previous-keymap)
(set-input-mode (car previous-input-mode)
(nth 1 previous-input-mode)
(nth 2 previous-input-mode)
(nth 3 previous-input-mode))))
キーマップ再定義はせずに、上記のようにすると aキーで中断できるようにな
りますた。あとはこれを全部のキー文字に割り当てれば、と考えたのですが…
(set-input-mode t nil 0 '(?a ?b)) のような複数指定は不可
(set-input-mode t nil 0 nil) ではデフォルトのC-gになる
の様です。…もはや手詰まりか…
なんとなく分かってきた気がします。(気がするだけかも…)
(defun heavy-proc ()
(let ((i 0))
(while t
(setq i (1+ i)))
i))
(defun f3 ()
(interactive)
(let ((previous-keymap (copy-keymap (current-local-map)))
(previous-input-mode (current-input-mode)))
(set-input-mode t nil 0 ?a)
(condition-case nil
(heavy-proc)
((quit)
(message "aborted.")))
(use-local-map previous-keymap)
(set-input-mode (car previous-input-mode)
(nth 1 previous-input-mode)
(nth 2 previous-input-mode)
(nth 3 previous-input-mode))))
キーマップ再定義はせずに、上記のようにすると aキーで中断できるようにな
りますた。あとはこれを全部のキー文字に割り当てれば、と考えたのですが…
(set-input-mode t nil 0 '(?a ?b)) のような複数指定は不可
(set-input-mode t nil 0 nil) ではデフォルトのC-gになる
の様です。…もはや手詰まりか…
ふと思い立って、
(keyboard-translate ?b ?\C-g)
とかやってみましたが、やはり中断してくれませんね。
コマンドループ内でC-gというのはかなりの特別扱いの感じがします。
こんなローレベルな関数が効かないなんて…。
# emvaders.elとかどうやってるのかな。ゲームなら割り込みみたいな処理を
してると思うんだけど。
(keyboard-translate ?b ?\C-g)
とかやってみましたが、やはり中断してくれませんね。
コマンドループ内でC-gというのはかなりの特別扱いの感じがします。
こんなローレベルな関数が効かないなんて…。
# emvaders.elとかどうやってるのかな。ゲームなら割り込みみたいな処理を
してると思うんだけど。
emvaders.elでは input-pending-pで処理してますた。
ゲーム的にはこのやり方は納得です。
にしても、ハマりすぎです。
誰かお願いです。ひとつ叩いてやってください。ガツンと。
ゲーム的にはこのやり方は納得です。
にしても、ハマりすぎです。
誰かお願いです。ひとつ叩いてやってください。ガツンと。
苦肉の策として、「最後に押したキーで中断する」というのを考えてみました。
(defadvice heavy-proc (before input-set disable)
(set-input-mode t nil 0 last-input-event))
(defun heavy-proc ()
(interactive)
(let ((i 0))
(while t
(setq i (1+ i)))
i))
(defun f3 ()
(interactive)
(let ((previous-input-mode (current-input-mode)))
;; enable advice
(ad-enable-advice 'heavy-proc 'before 'input-set)
(ad-activate 'heavy-proc)
(condition-case nil
(heavy-proc)
((quit)
(message "aborted.")))
;; disable advice
(ad-disable-advice 'heavy-proc 'before 'input-set)
(ad-activate 'heavy-proc)
(set-input-mode (car previous-input-mode)
(nth 1 previous-input-mode)
(nth 2 previous-input-mode)
(nth 3 previous-input-mode))))
ややこしいやり方になってしまいました。
(defadvice heavy-proc (before input-set disable)
(set-input-mode t nil 0 last-input-event))
(defun heavy-proc ()
(interactive)
(let ((i 0))
(while t
(setq i (1+ i)))
i))
(defun f3 ()
(interactive)
(let ((previous-input-mode (current-input-mode)))
;; enable advice
(ad-enable-advice 'heavy-proc 'before 'input-set)
(ad-activate 'heavy-proc)
(condition-case nil
(heavy-proc)
((quit)
(message "aborted.")))
;; disable advice
(ad-disable-advice 'heavy-proc 'before 'input-set)
(ad-activate 'heavy-proc)
(set-input-mode (car previous-input-mode)
(nth 1 previous-input-mode)
(nth 2 previous-input-mode)
(nth 3 previous-input-mode))))
ややこしいやり方になってしまいました。
なぜ C-g で quit がいやなのかようわからんが、アドバイスせんでも
(let ((previous-input-mode (current-input-mode)))
(unwind-protect
(progn
(apply #'set-input-mode
`(,@(butlast previous-input-mode) ,last-input-event))
(heavy-proc))
(apply #'set-input-mode previous-input-mode)))
でいいような。
(let ((previous-input-mode (current-input-mode)))
(unwind-protect
(progn
(apply #'set-input-mode
`(,@(butlast previous-input-mode) ,last-input-event))
(heavy-proc))
(apply #'set-input-mode previous-input-mode)))
でいいような。
>>125, 126
助言、ありがとうございます。
今まで、unwind-protect は実際にどういう場面で用いるのかわかりませんでしたが、
なんかわかったような気がしますです。
> なぜ C-g で quit がいやなのかようわからんが、
bf-mode.elというelispをいじくっているのですが、html をw3mで表示したと
きに重いので、キャンセルの手段が欲しいと思ったのです。
助言、ありがとうございます。
今まで、unwind-protect は実際にどういう場面で用いるのかわかりませんでしたが、
なんかわかったような気がしますです。
> なぜ C-g で quit がいやなのかようわからんが、
bf-mode.elというelispをいじくっているのですが、html をw3mで表示したと
きに重いので、キャンセルの手段が欲しいと思ったのです。
ファイルへの出力ってどうやってするんですか?
とりあえずhoge.txtに"hoge\n"と書いて出力する程度でいいんですが。
とりあえずhoge.txtに"hoge\n"と書いて出力する程度でいいんですが。
あのー質問なんですが,
あるファイルの内容を調査したい場合,Emacs Lisp だと
対象となるファイルを一旦 find-file とかで
全て読み込まなくちゃ駄目なんでしょうか…?
外部プロセスに逃げると言う手も考えましたが,
そんなものを使うよりは,Emacs Lisp のみで完結したいので…
あるファイルの内容を調査したい場合,Emacs Lisp だと
対象となるファイルを一旦 find-file とかで
全て読み込まなくちゃ駄目なんでしょうか…?
外部プロセスに逃げると言う手も考えましたが,
そんなものを使うよりは,Emacs Lisp のみで完結したいので…
全部読まなくても
(insert-file-contents FILENAME &optional VISIT BEG END REPLACE)
でファイルの一部だけを読む事ができるよ。
(insert-file-contents FILENAME &optional VISIT BEG END REPLACE)
でファイルの一部だけを読む事ができるよ。
なにがしたいのか分からんが、とりあえず作ってみたら?
もっと意図を明確にしたうえで、ム板のスレで質問するのがいいと思うが。
もっと意図を明確にしたうえで、ム板のスレで質問するのがいいと思うが。
(defun newschangelog (start end)
"ChangeLog中の不必要な部分を削除"
(interactive "r")
(save-excursion
(save-restriction
(narrow-to-region start end)
(goto-char start)
(replace-regexp "^[ \t]*.*STRONG.*" "")
(goto-char start)
(replace-regexp "^ *<A HREF.*" "")
(goto-char start)
(replace-regexp "</A></DT>" "")
(goto-char start)
(delete-matching-lines "^$")
(goto-char start)
(replace-regexp "^[ \t]*" "\t")
)))
* news/index.html: 記事追加
★ PTCジャパン、Linux対応Pro/EをLinux World Expoに参考出品</A></DT>
<DT><STRONG>日経BizTech</STRONG>
<A HREF="http://biztech.nikkeibp.co.jp/wcs/show/leaf/CID/onair/biztech/comp/247927">
日本SGI、Linux向けのシステム構築支援サービス</A></DT>
<DT><STRONG>c|net</STRONG>
<A HREF="http://japan.cnet.com/svc/rss?id=1261.47623.54525">
日本国内のLinuxサーバ市場:ビジネス利用には課題が多い</A></DT>
☆
上記★から☆までがリージョンに指定されている状態だとします。このとき、
カーソルが★にあるのか☆にあるのかで、M-x newschangelog の結果が異なり
ます。
"ChangeLog中の不必要な部分を削除"
(interactive "r")
(save-excursion
(save-restriction
(narrow-to-region start end)
(goto-char start)
(replace-regexp "^[ \t]*.*STRONG.*" "")
(goto-char start)
(replace-regexp "^ *<A HREF.*" "")
(goto-char start)
(replace-regexp "</A></DT>" "")
(goto-char start)
(delete-matching-lines "^$")
(goto-char start)
(replace-regexp "^[ \t]*" "\t")
)))
* news/index.html: 記事追加
★ PTCジャパン、Linux対応Pro/EをLinux World Expoに参考出品</A></DT>
<DT><STRONG>日経BizTech</STRONG>
<A HREF="http://biztech.nikkeibp.co.jp/wcs/show/leaf/CID/onair/biztech/comp/247927">
日本SGI、Linux向けのシステム構築支援サービス</A></DT>
<DT><STRONG>c|net</STRONG>
<A HREF="http://japan.cnet.com/svc/rss?id=1261.47623.54525">
日本国内のLinuxサーバ市場:ビジネス利用には課題が多い</A></DT>
☆
上記★から☆までがリージョンに指定されている状態だとします。このとき、
カーソルが★にあるのか☆にあるのかで、M-x newschangelog の結果が異なり
ます。
具体的には、カーソルが☆にあると
PTCジャパン、Linux対応Pro/EをLinux World Expoに参考出品
<DT><STRONG>日経BizTech</STRONG>
日本SGI、Linux向けのシステム構築支援サービス
<DT><STRONG>c|net</STRONG>
日本国内のLinuxサーバ市場:ビジネス利用には課題が多い
となり、カーソルが★にあると
PTCジャパン、Linux対応Pro/EをLinux World Expoに参考出品
日本SGI、Linux向けのシステム構築支援サービス
日本国内のLinuxサーバ市場:ビジネス利用には課題が多い
となります。
希望する結果は、カーソルが★☆のどちらにあっても
PTCジャパン、Linux対応Pro/EをLinux World Expoに参考出品
日本SGI、Linux向けのシステム構築支援サービス
日本国内のLinuxサーバ市場:ビジネス利用には課題が多い
のようになることです。添削おねがいします。
PTCジャパン、Linux対応Pro/EをLinux World Expoに参考出品
<DT><STRONG>日経BizTech</STRONG>
日本SGI、Linux向けのシステム構築支援サービス
<DT><STRONG>c|net</STRONG>
日本国内のLinuxサーバ市場:ビジネス利用には課題が多い
となり、カーソルが★にあると
PTCジャパン、Linux対応Pro/EをLinux World Expoに参考出品
日本SGI、Linux向けのシステム構築支援サービス
日本国内のLinuxサーバ市場:ビジネス利用には課題が多い
となります。
希望する結果は、カーソルが★☆のどちらにあっても
PTCジャパン、Linux対応Pro/EをLinux World Expoに参考出品
日本SGI、Linux向けのシステム構築支援サービス
日本国内のLinuxサーバ市場:ビジネス利用には課題が多い
のようになることです。添削おねがいします。
なんか例示されてるのと違い、空行が入ってしまうなーと思ったら、
transient-mark-mode かどうかで挙動が違うな。
で、offにして試してみたけど、どちらも okっぽかったけれど。
transient-mark-mode かどうかで挙動が違うな。
で、offにして試してみたけど、どちらも okっぽかったけれど。
検証ありがとうございます。おっしゃるとおり、手元の Emacs 20.7.2 を
\emacs -qで起動すると、★☆どちらにカーソルがあっても希望の結果になり
ました(transient-mark-mode t/nil のどちらも)。
ところが、XEmacs 21.1 を \xemacs -q で起動させて確認したところ、
transient-mark-mode t/nil どちらの場合も 144 に書いた結果になるのです。
常用しているのは XEmacs なので、それで希望の結果が出て欲しいのです。
皆様のアドバイスをいただきたく思います。よろしくお願いします。
\emacs -qで起動すると、★☆どちらにカーソルがあっても希望の結果になり
ました(transient-mark-mode t/nil のどちらも)。
ところが、XEmacs 21.1 を \xemacs -q で起動させて確認したところ、
transient-mark-mode t/nil どちらの場合も 144 に書いた結果になるのです。
常用しているのは XEmacs なので、それで希望の結果が出て欲しいのです。
皆様のアドバイスをいただきたく思います。よろしくお願いします。
replace-regexp を
(while (re-search-forward REGEXP nil t)
(replace-match TO-STRING nil nil))
にすれば直るはず。
特別な理由がない限り lisp program 中で replace-regexp は使わないほうが
いいです。 perform-replace を参照。
(while (re-search-forward REGEXP nil t)
(replace-match TO-STRING nil nil))
にすれば直るはず。
特別な理由がない限り lisp program 中で replace-regexp は使わないほうが
いいです。 perform-replace を参照。
147氏のおっしゃるように修正したところ、XEmacs, Emacs の両者で
希望の動作をしてくれるようになりました。ありがとうございます。
希望の動作をしてくれるようになりました。ありがとうございます。
>>1 のelispリファレンス-ja
http://www.fan.gr.jp/~ring/doc/elisp-manual/elisp.html
は 27章 ウィンドウ がまるごと抜けてるからちょっと不便ですた。
ちょっと探したら、
http://www.i.kyushu-u.ac.jp/~s-fusa/doc/elisp-manual-20-2.5-jp/elisp-ja.html
を発見。こっちはちゃんと27章があるじょ。
スタイルシートでカラフルで見やすいなり。
にしても、emacs21版のelispリファ-ja は まだどこにもないんでしょか。
http://www.fan.gr.jp/~ring/doc/elisp-manual/elisp.html
は 27章 ウィンドウ がまるごと抜けてるからちょっと不便ですた。
ちょっと探したら、
http://www.i.kyushu-u.ac.jp/~s-fusa/doc/elisp-manual-20-2.5-jp/elisp-ja.html
を発見。こっちはちゃんと27章があるじょ。
スタイルシートでカラフルで見やすいなり。
にしても、emacs21版のelispリファ-ja は まだどこにもないんでしょか。
前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ / 要望・削除依頼は掲示板へ / 管理情報はtwitterで / emacs スレッド一覧へ
みんなの評価 : ○類似してるかもしれないスレッド
- 【熱く】お前のEmacsにはまった理由【語れ】 (577) - [36%] - 2021/8/28 17:30 ○
- 「Emacsは消滅すべき」、ゴスリング氏 (127) - [17%] - 2023/1/12 15:45
トップメニューへ / →のくす牧場書庫について