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

    私的良スレ書庫

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

    元スレEmacs Part 39

    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
    601 : 名無しさん@お腹 - 2012/01/07(土) 22:46:09.78 (+3,-30,-129)
    http://blog.livedoor.jp/dankogai/archives/51763038.html

    (require 'cl)
    ; cl

    (defun mapbetween (f l)
    (let (y)
    (mapl #'(lambda (x)
    (when (cadr x)
    (push (funcall f (cadr x) (car x)) y)))
    l)
    (nreverse y)))
    ; mapbetween

    (mapbetween #'+ '(1 2 3 4 5))
    ; (3 5 7 9)

    (mapbetween #'- '(0 1 4 9))
    ; (1 3 5)
    602 : 名無しさん@お腹 - 2012/01/07(土) 22:47:16.57 (+57,+29,-17)
    いや、ダンコーガイに直接コメントしてやれよ
    603 : 名無しさん@お腹 - 2012/01/07(土) 22:47:31.32 (+4,-30,-262)
    >>527

    もう解決してるかもしれないけど、別のスクリプト (qlgrep) に
    lgrep を包むって方法は採れそう。

    #!/bin/sh

    lgrep "$@" > /dev/null 2>&1

    さらに別の関数 (find-lgrep-dired) も用意する。

    (defun find-lgrep-dired (dir regexp)
    (interactive "DFind-grep (directory): \nsFind-grep (grep regexp): ")
    (find-dired dir
    (concat "-type f -exec qlgrep - "
    (shell-quote-argument regexp)
    " "
    (shell-quote-argument "{}")
    " "
    ;; Doesn't work with "+".
    (shell-quote-argument ";"))))
    604 : 名無しさん@お腹 - 2012/01/08(日) 12:25:43.23 (-3,-29,-12)
    which-func-mode ってなんであんなにお馬鹿なんだろう
    605 : 名無しさん@お腹 - 2012/01/08(日) 12:29:35.16 (+34,+16,+1)
    汎用だからね。
    606 : 名無しさん@お腹 - 2012/01/08(日) 13:46:03.01 (-1,-29,-15)
    minibuffer だけスクロールバー無しって出来るんでしょうか?
    607 : 名無しさん@お腹 - 2012/01/08(日) 14:16:32.10 (+18,-29,-77)
    >>597
    解説とか殆ど見たことないけど、emacs23からは
    インデントカスタマイズ用の smie ってライブラリが入ってるみたい。
    つかったことないけどドキュメント読んだ感じ結構凝ったこと出来そうね。

    http://www.gnu.org/software/emacs/manual/html_node/elisp/SMIE.html#SMIE

    emacs24 の octave-mode とかは実際に使ってるみたいだから見てみたけど
    文法定義から始まる重量級のライブラリだなこれ
    608 : 名無しさん@お腹 - 2012/01/08(日) 17:34:12.70 (+11,-30,-46)
    diredでファイル一覧を表示させた後,そこに表示されたあるファイルについ
    て,フルパス付きのファイル名をkill-ring-saveする方法はあるでしょうか。
    ちょっとわかりにくかもしれませんが,例えば,diredで一覧表示した.emacs
    に適用したなら,/home/hogehoge/.emacs という情報をコピペできる関数を探
    しています。
    609 : 名無しさん@お腹 - 2012/01/08(日) 17:49:12.34 (+66,+1,-4)
    lookupってもう終わってるの? これの次は?
    610 : 名無しさん@お腹 - 2012/01/08(日) 17:51:00.10 (-6,-29,+0)
    >>608
    C-0w
    611 : 名無しさん@お腹 - 2012/01/08(日) 19:00:19.17 (+4,-30,-157)
    >>608
    C-u 0 w

    w runs the command dired-copy-filename-as-kill, which is an
    interactive compiled Lisp function in `dired.el'.

    It is bound to w.

    (dired-copy-filename-as-kill &optional ARG)

    Copy names of marked (or next ARG) files into the kill ring.
    The names are separated by a space.
    With a zero prefix arg, use the absolute file name of each marked file.
    612 : 名無しさん@お腹 - 2012/01/08(日) 19:51:29.65 (+99,+29,-1)
    >>609
    まだ開発続いてると思うけど。
    613 : 名無しさん@お腹 - 2012/01/08(日) 20:38:47.17 (+6,-29,-26)
    >>609
    lookup て辞書検索できる lookup のことかな。
    次といっても dict と epwing が理解できればそれで十分に思える、自分には。
    614 : 名無しさん@お腹 - 2012/01/08(日) 20:54:03.71 (-1,-29,-24)
    epwing自体がおわコンというか…
    変換スクリプトもメンテされてないし、入手不可能だったり。
    615 : 名無しさん@お腹 - 2012/01/08(日) 20:57:40.10 (+29,-29,-17)
    ネット辞書から引けたほうがまだいいわな。
    ただ emacs-w3m がいまいちだからねえ。

    emacs-xwidget + webkit が安定して使えるようになったらうっはうはなんだが・・・
    616 : 名無しさん@お腹 - 2012/01/08(日) 21:14:40.45 (+85,+25,+1)
    >>615
    それなら普通にブラウザ使う方がいい。
    617 : 名無しさん@お腹 - 2012/01/08(日) 21:56:44.63 (+71,+29,-94)
    >>612
    RHEL6のx64でまともに動かんかった
    emacsが悪いのか外部が悪いのかよく分からん
    4文字の単語を退いたときだけ駄目とか変な挙動いろいろで調べる気が起きん
    618 : 名無しさん@お腹 - 2012/01/08(日) 22:02:12.17 (+56,+17,+1)
    >>616
    むしろブラウザだけでいい
    619 : 名無しさん@お腹 - 2012/01/08(日) 22:21:01.13 (-1,-29,-21)
    firefox+keysnailにファイルエディット機能つければemacsの代わりに使えるんじゃね?
    620 : 名無しさん@お腹 - 2012/01/08(日) 22:25:56.90 (+45,+17,-3)
    むしろfirefoxにemacsを組み込んだ方が
    621 : 名無しさん@お腹 - 2012/01/08(日) 22:34:39.67 (+37,-28,-5)
    ブラウザにEmacs組み込むのと
    Emacsにブラウザ組み込むのどっちが楽だろう
    622 : 名無しさん@お腹 - 2012/01/08(日) 22:42:25.03 (+56,+29,-1)
    >>621
    後者は既出感が…
    623 : 名無しさん@お腹 - 2012/01/08(日) 22:44:19.10 (+54,+26,-17)
    ちゃんとJavaScript 解釈してかつ elisp からブラウザの状態弄れるのがいいなあ
    624 : 名無しさん@お腹 - 2012/01/08(日) 22:48:48.36 (+51,+19,-13)
    なんか面白い elisp ないかしらん
    625 : 名無しさん@お腹 - 2012/01/09(月) 01:29:57.86 (+14,-29,-1)
    >>624
    seimei.el
    tako.el
    trr.el
    626 : 名無しさん@お腹 - 2012/01/09(月) 01:43:55.29 (+57,+29,-27)
    なんであれだけ発行部数出てないんだろうねぇ。
    627 : 名無しさん@お腹 - 2012/01/09(月) 02:55:49.39 (+7,-30,-181)
    >>621
    Javascript PC Emulator
    http://bellard.org/jslinux/

    で、ブラウザ上でQEmacsが使えます。

    ~ # which emacs
    /usr/bin/emacs

    ~ # ls -l /usr/bin/emacs
    lrwxrwxrwx 1 root root 2 May 14 2011 /usr/bin/emacs -> qe

    ~ # ls -l /usr/bin/qe
    -rwxr-xr-x 1 root root 108240 May 16 2011 /usr/bin/qe

    ~ # strings /usr/bin/emacs | fgrep -i version
    QEmacs version 0.3.1, Copyright (c) 2000-2003 Fabrice Bellard
    629 : 名無しさん@お腹 - 2012/01/09(月) 08:39:46.95 (+17,-18,-1)
    >>625
    tako.el みて普通に日本語のシンボル名作れることに驚愕した
    630 : 名無しさん@お腹 - 2012/01/09(月) 12:53:58.93 (+3,-30,-111)
    関数の中で直接呼び出されている関数*だけ*置き換える方法ってありませんでしょうか?

    (defun greeting (msg who) (message "%s, %s" msg who))
    (defun hello (who) (message "===hello===") (greeting "hello" who))

    みたいになっている時、 hello の中で直接呼ばれてる message だけ置き換えたいのです。
    flet を使うと greeting の中の message まで置き換えられてしまいます。

    関数定義をそのまま引っ張ってきて書き換えたものを再定義したり fset したりする以外に方法はありませんでしょうか?
    631 : 名無しさん@お腹 - 2012/01/09(月) 12:58:14.67 (-1,-29,-7)
    関数を around アドバイスして flet ってやったらできないんだっけ?
    632 : 名無しさん@お腹 - 2012/01/09(月) 12:58:40.71 (+50,+29,-1)
    あ、馬鹿なこと言ったごめ。
    633 : 名無しさん@お腹 - 2012/01/09(月) 13:57:27.13 (+62,+29,-64)
    全然うまい方法が思いつかなかったので、じゃあせめて置き換え後の関数で
    呼び出し元の関数を判断して挙動を変えようと思ったのですが、
    今度は呼び出し元の関数の調べ方がわかりません。

    http://b.hatena.ne.jp/IMAKADO/elisp/callee/ とかは見つかったんですが
    肝心のリンク先が壊れて見れないという・・・トレースとか書いてあるから
    バックトレースの内容を参照するってことなんでしょうかね・・難しい。
    634 : 名無しさん@お腹 - 2012/01/09(月) 14:42:51.45 (+3,-30,-280)
    なんかものすごく力技な感じになりましたが一応実装できたので貼っておきます。
    なんかもっとスマートな方法はないのか・・・・

    (defun greeting (msg who) (message "%s, %s" msg who))
    (defun hello (who) (message "===hello===") (greeting "hello" who))

    (defun callee ()
    "呼び出し元の関数名を文字列で返す"
    (let ((bt (split-string (with-output-to-string
    (backtrace)) "^ *\\|\n" t)))
    (while (and bt
    (not (string-match "^callee\\>" (pop bt)))))
    (cadr bt)))

    (defadvice hello (around ad-hello-no-heading activate compile)
    "hello が直で呼び出している message だけ ignore に置き換える"
    (let ((org-message (symbol-function 'message)))
    (flet ((message (format-string &rest args)
    (if (string-match "^ad-Orig-hello\\>" (callee)) ;; advice の場合は ad-Orig-* になる
    (ignore)
    (apply org-message format-string args))))
    ad-do-it)))
    635 : 597 - 2012/01/09(月) 16:29:31.21 (+15,-30,-304)
    >>598-599 >>607
    ありがとうございます。
    indent-line-function等で制御するよりも>>607を改変すればよさそうだと思いました
    ですが改変がうまくいきません

      if (x>0) {
        proc1()
        proc2()
      } else if (x<0) {
        proc3()
        proc4()
      } else {
        proc5()
        proc6()
      }

    こういう風に自動的にインデントさせようとして
    http://www.gnu.org/software/emacs/manual//html_node/elisp/SMIE-Grammar.html#SMIE-Grammar
    ("then" insts "end")を("{" insts "}")、
    ("if" exp "then" inst "else" inst)を("if" exp inst "else" inst)、
    (insts (insts ";" insts) (inst))を(insts (insts insts) (inst))、
    に書き換えましたが、{を入力してC-jを押すと(newline-and-indent)
    (wrong-type-argument integer-or-marker-p nil)
    とエラーが出ました
    このif (test) {procs} else if (test) {procs} else {procs} を
    (procsは改行区切りです)
    インデントさえできればいいのですが
    どうすればよいでしょうか
    636 : 597 - 2012/01/09(月) 16:39:18.77 (+7,-30,-119)
    あと、調べていて気づいたのですが
    http://www.emacswiki.org/emacs/IndentingC#toc1
    このcc modeをdefine-generic-modeで作成したモードで
    使えればよさそうだと思いました
    というのも整えようとしているのがc++ likeのコードに似ているからです
    上のsmie改変がうまくいかないときにはこれで十分です

    define-generic-modeで作成したモードの初期化部分で
    このcc modeの機能を利用することはできるでしょうか
    637 : 名無しさん@お腹 - 2012/01/09(月) 16:39:19.97 (+9,-29,-33)
    ちなみにサンプルの設定ではうまく動いたの?

    smieって何やってるのかわからなかったけど
    smie-setup で indent-line-function 設定してるのな。
    ちょっと真面目に使い方勉強してみるか。
    638 : 名無しさん@お腹 - 2012/01/09(月) 16:40:28.70 (+6,-29,-20)
    >>636
    特定のモードを元にモードを作る場合は
    define-derived-mode を使うといいよ。
    639 : 名無しさん@お腹 - 2012/01/09(月) 17:09:57.88 (+6,-29,-16)
    >>635
    "}"とかが token として認識されてないんじゃないの?
    640 : 597 - 2012/01/09(月) 17:50:59.31 (+46,-30,+0)
    >>637
    はい。サンプルは動きました。↓の各セクションから以下の設定をコピペして
    http://www.gnu.org/software/emacs/manual//html_node/elisp/SMIE.html#SMIE
    (eval-when-compile (require 'cl))
    (require 'smie)
    (defvar sample-smie-grammar
    (defvar sample-keywords-regexp
    (defun sample-smie-forward-token ()
    (defun sample-smie-backward-token ()
    インデント分をこう設定し
    (defvar sample-indent-basic 4)
    メジャーモードを作成する (define-generic-mode の初期化部分で
    (list (function (lambda () (add-hook 'hoge-mode-hook (lambda ()
    (smie-setup sample-smie-grammar #'sample-smie-rules)
    と書きました。
    あと、>>635の(insts (insts ";" insts) (inst))は書き換えないままでした
    書き換えるとエラーになります すみません

    >>639
    確かにtokenの設定が抜け落ちていました。ですが
    (defvar sample-keywords-regexp
    (regexp-opt '("+" "*" "," ";" ">" ">=" "<" "<=" ":=" "="))) を
    (defvar sample-keywords-regexp
    (regexp-opt '("+" "*" "," ";" ">" ">=" "<" "<=" ":=" "=" "{" "}" "(" ")")))
    に書き換えましたがだめでした

    >>638
    なるほど、ただキーワードの色づけ設定は引き継ぎたくないのでdefine-gereric-modeで設定しました
    インデントとキーフックのみ特定のモードを引き継ぐという機能があればいいのですが
    641 : 名無しさん@お腹 - 2012/01/09(月) 18:02:41.16 (+63,+29,-4)
    >>640
    自分とこでちょっと動かしてみたいけど長そうだから
    ↓ここにコピペしてURL教えてくれ
    http://paste.lisp.org/new/emacs
    642 : 597 - 2012/01/09(月) 19:05:20.29 (+41,+18,+1)
    書きました
    http://paste.lisp.org/display/126938
    よろしくお願いします
    643 : 名無しさん@お腹 - 2012/01/09(月) 19:42:06.40 (+3,-30,-65)
    うおお、難しい
    とりあえずコメントの ';' と 区切り文字の ';' が干渉してるのと
    sample-smie-forward-token で a+b みたいなのが一気に通過しちゃうのが気になったけど
    じっくり取り組まないとわからんなあ・・・
    644 : 名無しさん@お腹 - 2012/01/09(月) 21:32:24.24 (+3,-30,-66)
    サンプルのまんまで実行しても emacs 23 では wrong-type-argument が出るねえ。
    emacs 24 で実行するとエラーは出ないけどちゃんと動いてるような感じがしない。
    サンプルそのままで実行してもぶら下がりelseがちゃんと処理できてないように見えるなぁ。
    645 : 名無しさん@お腹 - 2012/01/10(火) 00:11:10.77 (+5,-30,-129)
    >>629
    skk に含まれてる skk-ja-names.el とか見てみろよ。
    こんなだぞ。

    (defalias 'SKKモード 'skk-mode)
    (defalias 'SKKのバージョン 'skk-version)
    (defalias 'SKKのバグを報告する 'skk-submit-bug-report)
    (defalias 'SKKのチュートリアル 'skk-tutorial)
    646 : 名無しさん@お腹 - 2012/01/10(火) 11:26:09.75 (-2,-30,-61)
    load-path の追加に normal-top-level-add-subdirs-to-load-path を使うのを
    止めたら起動時間が 500~700ms 近く早くなって感動した
    647 : 名無しさん@お腹 - 2012/01/10(火) 15:26:23.62 (-1,-29,-36)
    emacs使いの大半はcapslockをctrlにしている?
    それともそのまま?
    648 : 名無しさん@お腹 - 2012/01/10(火) 15:30:40.42 (+57,+29,-2)
    そんなの調査のしようがないからなぁ。
    649 : 名無しさん@お腹 - 2012/01/10(火) 15:34:21.26 (+32,-29,-28)
    大半かどうかは知らんけどEmacs関係なく一定数いることは確か。
    MSなんか公式でCTRL<=>CAPS逆にするドライバ配布してるし。

    これも呪いの一つだとは思う。
    650 : 名無しさん@お腹 - 2012/01/10(火) 17:29:15.59 (+3,-30,-54)
    なんでこれでエラーがでるんでしょう?
    (string-match (migemo-get-pattern "popw") "popwin")

    ここまでは大丈夫なのに。
    (string-match (migemo-get-pattern "pop") "popwin")

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

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


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