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

    元スレEmacs Part 43

    emacs覧 / PC版 /
    スレッド評価: スレッド評価について
    みんなの評価 :
    タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。
    ←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitter

    801 = :

    次のバージョンていつリリースされんだろう?

    802 = :

    >>799
    なるほど
    ありがとう

    803 = :

    >>800
    \( \) を "" の中に書くときは "\\( \\)"
    ^ だと行頭すべてにマッチしてしまうので文字列の頭だけなら \\`

    (replace-regexp-in-string "\\`\\(?: *\n\\)+" "" " \n\n \n hoge\n \n")
    ;=> " hoge\n \n"

    805 = :

    マクロを 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 = :

    一部間違えました。
    (defadvice bar (before ad-bar activate)
    (moo))

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

    807 = :

    eval-when-compileで思ったが>>787でやってるキャッシュなんか
    全部eval-when-compileでやっちゃえばいいんじゃないかと思ったわ
    どうせ違う環境にもってったらそんときinit.elコンパイルし直すだろうしな

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

    みたいな
    マニュアルみてもコンパイル時に定数に置き換えるっていってるし

    808 = :

    >>806
    ad-return-value は before after advice では使えなかった記憶が。
    around advice 使うしかなかったような。

    811 = :

    原理的なおっ説教ですまないが、
    - advice を使う
    - cl パッケージを cl-* なしで使う
    という2重の意味でこまったことをしている気がする。。。

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

    Emacs 24.4. の nadvice.el が使えるようになったら色々と捗る気はするが、
    捗らないかもしれない。

    812 = :

    >>811
    advice はともかく cl-* を使ってるかどうかは関係なくね?
    どっちにしろ (require 'cl) しないと使えない上
    (require 'cl) はライブラリで使う時は eval-when-compile にしてランタイムに使うなってのは
    変わってないでしょ。

    813 = :

    >>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 = :

    (require 'cl) がランタイムで禁止だったのは同名のEmacs Lispの関数を上書きして、
    他のソフトがどっちを使っているのか分からなくなる問題があったため。

    最近のEmacs は、clパッケージの関数の先頭に全部 cl- をくっつけることで名前衝突を防ぎ、
    普通にrequire できる、 (require 'cl-lib) というのがあるので、支障がなければこっちを
    使うべき。

    815 = :

    色々調べたり試してみましたが advice の中で素直にマクロ展開させるのは無理そうでしたorz
    cl を止めて cl-lib にしたところコンパイル時の警告が出なくなったので、
    自前のマクロ用に>>813さんに指摘された関数の形でくくりだすのと合わせて対応してみます。

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

    ありがとうございました。

    816 = :

    >>805,806
    (defadvice bar (after ad-bar compile activate)
    (setq ad-return-value (moo)))

    817 = :

    >>803-804
    ありがとう。汚いコードを書かずに済みました。
    バックスラッシュは……普段rx使ってるのでという言い訳を。

    (replace-regexp-in-string (rx string-start (* (or blank "\n")) "\n")
    ""
    " \n\n \n hoge\n \n")

    818 = :

    >>816
    ありがとうございます。
    それは前も試しましたが void-function になります。

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

    preactivate もいまいち使いどころがわからないし色々 advice は難しい・・・

    819 = :

    >>818
    24.3.1 で (bar) -> "moo!" となるけど?

    820 = :

    >>819
    (fboundp 'moo) が t になってませんか?
    (symbol-function 'bar) でコンパイル済みの中身がでますが、その中で moo は展開されていますでしょうか。

    なにかの拍子に未コンパイルの方を一度でもロードしてしまうと
    moo が定義されてしまってそのまま動いてしまったりするので。

    821 = :

    >>820
    じゃあこれでどうだ?

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

    (eval-when-compile
    (ad-compile-function 'bar))

    822 = :

    >>821
    うーむ、結果変わりませんでした。
    preactivate の説明みてると事前にコンパイルしてくれても良さそうな内容に見えるんですけどねえ・・

    823 = :

    emacs終了時に.recentfへの書き込み時間がいつの間にか伸びるようになってしまいました
    package経由でインストールしたelispのせいだと思うのですが、どれが原因か絞り切れていません
    なにかいい調べ方はありますか

    824 = :

    recentf-save-list が終了時に .recentf に保存する関数みたいだけど、
    実際にそれに時間かかってるのか、それとも他のが終了時に時間かかってて
    たまたま .recentf に保存してるメッセージが長く表示されてるように見えてるだけなのか見てみたほうがいいかも。
    benchmark とか elp 使って recentf-save-list の実行にかかる時間測ってみるとかね。
    あと kill-emacs-hook の中身とか。

    826 = :

    一旦どっかのバッファに読む必要があるけど insert-file-contents-literally を使えばいいと思う。
    これだとファイルのどこをどれだけ読むか指定出来る。
    文字コード変換とかしないで読み込んでくれるけど、(set-buffer-multibyte nil) は必要だったかもしれない。

    827 = :

    >>826
    ありがとうございます!
    やっぱりバッファに読む必要があるんですね。
    ファイルサイズが大きいとメモリ喰いそうだけど、仕方ないんですかね。。
    まずは教えて頂いた関数をヒントに試してみます。

    828 = :

    こんな感じ?なんかもっとスッキリ出来るのかな。
    あと素の 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 = :

    >>828
    サンプルありがとうございます。期待通りに動作しました。
    insert-file-contents-literallyは&optionalの引数(beg end)で読み込む範囲を指定できるのですね。
    ちゃんとマニュアル読むべきでした。すみません。
    あと自分のはemacs 23.4.1ですが整数型はsigned 29bitまでしか扱えませんでした。

    830 = :

    >>824
    有難うございます!

    831 = :

    Emacsがどういうオプションでビルドされたかを見るにはどうすればいい?

    832 = :

    system-configuration-options でわかるみたいだ

    834 = :

    ソースをagでググれば
    emacs/lisp/international/quail.el
    にありますね。
    簡易入力メソッドフレームワーク "qual" のつくるバッファ。

    Emacsの入力フレームワークは「たまご」egg(たくさんまたせてごめんなさい)
    →eggの簡易版「うずらのたまご」quail.el
    →quailの簡易版「こまどりのたまご」robin.el
    という形になっていて、ちょっとしたものをつくる場合は robin.el は便利。

    835 = :

    >>834
    ありがとうございます。そういう事だったのですね。
    Win や Mac の IME しか使ったことなくて分かってませんでした。
    単に \ を入力したつもりが Ctrl + \ を押しちゃってただけでした・・・

    836 = :

    smartrepを導入したのですが、smartrepによる連続操作実行後にカーソルキーによるカーソルの移動や
    Deleteキーによる文字削除の動作を行うと、smartrepの解除と共にアルファベットが入力されてしまうのですが
    これを回避する方法はありますか??
    C-fやC-b、C-dを使えば問題ないのですが・・


    環境は Windows + Cygwin です。

    837 = :

    >>832
    おお!これだ!ありがとう!

    838 = :

    >>836
    Mac使ってて、そういう現象は確認できなかったけど…
    他のライブラリが影響を及ぼしていないかを確認するため、
    素Emacsでsmartrep以外全てオフにした最小限の状態でも
    同じ現象が起こるか確認できる?それで起こるなら
    そのコードを張ってみてください…

    839 = :

    >>838
    Macで.emacs.dを削除して最小構成でやってみたのですが、
    C-x oooooで画面を切り替えたあと→を押すと「C」と入力されてしまいます。

    設定は以下になります。

    840 = :

    (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 = :

    >>840
    こうさん。こちらじゃ再現しない。最小限構成にしても出るのなら、
    もうEmacsそのものの環境の問題とかじゃないかな?

    でも確かに C-x o のsmartrep 化は便利だなぁ。
    いつも windmove で動いてたけどこっちに乗り換えてみるか。

    842 = :

    >>841
    最後まで付き合ってくれてありがとうございました。
    これを機会にC-f,b,n,pを使用した操作に切り替える
    という手法で解決しようとおもいます!

    843 = :

    カーソルキーがエスケープシーケンスな環境とか。

    844 = :

    24.4とか、25って、どうなってるん?
    最近リリースないな

    850 = :

    普通に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一覧へ
    スレッド評価: スレッド評価について
    みんなの評価 :
    タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。

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


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