のくす牧場
コンテンツ
牧場内検索
カウンタ
総計: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
    401 : 396 - 2011/12/31(土) 22:54:22.58 (+63,+29,+0)
    >>397-400
    ありがとうございます。
    >>399
    これで完璧に解決しました。とても助かりました。
    402 : 名無しさん@お腹 - 2011/12/31(土) 23:11:00.92 (-1,-29,-41)
    TAB関連で
    tab-to-tab-stop の文字位置へ移動するにはどんなコード書けばいいんだろう?
    403 : 名無しさん@お腹 - 2011/12/31(土) 23:14:38.73 (-1,-29,-26)
    (move-to-tab-stop)じゃあかんの?
    404 : 名無しさん@お腹 - 2012/01/01(日) 00:07:44.48 (+57,+29,-16)
    Elispをすらすら書ける人は
    普段からlispに慣れている人なのかな
    尊敬するわ
    405 : 名無しさん@お腹 - 2012/01/01(日) 01:15:55.55 (+57,+29,-47)
    一口にLispっつーても色々あって、それぞれノウハウ違うから
    elispをスラスラ書ける人は普段からelispに慣れてる人だと思う
    406 : 名無しさん@お腹 - 2012/01/01(日) 01:48:01.75 (+57,+29,-63)
    リストの処理とかがスラスラ書けても
    バッファの弄り方とかテキストプロパティとかオーバレイとか辺りになってくると
    あんまりLisp関係ないもんね。
    407 : 名無しさん@お腹 - 2012/01/01(日) 12:40:54.90 (+33,-30,-138)
    暇なので elisp 紹介

    ■emacs で google map 表示

    http://julien.danjou.info/software/google-maps.el
    M-x google-maps して地名を入れるとpopupしたバッファに地図が表示される

    そのままだと地名がアルファベットになっちゃうので以下を追加
    (eval-after-load "google-maps"
    '(defadvice google-maps-static-show (before google-maps-set-lang activate)
    (ad-set-args 0 (append '(:language "ja")) (ad-get-args 0))))

    popwin の管理下に入れておくとうっとおしくなくて良い。
    408 : 名無しさん@お腹 - 2012/01/01(日) 12:43:07.23 (+3,-30,-60)
    oh... ちょっと間違った
    ↓ね。
    (defadvice google-maps-static-show (before google-maps-set-lang activate)
    (ad-set-args 0 (append '(:language "ja") (ad-get-args 0))))
    409 : 名無しさん@お腹 - 2012/01/01(日) 13:35:41.22 (+56,+28,-10)
    >>407
    ㌧㌧、これはいいねぇ
    410 : 名無しさん@お腹 - 2012/01/01(日) 13:46:38.69 (+3,-30,-249)
    おれもー
    どっかから拾ってきた奴
    yankしたとき貼りつけた内容がハイライトされる
    popup-kill-ring つこうてる人は popup-kill-ring-interactive-insert が t じゃないと
    ちゃんと反応してくれない

    (defadvice yank (after yank-highlight-string activate)
    (let ((ol (make-overlay (mark t) (point))))
    (overlay-put ol 'face 'highlight)
    (sit-for 0.5)
    (delete-overlay ol)))

    (defadvice yank-pop (after yank-pop-highlight-string activate)
    (when (eq last-command 'yank)
    (let ((ol (make-overlay (mark t) (point))))
    (overlay-put ol 'face 'highlight)
    (sit-for 0.5)
    (delete-overlay ol))))
    411 : 名無しさん@お腹 - 2012/01/01(日) 15:04:21.29 (+4,-29,-7)
    せめて unwind-protect で overlay の後始末はするべきだな。
    412 : 名無しさん@お腹 - 2012/01/01(日) 15:08:16.25 (+14,-30,-189)
    >>411にならって直してみた

    (defadvice yank (after yank-highlight-string activate)
    (let ((ol (make-overlay (mark t) (point))))
    (unwind-protect
    (progn (overlay-put ol 'face 'highlight)
    (sit-for 0.5))
    (delete-overlay ol))))

    (defadvice yank-pop (after yank-pop-highlight-string activate)
    (when (eq last-command 'yank)
    (let ((ol (make-overlay (mark t) (point))))
    (unwind-protect
    (progn (overlay-put ol 'face 'highlight)
    (sit-for 0.5))
    (delete-overlay ol)))))
    413 : 名無しさん@お腹 - 2012/01/01(日) 15:11:01.01 (+52,+29,+2)
    いいですね。いただきます。
    414 : 名無しさん@お腹 - 2012/01/01(日) 16:34:08.50 (+10,-30,-257)
    >>412の真似して undo で文章が復帰した時にもハイライトするようにしてみた。
    もうちょっとマシな書き方出来ないか誰か添削してくれると嬉しい。

    やってることは、
    buffer-undo-list を頭からたどっていって
    (integerp . integerp) の cons セルにあたったらその範囲をハイライトしてループ終了
    (stringp . なんか) の cons セルにあたったらループ終了

    (defadvice undo (after flash activate)
    (catch 'loop
    (dolist (c buffer-undo-list)
    (let ((beg (car c))
    (end (cdr c)))
    (cond ((and (integerp beg)
    (integerp end))
    (let ((ol (make-overlay beg end)))
    (unwind-protect
    (progn (overlay-put ol 'face 'highlight)
    (sit-for 0.5))
    (delete-overlay ol)
    (throw 'loop nil))))
    ((stringp beg)
    (throw 'loop nil)))))))
    415 : 名無しさん@お腹 - 2012/01/01(日) 16:57:08.39 (+0,-29,-21)
    >>412
    副作用が怖いですが
    アドバイス対象をinsert-for-yankにすると一つで済みました
    416 : 名無しさん@お腹 - 2012/01/01(日) 17:59:01.61 (+33,-30,-150)
    >>414
    dolist の中から return で脱出できたような。
    けれど自分ならこうするかな。

    (defadvice undo (after flash activate)
      (loop for (beg . end) in buffer-undo-list
            if (and (integerp beg)
                    (integerp end))
            return (let ((ol (make-overlay beg end)))
                     (unwind-protect
                         (progn
                           (overlay-put ol 'face 'highlight)
                           (sit-for 0.5))
                       (delete-overlay ol)))
            else when (stringp beg)
            return nil))
    417 : 名無しさん@お腹 - 2012/01/01(日) 18:23:18.31 (+3,-25,-2)
    >>416
    loop を使うとシンプルになるんですね。
    勉強しないといかんなーloop難しい
    418 : 名無しさん@お腹 - 2012/01/01(日) 19:44:03.56 (+40,+8,-2)
    >>416
    わかりやすいコードでいいね
    419 : 名無しさん@お腹 - 2012/01/02(月) 00:40:25.00 (+57,+29,-19)
    NTEmacs スレが沈んだ
    >>1が2008年9月とかのんびりした進行だっただけに誰も次スレ建てなかったわけだ
    420 : 名無しさん@お腹 - 2012/01/02(月) 14:53:59.03 (+3,-30,-82)
    flet で関数を置き換えた際に、その関数内で置き換え前の関数を呼ぶ方法はありませんでしょうか?

    (flet ((load (file &optional noerror nomessage nosuffix must-suffix)
    (load file noerror t nosuffix must-suffix)))
    (load "something"))

    こんな風にすると再帰してしまいます。
    421 : 名無しさん@お腹 - 2012/01/02(月) 14:59:40.35 (+9,-30,-108)
    symbol-function で関数の実体を取り出してどっかの変数に退避しておいてっ
    て方法はある。

    こんな感じかな?

    (let ((original (symbol-function 'load)))
    (flet ((load (file &optional noerror nomessage nosuffix must-suffix)
    (funcall original file noerror t nosuffix must-suffix)))
    (load "something")))
    422 : 名無しさん@お腹 - 2012/01/02(月) 15:15:59.61 (+4,-30,-184)
    >>421
    なるほど!ありがとうございます。これでやりたいことが出来ました。
    session.el でセッション復帰時のローディングメッセージを消したかったのでした。
    ソースの load してるところを直接書き換えちゃえばそれで済むといえばそれまでなんですが。

    (defadvice session-initialize (around session-load-silently activate)
    "セッションロード時のメッセージ抑制"
    (let ((org-load (symbol-function 'load)))
    (flet ((load (file &optional noerror nomessage nosuffix must-suffix)
    (funcall org-load file noerror t nosuffix must-suffix)))
    ad-do-it)))
    423 : 名無しさん@お腹 - 2012/01/02(月) 15:37:23.73 (+94,+30,+0)
    424 : 名無しさん@お腹 - 2012/01/02(月) 15:41:37.42 (+70,+29,-47)
    >>423
    そんな標準で用意されていない elisp 持ち出されても。
    むしろそういうのが標準パッケージに取り込まれないあたりが話になんね。
    やっぱ url.el はうんこちんちんだな。
    425 : 名無しさん@お腹 - 2012/01/02(月) 15:52:00.34 (+26,-1,-2)
    どうせemacsから画像のアップロードとかしないからいいんじゃね。
    426 : 名無しさん@お腹 - 2012/01/02(月) 16:13:53.44 (+9,-30,-50)
    Gnu pack emacsを使っています
    (open-file "./index.html")のようにして
    windowsの関連付けどおりにファイルを開くことは可能でしょうか
    それらしき関数が見当たらなかったので質問しました
    427 : 名無しさん@お腹 - 2012/01/02(月) 16:19:35.26 (+3,-30,-121)
    gnusで仕様的に正しいmime multipartなメッセージ作れるんじゃないの?と思ってみてみたけど
    multipart/mixedとかは良い感じに実装されてるのにmultipart/form-dataはないのな。惜しいな。
    428 : 名無しさん@お腹 - 2012/01/02(月) 16:22:33.06 (+38,-30,-62)
    >>426
    gnupack で cygwin もセットで導入しているなら
    (defun open-file (file)
    (interactive)
    (start-process "cygstart" nil "cygstart" file))
    cygwin いれてないなら cygstart を start に置き換えればいいんじゃないかな。
    429 : 名無しさん@お腹 - 2012/01/02(月) 16:26:41.04 (+42,-30,-53)
    >>428
    interactiveなのに引数必須とはいかがなものか。

    (defun open-file (&optional file)
    (interactive "fFile: ")
    (start-process "cygstart" nil "cygstart" file))
    430 : 名無しさん@お腹 - 2012/01/02(月) 17:08:05.60 (+0,-29,-3)
    >>429
    file が nil だとエラーになるだろうし、
    &optional がいらない。
    431 : 名無しさん@お腹 - 2012/01/02(月) 17:08:59.52 (+51,+28,+1)
    ニワカが増えたな。
    432 : 名無しさん@お腹 - 2012/01/02(月) 17:11:57.96 (+52,+29,+0)
    るびきちのせいだ
    433 : 名無しさん@お腹 - 2012/01/02(月) 17:19:09.42 (+63,+29,-18)
    >>429 水準の間違いは昔からだろ。ただの勘違いかもしれないけど。
    434 : 名無しさん@お腹 - 2012/01/02(月) 17:20:19.64 (+57,+29,-13)
    神社で除夜の鐘ならせるところってあるんだ?
    てっきり寺だけかと思ってたんだが。
    435 : 名無しさん@お腹 - 2012/01/02(月) 17:25:14.37 (+62,+29,-55)
    るびきちはemacs内で完結しないでどんどん外部のプログラムをelisp内から使えよって言ってるけど
    外部のプログラムが入ってくると色んな環境で動かす時めんどくさくてやだ。
    elispで完結してる方がいいよ。
    436 : 名無しさん@お腹 - 2012/01/02(月) 17:58:55.73 (+57,+29,-31)
    elisp遅いし正規表現うんこだし非同期がアレじゃないの?
    まあ確かに面倒だしキチは嫌いだけどな
    437 : 名無しさん@お腹 - 2012/01/02(月) 20:06:07.02 (+0,+0,+0)
    emacs に喋らせたくて google 翻訳使ったのを作ったんだけど、日本語含むのがちゃんと動かない。
    url-hexify-string の中で encode-coding-string utf-8 してるから問題ないと思ったんだけど何が不味いんだろう。
    助言をください・・・

    (require 'url-http)
    (defvar speech-default-language "en"
    "デフォルトの言語。")
    (defvar speech-sound-player "cmd /c start %s"
    "mp3音声再生プログラム。%s にファイル名が入る。") ;; windows 向け設定

    (defun speech-message (text &optional lang)
    "指定された文章を音声再生する。"
    (interactive "sMessage: ")
    (let ((coding-system-for-read 'binary)
    (coding-system-for-write 'binary)
    temp-file)
    (with-current-buffer
    (url-retrieve-synchronously
    (format "http://translate.google.com/translate_tts?tl=%s&q=%s?"
    (or lang speech-default-language)
    (url-hexify-string text)))
    (set-buffer-multibyte nil)
    (setq temp-file (make-temp-file "speech-" nil ".mp3"))
    (write-region (point-min) (point-max) temp-file nil 'silent)
    (apply 'start-process "player" nil
    (split-string (format speech-sound-player temp-file))))))

    ;; 以下を評価でしゃべる
    (speech-message "a happy new year!")
    (speech-message "a happy new year!" "ja") ;; 言語指定
    (speech-message "あけましておめでとうございます" "ja") ;; 動作がおかしい...
    438 : 名無しさん@お腹 - 2012/01/02(月) 20:21:32.48 (+10,-29,-74)
    temp-file の中身のぞいてみたら?日本語の結果には明らかに mp3 っぽくな
    いものが入ってくるけど。google に投げるパラメータが正しいのか確認を。

    で、気になったのが英語の方は再生できるとなると、http ヘッダがファイル
    に残ってても再生できるってことなのか?
    439 : 名無しさん@お腹 - 2012/01/02(月) 20:46:38.58 (+0,-30,-200)
    >>438
    ヘッダ切り出ししなきゃいけなかったんですね。
    MediaPlayerでためしてたからか、先頭にゴミがつまってても再生できてたみたいでした。

    >>437 の一部を直してヘッダを切り取ってみましたが、状況変わらずでした。
    (point-min) (point-max) temp-file nil 'silent)

    (goto-char (point-min))
    (write-region (search-forward-regexp "\n\n") (point-max) temp-file nil 'silent)

    ↓を評価して出来上がる文字列を chrome で表示するとちゃんと「あけましておめでとう・・」って音声が出てくるので
    emacs側の文字コード変換とかが間違っているんでしょうか・・・
    (format "http://translate.google.com/translate_tts?tl=%s&q=%s"
    "ja" (url-hexify-string "あけましておめでとうございます"))

    "http://translate.google.com/translate_tts?tl=ja&q=%e3%81%82%e3%81%91%e3%81%be%e3%81%97%e3%81%a6%e3%81%8a%e3%82%81%e3%81%a7%e3%81%94%e3%81%86%e3%81%94%e3%81%96%e3%81%84%e3%81%be%e3%81%99"
    441 : 名無しさん@お腹 - 2012/01/02(月) 21:43:52.50 (+9,-29,-55)
    あとは chrome で送ってる http ヘッダと url-http.el で送ってる http ヘッ
    ダを調べながら試してくしかないかなぁ。

    どうやら User-Agent で弾いてはいないみたいだが。
    442 : 名無しさん@お腹 - 2012/01/02(月) 22:02:11.86 (+4,-29,-107)
    >>441
    url-debug を t にしてみてみたところ、emacs 側でリクエスト文字列が途中で書き変わってたりということはありませんでした。

    他でどうなんだろうとおもって wget で試してみたところ User-Agent に何か適当なのが入っていないと
    403 エラーになりました。
    指定して取得した結果は英語は大丈夫、日本語は Emacs の時とまったく同じ変な結果が返されてきました。

    おっしゃるとおり Chrome のリクエストヘッダと比較して差分を調べて見ることにします。何か足りていないんでしょうね。
    ありがとうございました。
    443 : 名無しさん@お腹 - 2012/01/02(月) 22:45:45.02 (+0,+0,+0)
    うまくいきましたので報告します。
    結論から言って User-Agent でした。"Safari/" が含まれていないとなんでか半分ぐらいに切れた結果が返ってきてしまうようです。
    (なのでIEでもEmacsと同じ壊れ方になりました。)
    あと長過ぎてもダメだったりもするみたいですね。これは通常の Webインターフェースからでも制限かかってるみたいでした。

    最終的に以下のようになりました。これで sdic で発音チェックしたり読み方わからない漢字読ませたり出来そうです。

    ;; (speech-message "鮃より鰆を食べたい。" "ja")
    ;; (speech-message "Learn basic keystroke commands." "en")
    (defvar speech-default-language "en"
    "デフォルトの言語。")
    (defvar speech-sound-player "cmd /c start %s"
    "音声再生プログラム。%s にファイル名が入る。")
    (defun speech-message (text &optional lang)
    "指定された文章を音声再生する。"
    (interactive "sMessage: ")
    (let ((coding-system-for-read 'binary)
    (coding-system-for-write 'binary)
    (url-privacy-level 'paranoid)
    (url-request-extra-headers '(("User-Agent" . "Emacs/URI Safari/0"))))
    (with-current-buffer
    (url-retrieve-synchronously
    (format "http://translate.google.com/translate_tts?sl=en&tl=%s&q=%s"
    (or lang speech-default-language) (url-hexify-string text)))
    (let* ((coding-system-for-read 'binary)
    (coding-system-for-write 'binary)
    (temp-file (make-temp-file "speech-" nil ".mp3"))
    (cmdlist (split-string (format speech-sound-player temp-file))))
    (set-buffer-multibyte nil)
    (goto-char (point-min))
    (write-region (search-forward-regexp "\n\n") (point-max) temp-file nil 'silent)
    (apply 'call-process (car cmdlist) nil nil nil (cdr cmdlist))))))
    444 : 名無しさん@お腹 - 2012/01/02(月) 22:50:38.11 (+0,-29,-23)
    >>443
    環境や目的によるけれど、
    open-jtalk なら日本語発声できるよ。
    日本語のパースや発音方法を自前でするなら
    mbrola などでもできる。
    445 : 名無しさん@お腹 - 2012/01/02(月) 23:03:14.58 (+55,+29,-10)
    >>443
    url.elは糞だ、外部プログラム呼ぶのはキチだって話してる最中にいい度胸だな。
    446 : 名無しさん@お腹 - 2012/01/02(月) 23:09:56.87 (-2,-30,-10)
    おもしろいね
    (setq speech-sound-player "mpg123 %s")
    447 : 名無しさん@お腹 - 2012/01/02(月) 23:19:58.45 (+0,-30,-84)
    おもしろいじゃん
    カーソル位置の単語を喋らせるのつくってみたよ

    (defun speech-at-point ()
    (interactive)
    (speech-message (thing-at-point 'word)))
    (global-set-key (kbd "C-c C-s") 'speech-at-point)

    これで日本語対象にしてみたらダメだった
    文字列から言語判別出来るようにすればよさそうだな
    448 : 名無しさん@お腹 - 2012/01/03(火) 00:37:02.55 (+0,+0,+0)
    自分なりに改造してみた。
    取り敢えず非同期に & >>447 の機能をいれた。
    > 文字列から言語判別出来るようにすればよさそうだな
    これはできてない。
    あと、エラーになったときにバッファやファイルが削除されないかも。

    (defun speech-callback (status &rest cbargs)
      (unwind-protect
      (progn
      (set-buffer-multibyte nil)
      (goto-char (point-min))
      (lexical-let ((temp-file (make-temp-file "speech-" nil ".mp3")))
      (let ((coding-system-for-read 'binary)
      (coding-system-for-write 'binary)
      (cmdlist (split-string (format speech-sound-player temp-file))))
      (write-region (search-forward-regexp "\n\n") (point-max) temp-file nil 'silent)
      (set-process-sentinel (apply 'start-process (car cmdlist) nil cmdlist)
      (lambda (process event)
      (delete-file temp-file))))))
      (kill-buffer)))

    (defun speech-message (text &optional lang)
      "指定された文章を音声再生する。"
      (interactive (list (read-string "Message: " (thing-at-point 'word))))
      (let ((coding-system-for-read 'binary)
      (coding-system-for-write 'binary)
      (url-privacy-level 'paranoid)
      (url-request-extra-headers '(("User-Agent" . "Emacs/URI Safari/0"))))
      (url-retrieve (format "http://translate.google.com/translate_tts?sl=en&tl=%s&q=%s"
      (or lang speech-default-language) (url-hexify-string text))
      'speech-callback)))
    449 : 名無しさん@お腹 - 2012/01/03(火) 02:44:31.02 (-2,-30,-35)
    手抜きで
    (or lang (and (string-match "\\cj" text) "ja") speech-default-language)
    450 : 名無しさん@お腹 - 2012/01/03(火) 12:03:34.70 (+3,-30,-150)
    ちょいとうざいがベルの代わりに声で叱ってもらう
    '("もう" "だめよ" "しかたないこね" "ちょっとだけよ")とかもいいな

    (defvar speech-bell-messages '("おい" "こら" "いい加減にせいや" "いてまうぞわれ")
    "御叱りの言葉")
    (defvar speech-bell-language "ja"
    "御叱りの言語")
    (defvar speech-bell-cur nil)

    (defun speech-bell-function ()
    "声で叱る"
    (let ((ring-bell-function nil))
    (unless speech-bell-cur
    (setq speech-bell-cur speech-bell-messages))
    (speech-message (pop speech-bell-cur) speech-bell-language)))

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

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


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