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

    元スレEmacs Part 42

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

    901 = :

    >>897
    start-processとか普通にあるやん

    902 = :

    >>901
    emacsとプロセスとのデータのやりとりは?
    特にプロセスからemacsにデータとかわたせるの?しかも非同期にとか

    903 = :

    中身全然読んでないけど非同期IOはできるみたいだね
    http://www.gnu.org/software/emacs/manual/html_node/elisp/Processes.html

    905 = :

    githubにdeffered.elとかあるけど使い方がよくわからん
    同作者のemacs-epcとか使ってemacs外部と直接関数呼び出し、戻り値の形式でやり取りできたら面白そうと思ったけど
    プロトコルがわからん
    単に長さ付きのS式でやり取りしてるなっていうのはまぁわかるけど

    906 = :

    dbus.elを使えばデータの受け渡しなどはできそう。

    907 = :

    >>902
    > >>901
    > emacsとプロセスとのデータのやりとりは?
    > 特にプロセスからemacsにデータとかわたせるの?しかも非同期にとか
    立ち上げたプロセスと標準入出力でやり取りする。
    send-process~とかあるよ。
    あとはset-process-filterとかsentinelとか使えばやりとりできます。

    908 = :

    それが面倒だからわざわざdbus.elとか使うんだよなぁ…
    非同期プロセス関連は長年メンテされてるelispでもバグだらけで
    とても素人が使えるものじゃないって代物だわ

    909 = :

    >>908
    > 非同期プロセス関連は長年メンテされてるelispでもバグだらけで

    例えばどのelispだろう?そんなに酷くない気がするけど。

    910 = :

    vc.elとかgnus.elみたいな標準のでもバグ報告でしょっちゅうerror in process sentinelでてる
    ためしにこのエラーメッセージで検索したらひっかかるわひっかかるわ
    ノンブロッキングIOなんて昔からバグの温床だしそんなもんといえばそんなもんか

    911 = :

    buffer消しちゃったりしたときのアレかな。バグといっていいのかどうか。
    Emacsが対話環境も提供する以上、ある程度は仕方ない気がする。

    912 = :

    >>908
    > それが面倒だからわざわざdbus.elとか使うんだよなぁ…
    ん、dbus.elってなに?全然しんらないんだけど・・。

    913 = :

    >>898
    あざーっす。
    試してみます。

    914 = :

    lispで質問です。
    以下のようなリストがあるとします。
    (hoge '(("a" a) ("b" b) ("b" b) ("b" b) ("c" c) ("b" b) ("b" b) ("b" b)))

    このなかでシンボルcを持つエレメントをみつけて削除したいのですが、すごくめんどくさくて困ってます。
    hogeの中身が連想リストの場合は
    (setq hoge (delete (rassq 'c hoge) hoge)
    ですむのですが、
    hogeが連想リストじゃないので、rassqが使えません。
    なので do をつかって
    (let* ((hoge '(("a" a)
    ("b" b)
    ("b" b)
    ("b" b)
    ("c" c)
    ("b" b)
    ("b" b)
    ("b" b)))
    find)
    (do ((cnt 0 (1+ cnt)) ) ((or find (null (nth cnt hoge))) )
    (when (setq find (eq 'c (car (cdr (nth cnt hoge)))))
    (setq hoge (delete (nth cnt hoge) hoge))))
    hoge)
    といったコードになってしまいます。
    もっとシンプルにできる方法はないでしょうか?

    915 = :

    >>914
    ("c" c) って要は ("c" . (c)) のことなんだから
    eq?じゃなくてequal?を使うrassocの方を使って
    (setq hoge (delete (rassoc '(c) hoge) hoge)
    でいいんじゃないの?

    918 = :

    そもそも cons cell にしとけばいいのに
    別にいいけど

    919 = :

    >>918
    お前わかってねーな

    920 = :

    まーな

    921 = :

    >>899
    できました。ありがとう俺!

    922 = :

    ある特定のメジャーモードで動いているとき、もしくは特定のバッファだけ、
    ある既存関数の挙動を置き換えたいんですが方法ありますか?

    defadviceとかだと、他のモードやバッファでの動作もかわっちゃいますよね。

    923 = :

    defadvice の先頭にメジャーモードの判定を入れるのはどう?

    (defadvice hoge (around hoge-advice activate )
    (if (eq major-mode 'huga-mode)
    (なんか処理)
    ad-do-it))

    924 = :

    defadviceしてその中でmajor-modeとか使って分岐すればいいじゃん。

    925 = :

    速さも中身でも負けた。完敗です。

    926 = :

    >>923
    ありがとうございます。
    これでいってみます。

    929 = :

    >>922
    after-change-major-mode-hook とかでアドバイス自体を有効/無効にする
    ってのはどうでしょ
    ad-enable-regexp と ad-disable-regexp でまとめて切り替えられるし

    930 = :

    define-minor-modeでマイナーモード作ってるんですが
    (my-minor-mode)
    が呼ばれたときに、内部で条件判定を行ってモードをonにしたくないときってどうすればいいんでしょうか?
    define-minor-modeのbody内部の記述だけでは無理?

    931 = :

    リストにあるファイルをstart-processに渡すdolistを書いていたのですが
    ファイルがある一定数以上になると
    Creating pipe: too many open files
    といわれてしまいどう対処すべきかわかりません。
    パイプ数を増やそうとおもってulimit -pしてみたのですが変更できないみたいです。
    デフォではパイプが8ぽいので、ファイルが8までは大丈夫でそれを超えると上記のメッセージがでます。
    パイプ数を変更できない場合は、どのように対処したらよいでしょうか?

    932 = :

    >>930

    define-globalized-minor-mode あたり使うといいかも。

    auto-complete-mode-maybe が参考になるはず。

    あるいは (my-minor-mode -1) して関数内で強制的に off にするとかかな?

    >>931

    concurrent.el あたりを使えばできそうな気はする。
    dolist の中で待ちが発生していいなら start-process じゃなくて call-process を使うべき。

    933 = :

    >>932
    ありがとうございます。
    >define-globalized-minor-mode
    調べてみます。

    >concurrent.el
    こんな便利なのがあるんですね。
    deferredとかも。
    いろいろ使えそうなので見てみます。

    >dolist の中で待ちが発生していいなら start-process じゃなくて call-process を使うべき。
    待たせたくないので↑の方法でいってみます。

    934 = :

    make-variable-buffer-localで作成した変数を削除することはできませんか?
    たとえば
    (setq hoge 10)
    (make-variable-buffer-local 'hoge)
    (setq hoge 0)
    (print hoge)
    で 0 になり
    (kill-local-variable 'hoge)
    (print hoge)
    10 になります。
    しかしここで
    (setq hoge 5)
    を行うと、hogeはlocal-varになってしまうようです。
    上のコードをdescrible-variableで確認すると
    global > global + local > global > global + local
    になっているようで、kill はあくまで現在の参照先をglobalにするだけで、
    localの存在そのものを消しているわけではないような気がします。
    これを完全に削除するにはどうしたらいいでしょうか?

    936 = :

    make-variable-buffer-local ではなく make-local-variable を使う

    937 = :

    >>936
    外部パッケージでmake-variable-buffer-localされているので無理な状態です。
    初期化関数内でmake-variable-buffer-localされているなら
    defadviceでおきかえてmake-local-variableを使うようにできますが
    関数外なのでそれも無理です。

    938 = :

    >>937
    どうしたいのかいまいちわからんな。
    具体的なパッケージの名前も出してみたら?

    939 = :

    >>938
    emacs-clang-complete-asyncです。
    c++-modeバッファ毎にclang-completeプロセスを常駐させるので
    8個以上開くと、pipe errorになります。
    これを回避するために、バッファ毎にプロセス作成しているのをやめて、
    常に1つのみ常駐にして
    window-configuration-change-hook
    でウィンドウ切り替えを検出し、
    selected-window
    のバッファローカル変数のcflagsをプロセスに送信してコマンドライン更新を行うようにしたいのです。
    ぶっちゃけ、パッケージソースのほうをいじってしまえば直ぐに終わるのですが
    あまり外のを汚したくないので自分側でパッチを当ててます。
    その一環で、プロセスオブジェクトを保存する変数が
    make-variable-buffer-localされてしまっているのを
    kill-local-variableして、globalにしようとして上記の書き込みになりました。

    940 = :

    >>938
    ちょっと、パッケージのほうを書き換えて実験してみたんですが
    window-configuration-change-hook
    はあくまでサイズ変更とかでcallされるのであって
    ウィンドウ選択だけでは呼ばれないのですね。
    というわけで失敗・・。
    C-x oでウィンドウを選択操作する毎に呼び出されるフックとかがあるといいのですが・・。
    最悪 other-windowをdefadviceすればできますが・・。
    other-windowだけでなく、
    その他バッファをウィンドウに表示する関数や切り替え系をいろいろやらないと
    どんなケースでもよろしく動くようにならない気がします。

    とりあえず、可視ウィンドウでかつ選択されているバッファを取得して処理したい。
    取得&処理したいタイミングは、それらに切り替わった瞬間。
    ということですかね。

    あちこちにdefadviceしたりせずにもっと、シンプルに扱える仕組みとかないですかね。

    941 = :

    とりあえずやりたいことは
    defadvice select-window (after
    で全て解決できました。
    ただ、こういうbuilt-inのもっともよく使われる基底の関数をdefadviceするってどうなんですかね。

    942 = :

    >>937
    (unintern 'hoge)

    944 = :

    勢いが足りない

    945 = :

    C-SPCでset-mark-commandして、マウスでキャレットを移動させた後にC-wでkill-regionしても動作しない。
    C-SPCからキーボードでキャレット移動させた場合はきちんとkill-regionできるようにはできないですかね?

    946 = :

    emacsでwindows31Jって使えない?
    ruby書いてる時に
    Warning (mule): Invalid coding system `Windows-31J' is specified
    for the current buffer/file by the :coding tag
    って何回も出て来るんだけど

    948 = :

    >>945
    24.3.1だと希望通りの動作です。
    右ボタンだとどうなりますか?

    950 = :

    fletを使って既存の関数の挙動を変えたいんだけど、flet中で元の(オリジナルの)関数を呼びだすのってどうやればいいの?
    例えば message を「与えられた引数にhogeを付け加えて表示する」に変える場合、愚直に

    (flet ((original-message (str)
    (message str))
    (message (str)
    (original-message (concat "hoge " str))))
    (message "hello"))

    とすると当然無限ループになってしまう。


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

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


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