のくす牧場
コンテンツ
牧場内検索
カウンタ
総計:126,805,143人
昨日:no data人
今日:
最近の注目
人気の最安値情報

    私的良スレ書庫

    不明な単語は2ch用語を / 要望・削除依頼は掲示板へ。不適切な画像報告もこちらへどうぞ。 / 管理情報はtwitter
    ログインするとレス評価できます。 登録ユーザには一部の画像が表示されますので、問題のある画像や記述を含むレスに「禁」ボタンを押してください。

    元スレEmacs Part 43

    emacs スレッド一覧へ / emacs とは? / 携帯版 / dat(gz)で取得 / トップメニュー
    スレッド評価: スレッド評価について
    みんなの評価 :
    タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。
    レスフィルター : (試験中)
    ←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitter
    801 : 名無しさん@お腹 - 2013/11/12(火) 01:13:26.16 (+41,+13,-3)
    次のバージョンていつリリースされんだろう?
    802 : 名無しさん@お腹 - 2013/11/12(火) 01:41:42.06 (+65,+29,+2)
    >>799
    なるほど
    ありがとう
    803 : 名無しさん@お腹 - 2013/11/12(火) 02:15:21.12 (+10,-30,-45)
    >>800
    \( \) を "" の中に書くときは "\\( \\)"
    ^ だと行頭すべてにマッチしてしまうので文字列の頭だけなら \\`

    (replace-regexp-in-string "\\`\\(?: *\n\\)+" "" " \n\n \n hoge\n \n")
    ;=> " hoge\n \n"
    804 : 名無しさん@お腹 - 2013/11/12(火) 08:21:26.07 (-1,-29,+1)
    \\`[ \n]*\n

    \t はいらんかえ
    805 : 名無しさん@お腹 - 2013/11/12(火) 15:59:22.67 (+83,-30,-272)
    マクロを eval-when-compile 内で定義しておいてロード時には見えないようにしてる場合、
    defadvice の中でそのマクロを使ってしまうとコンパイル時に展開されないためか実行時にエラーになってしまいます。
    これを回避する方法はないのでしょうか?

    cl を eval-when-compile で使いたいのに advice の中で使ってるせいでうまくいかない・・・

    ; コンパイル時のみ有効なマクロ
    (eval-when-compile
    (defmacro moo ()
    '"moo!"))

    ; 関数内でマクロ使用
    (defun foo ()
    (moo))

    ; アドバイス内でマクロ使用
    (defun bar ()
    nil)
    (defadvice bar (before ad-bar activate)
    (moo))

    ; コンパイル後のファイルをロードして実行した結果:
    ; (fboundp 'moo) => nil
    ; (foo) => "moo!"
    ; (bar) => Error: void-function moo ("moo!" になってほしい)
    806 : 805 - 2013/11/12(火) 16:02:59.87 (+11,-30,-37)
    一部間違えました。
    (defadvice bar (before ad-bar activate)
    (moo))

    (defadvice bar (after ad-bar activate)
    (setq ad-return-value (moo)))
    807 : 名無しさん@お腹 - 2013/11/12(火) 16:18:13.86 (+4,-30,-160)
    eval-when-compileで思ったが>>787でやってるキャッシュなんか
    全部eval-when-compileでやっちゃえばいいんじゃないかと思ったわ
    どうせ違う環境にもってったらそんときinit.elコンパイルし直すだろうしな

    (when (eval-when-compile (executable-find "w3m")) ...)

    みたいな
    マニュアルみてもコンパイル時に定数に置き換えるっていってるし
    808 : 名無しさん@お腹 - 2013/11/12(火) 17:17:42.94 (+3,-30,-11)
    >>806
    ad-return-value は before after advice では使えなかった記憶が。
    around advice 使うしかなかったような。
    809 : 805 - 2013/11/12(火) 17:23:22.70 (+0,-29,-8)
    >>808
    >>806 で after になおしています。
    macroexpand でもダメだったし無理なんですかねえ・・・
    810 : 805 - 2013/11/12(火) 17:24:22.75 (-1,-29,-21)
    じゃないや・・ マニュアルによると ad-return-value は after でも使えるみたいです。
    811 : 名無しさん@お腹 - 2013/11/12(火) 18:49:40.14 (+46,-29,-49)
    原理的なおっ説教ですまないが、
    - advice を使う
    - cl パッケージを cl-* なしで使う
    という2重の意味でこまったことをしている気がする。。。

    根本から立ち戻って、本当にそれしか方法がないのか再考はできないかなぁ。

    Emacs 24.4. の nadvice.el が使えるようになったら色々と捗る気はするが、
    捗らないかもしれない。
    812 : 名無しさん@お腹 - 2013/11/12(火) 19:09:32.20 (+4,-30,-71)
    >>811
    advice はともかく cl-* を使ってるかどうかは関係なくね?
    どっちにしろ (require 'cl) しないと使えない上
    (require 'cl) はライブラリで使う時は eval-when-compile にしてランタイムに使うなってのは
    変わってないでしょ。
    813 : 名無しさん@お腹 - 2013/11/12(火) 19:34:05.00 (+43,-30,-162)
    >>805
    stackoverflow でも似たような質問出ていたけど最後は結局普通に require しろで終わってたな。

    他に考えられる方法としては、advice の中身を別関数建てにして予めコンパイルさせるぐらいか。
    これだとロード時じゃなくコンパイル時にちゃんと中身までマクロ展開されるし
    関数名 typo とかしてても Warning 出してくれるようになる。

    (eval-when-compile (defmacro moo () "moo!"))
    (defun bar () nil)
    (defun ad-bar-internal () (moo))
    (defadvice bar (after ad-bar activate) (setq ad-return-value (ad-bar-internal)))
    814 : 名無しさん@お腹 - 2013/11/12(火) 21:39:43.17 (+3,-30,-115)
    (require 'cl) がランタイムで禁止だったのは同名のEmacs Lispの関数を上書きして、
    他のソフトがどっちを使っているのか分からなくなる問題があったため。

    最近のEmacs は、clパッケージの関数の先頭に全部 cl- をくっつけることで名前衝突を防ぎ、
    普通にrequire できる、 (require 'cl-lib) というのがあるので、支障がなければこっちを
    使うべき。
    815 : 805 - 2013/11/12(火) 21:57:02.45 (+68,+28,-61)
    色々調べたり試してみましたが advice の中で素直にマクロ展開させるのは無理そうでしたorz
    cl を止めて cl-lib にしたところコンパイル時の警告が出なくなったので、
    自前のマクロ用に>>813さんに指摘された関数の形でくくりだすのと合わせて対応してみます。

    >>811さんの教えてくださった nadvice ですが、さらっと見た感じ
    advice の中身も普通の関数みたいにコンパイル時にパースされるみたいですね。
    導入が楽しみです。

    ありがとうございました。
    816 : 名無しさん@お腹 - 2013/11/13(水) 00:45:42.47 (+11,-30,-19)
    >>805,806
    (defadvice bar (after ad-bar compile activate)
    (setq ad-return-value (moo)))
    817 : 800 - 2013/11/13(水) 02:53:28.57 (+4,-30,-63)
    >>803-804
    ありがとう。汚いコードを書かずに済みました。
    バックスラッシュは……普段rx使ってるのでという言い訳を。

    (replace-regexp-in-string (rx string-start (* (or blank "\n")) "\n")
    ""
    " \n\n \n hoge\n \n")
    818 : 805 - 2013/11/13(水) 12:01:28.13 (+8,-30,-58)
    >>816
    ありがとうございます。
    それは前も試しましたが void-function になります。

    compile オプションの説明、Info 見ても正直よくわからないんですよね。
    elc ファイル直接見てもわかるんですが事前にコンパイルするって命令ではないようです。
    (この場合だと elc の中で moo が展開されていない)

    preactivate もいまいち使いどころがわからないし色々 advice は難しい・・・
    819 : 名無しさん@お腹 - 2013/11/13(水) 12:34:44.71 (+5,-29,-12)
    >>818
    24.3.1 で (bar) -> "moo!" となるけど?
    820 : 805 - 2013/11/13(水) 12:47:16.49 (+10,-30,-56)
    >>819
    (fboundp 'moo) が t になってませんか?
    (symbol-function 'bar) でコンパイル済みの中身がでますが、その中で moo は展開されていますでしょうか。

    なにかの拍子に未コンパイルの方を一度でもロードしてしまうと
    moo が定義されてしまってそのまま動いてしまったりするので。
    821 : 名無しさん@お腹 - 2013/11/13(水) 14:41:26.54 (+38,-30,-54)
    >>820
    じゃあこれでどうだ?

    (defadvice bar (after ad-bar preactivate activate)
    (setq ad-return-value (moo)))

    (eval-when-compile
    (ad-compile-function 'bar))
    822 : 805 - 2013/11/13(水) 15:19:12.49 (+62,+29,-10)
    >>821
    うーむ、結果変わりませんでした。
    preactivate の説明みてると事前にコンパイルしてくれても良さそうな内容に見えるんですけどねえ・・
    823 : 名無しさん@お腹 - 2013/11/13(水) 16:23:51.22 (+35,+2,-40)
    emacs終了時に.recentfへの書き込み時間がいつの間にか伸びるようになってしまいました
    package経由でインストールしたelispのせいだと思うのですが、どれが原因か絞り切れていません
    なにかいい調べ方はありますか
    824 : 名無しさん@お腹 - 2013/11/13(水) 16:41:56.79 (+30,-30,-65)
    recentf-save-list が終了時に .recentf に保存する関数みたいだけど、
    実際にそれに時間かかってるのか、それとも他のが終了時に時間かかってて
    たまたま .recentf に保存してるメッセージが長く表示されてるように見えてるだけなのか見てみたほうがいいかも。
    benchmark とか elp 使って recentf-save-list の実行にかかる時間測ってみるとかね。
    あと kill-emacs-hook の中身とか。
    825 : 名無しさん@お腹 - 2013/11/13(水) 19:15:16.60 (-1,-29,-25)
    バイナリファイルをオープンして最初の4byteをリトルエンディアンでリードして返す、
    みたいな処理はemacs lispでどう書けますか?
    C言語ならfopenしてfreadするだけなのですが…
    826 : 名無しさん@お腹 - 2013/11/13(水) 19:29:14.98 (+36,-30,-66)
    一旦どっかのバッファに読む必要があるけど insert-file-contents-literally を使えばいいと思う。
    これだとファイルのどこをどれだけ読むか指定出来る。
    文字コード変換とかしないで読み込んでくれるけど、(set-buffer-multibyte nil) は必要だったかもしれない。
    827 : 名無しさん@お腹 - 2013/11/13(水) 19:46:38.84 (+62,+29,-32)
    >>826
    ありがとうございます!
    やっぱりバッファに読む必要があるんですね。
    ファイルサイズが大きいとメモリ喰いそうだけど、仕方ないんですかね。。
    まずは教えて頂いた関数をヒントに試してみます。
    828 : 名無しさん@お腹 - 2013/11/13(水) 19:52:09.47 (+9,-30,-244)
    こんな感じ?なんかもっとスッキリ出来るのかな。
    あと素の emacs だと 28bit までしか扱えなかったんじゃなかったっけ。最近のは違うんだろうか。

    あと insert-file-contents-literally は全部読み込むわけじゃなく、指定した範囲だけ読み込むから
    とんでもなく大きい場合でも問題ないよ。

    (defun read-dword (filename pos)
    (with-temp-buffer
    (set-buffer-multibyte nil)
    (insert-file-contents-literally filename nil pos (+ pos 4))
    (let ((result 0))
    (dotimes (c 4 result)
    (setq result (+ (lsh result 8)
    (string-to-char (buffer-substring (- 4 c) (- 5 c))))))

    )))
    829 : 名無しさん@お腹 - 2013/11/14(木) 00:49:11.09 (+4,-30,-73)
    >>828
    サンプルありがとうございます。期待通りに動作しました。
    insert-file-contents-literallyは&optionalの引数(beg end)で読み込む範囲を指定できるのですね。
    ちゃんとマニュアル読むべきでした。すみません。
    あと自分のはemacs 23.4.1ですが整数型はsigned 29bitまでしか扱えませんでした。
    830 : 名無しさん@お腹 - 2013/11/14(木) 12:22:56.48 (+48,+21,+1)
    >>824
    有難うございます!
    831 : 名無しさん@お腹 - 2013/11/16(土) 17:18:42.52 (+67,+29,-18)
    Emacsがどういうオプションでビルドされたかを見るにはどうすればいい?
    832 : 名無しさん@お腹 - 2013/11/16(土) 20:09:14.64 (+30,-29,-3)
    system-configuration-options でわかるみたいだ
    833 : 名無しさん@お腹 - 2013/11/17(日) 05:15:43.15 (-1,-29,-8)
    たまに *Quail Completions* ってバッファが出来てるんですけど
    これは何者ですか?
    834 : 名無しさん@お腹 - 2013/11/17(日) 08:36:04.83 (+9,-30,-124)
    ソースをagでググれば
    emacs/lisp/international/quail.el
    にありますね。
    簡易入力メソッドフレームワーク "qual" のつくるバッファ。

    Emacsの入力フレームワークは「たまご」egg(たくさんまたせてごめんなさい)
    →eggの簡易版「うずらのたまご」quail.el
    →quailの簡易版「こまどりのたまご」robin.el
    という形になっていて、ちょっとしたものをつくる場合は robin.el は便利。
    835 : 名無しさん@お腹 - 2013/11/17(日) 10:02:17.99 (+4,-29,-18)
    >>834
    ありがとうございます。そういう事だったのですね。
    Win や Mac の IME しか使ったことなくて分かってませんでした。
    単に \ を入力したつもりが Ctrl + \ を押しちゃってただけでした・・・
    836 : 名無しさん@お腹 - 2013/11/18(月) 00:53:06.94 (+39,-30,-110)
    smartrepを導入したのですが、smartrepによる連続操作実行後にカーソルキーによるカーソルの移動や
    Deleteキーによる文字削除の動作を行うと、smartrepの解除と共にアルファベットが入力されてしまうのですが
    これを回避する方法はありますか??
    C-fやC-b、C-dを使えば問題ないのですが・・


    環境は Windows + Cygwin です。
    837 : 831 - 2013/11/18(月) 01:52:01.08 (+58,+26,-1)
    >>832
    おお!これだ!ありがとう!
    838 : 名無しさん@お腹 - 2013/11/18(月) 15:46:47.28 (+72,+29,-118)
    >>836
    Mac使ってて、そういう現象は確認できなかったけど…
    他のライブラリが影響を及ぼしていないかを確認するため、
    素Emacsでsmartrep以外全てオフにした最小限の状態でも
    同じ現象が起こるか確認できる?それで起こるなら
    そのコードを張ってみてください…
    839 : 名無しさん@お腹 - 2013/11/19(火) 00:55:47.81 (+7,-29,-40)
    >>838
    Macで.emacs.dを削除して最小構成でやってみたのですが、
    C-x oooooで画面を切り替えたあと→を押すと「C」と入力されてしまいます。

    設定は以下になります。
    840 : 名無しさん@お腹 - 2013/11/19(火) 01:01:35.18 (+9,-30,-180)
    (require 'package)
    (add-to-list 'package-archives '("marmalade" . "略"))

    ;; load-pathを追加する関数を定義します.
    (略

    (add-to-load-path "elisp")
    (add-to-load-path "elpa")

    ;;; C-x o,o,o...で画面切り替えを行えるようにします。C
    (require 'smartrep)
    (smartrep-define-key global-map (kbd "C-x")
    '(("o" . 'other-window)))
    841 : 名無しさん@お腹 - 2013/11/19(火) 06:15:48.72 (+28,-29,-64)
    >>840
    こうさん。こちらじゃ再現しない。最小限構成にしても出るのなら、
    もうEmacsそのものの環境の問題とかじゃないかな?

    でも確かに C-x o のsmartrep 化は便利だなぁ。
    いつも windmove で動いてたけどこっちに乗り換えてみるか。
    842 : 名無しさん@お腹 - 2013/11/19(火) 08:24:01.35 (+41,+9,-22)
    >>841
    最後まで付き合ってくれてありがとうございました。
    これを機会にC-f,b,n,pを使用した操作に切り替える
    という手法で解決しようとおもいます!
    843 : 名無しさん@お腹 - 2013/11/19(火) 21:06:07.19 (+43,+15,-15)
    カーソルキーがエスケープシーケンスな環境とか。
    844 : 名無しさん@お腹 - 2013/11/19(火) 22:07:38.27 (+0,-27,-4)
    24.4とか、25って、どうなってるん?
    最近リリースないな
    845 : 名無しさん@お腹 - 2013/11/19(火) 23:02:57.58 (-1,-29,-46)
    24.4のリリースを検討し始めたとこだね。
    俺的な改善点はeshellでgitのログとか見れるようになるとこだな。(わかる人しかわからんか)
    846 : 名無しさん@お腹 - 2013/11/19(火) 23:15:58.99 (-1,-29,-63)
    っていうかgitのログすら見れんシェルを付けるなと。
    eshellって名乗るぐらいなら
    gitログくらいグラフィカルに表示しろ。
    847 : 名無しさん@お腹 - 2013/11/19(火) 23:20:46.75 (-1,-29,-13)
    eshell なんかまだ使ってる人いるんだな
    848 : 名無しさん@お腹 - 2013/11/20(水) 00:07:56.62 (-1,-29,-10)
    eshellはるびきちさんが推してたので一応使ってる
    849 : 名無しさん@お腹 - 2013/11/20(水) 01:27:10.80 (-1,-29,-28)
    つうかeshell以外なに使うんだ?
    850 : 名無しさん@お腹 - 2013/11/20(水) 02:11:18.24 (+57,+29,-21)
    普通にshell-mode
    と見せかけて通はterm、これ
    素人が手を出すとバッファからぬけられなくなって往生する諸刃の剣
    ←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitterで / emacs スレッド一覧へ
    スレッド評価: スレッド評価について
    みんなの評価 :
    タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。

    類似してるかもしれないスレッド


    トップメニューへ / →のくす牧場書庫について