1 名前:名無しさん@お腹いっぱい。 [2011/11/29(火) 17:50:44.24 ] 前スレ Emacs Part 38 hibari.2ch.net/test/read.cgi/unix/1308635178/
352 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/12/30(金) 19:25:34.59 ] バカだとかアホだとかおよそ書籍に似つかわしくない単語が並んでた。
353 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/12/30(金) 21:05:55.40 ] >>352 ?どういうこと?
354 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/12/30(金) 21:23:42.61 ] キチボンにそういう単語が並んでるってこと?
355 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/12/30(金) 21:29:48.87 ] そう。cl に関する記述の部分だったかな。 おれはこのことに怒っているぞみたいなこと書いてあった。
356 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/12/30(金) 21:32:26.59 ] ああいう表現って編集の人に止められないもんなのかね。 触らぬキに祟りなしとかで何も言わないのか。
357 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/12/30(金) 23:04:23.29 ] cl に関しては公式が正しいと思うけどな。 Common LispだけがLispじゃないんだし。
358 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/12/30(金) 23:09:10.31 ] ただ、dolist みたいな便利マクロが標準で用意されててもいいだろとは思ったわ。 どうせみんな書くんだろうし。
359 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/12/30(金) 23:11:07.88 ] >>348 リクエストメソッドをPOSTに出来るだけでしょ。 マルチパートの送信も出来ないのにPOST出来るとはとてもとても。
360 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/12/30(金) 23:39:38.22 ] >>356 clマクロを取りまく現状について 「こうしたねじれた事態は馬鹿げている」と強い口調で書いてはある けれどバカと馬鹿げているではニュアンスがまるで違うからキとか言うのはよくない
361 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/12/30(金) 23:42:51.17 ] キについては自称だからなぁ。
362 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/12/30(金) 23:44:13.73 ] cl 使うなっていうなら標準で添付するなよなとは思うわ。 意味わからん。
363 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/12/31(土) 00:31:14.97 ] >>358 dolist, dotimes は subr.el に標準で用意されている。 正直 cl とマージすればいいと思うんだけど、何かポリシー があるんだろうな。
364 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/12/31(土) 00:33:53.26 ] 自前の使い捨てスクリプト書くときは便利だし。 パッケージとして作るものに (require 'cl) するなって意味だったような。
365 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/12/31(土) 00:51:35.45 ] > バカと馬鹿げているではニュアンスがまるで違う 単語だけ切り出したらそう思うかもしれないけど、 全体の文脈からしてかなり烈しい内容だったと思うけどな。 この辺が幼稚な印象を強くしちゃうんだよ。rbktせんせ。
366 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/12/31(土) 00:58:58.98 ] なんで subr に入れないんだろうね。 find-if とかの cl-seq の中身便利なのに。
367 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/12/31(土) 01:07:28.40 ] 文字数をモード列に表示することはできるのでしょうか
368 名前:名無しさん@お腹いっぱい。 [2011/12/31(土) 02:34:37.32 ] >>364 すみません、私はcl.el大好きなんですが、 eval-when-compileで囲んでもやはり使うべきではない、 というのが現在の一般的な意見、ということになっているのでしょうか? >>366 RMSがキーワード引数が好きではないから、という説を どこかで聞いた気がします。
369 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/12/31(土) 02:41:52.98 ] FMV-BIBLO LOOX(6インチモニタのノート)でemacs常用している猛者はいないか? 買うかどうか悩んでるんだ。ソースコード編集してC-c C-cで部分実行するだけならこの画面で十分な気がするんだけどどうだろ
370 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/12/31(土) 02:51:04.54 ] (eval-when-compile (require 'cl)) して使っていいのがCLマクロ 使っちゃダメなのがCL関数 じゃないの?
371 名前:名無しさん@お腹いっぱい。 [2011/12/31(土) 04:32:15.06 ] Richard Stallmanは以下のように書いているのですが、 The rule against using CL functions at run time is for the sake of the user. The CL functions are not a standard part of the Emacs Lisp namespace. Thus, loading CL can conflict with the user's function definitions. subr.elでdefunされているremoveと、 cl-seq.elでdefunされているremove-ifとでは、 「can conflict with the user's function definitions」という点で どのような違いがあるのでしょうか。
372 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/12/31(土) 09:34:41.01 ] 皆でガンガンclの関数使って形骸化させようぜみたいなのにならなかったのだろうか
373 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/12/31(土) 09:38:21.89 ] clの実装は小汚いからな。 喜んで使うのは三流グラマだけ。
374 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/12/31(土) 09:52:56.96 ] >>371 subr.el で定義されている -> ぶつかったらユーザの責任 cl.el で定義されている -> ぶつかったら cl.el をロードしたやつの責任 という点で異なる
375 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/12/31(土) 10:01:45.63 ] 下手に準拠唄うとアレがダメだこれがダメだと重箱の角ツツク ゴミッカスが喜び勢い付くだけだからね〜
376 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/12/31(土) 10:18:28.75 ] anythingに関しても今のところはつっこまれてないだけで、これからつっこま れる可能性は高いよね。ところでanythingの標準添付の作業ってどこでされて るんだ?trunk見ても見当たらないんだけど。
377 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/12/31(土) 11:45:32.41 ] きちさんの脳内じゃない? cedet もそうだけどあえて一緒にしない方がいいパッケージってあるよな
378 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/12/31(土) 13:02:19.33 ] アレが添付されると臭くなりそうだな。
379 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/12/31(土) 13:08:23.97 ] emacs本体の一部として配布されるEmacs Lispコードの中でremove-ifを使いたいという要求があったとして、 仮にremove-ifがcl-remove-ifという名前でcl-seq.elでdefunされていたとすると、 -> ぶつかったらユーザの責任、なので -> -> emacs本体の一部として配布されるEmacs Lispコードでeval-when-compileで囲まずに(require 'cl)してOK と言えるんでしょうか? あるいは、remove-ifがマクロなら(eval-when-compile (require 'cl))して標準配布物内で使ってOK、だとして、 remove-ifをマクロとして再実装するのはすごくたいへんなんでしょうか?
380 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/12/31(土) 13:14:40.25 ] そういや remove-if の実装どうなってんだろと思ってみにいったら 関数に cl-* の接頭辞が付きまくってて目眩がした ネームスペースの仕組みあればねえ。
381 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/12/31(土) 14:00:39.92 ] c--がよくわかりません describe-keyで調べたらこう出ました (negative-argument ARG) Begin a negative numeric argument for the next command. C-u following digits or minus sign ends the argument. 具体的にはどういうことなのでしょうか 使い道を知りたいです
382 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/12/31(土) 14:12:24.79 ] >>381 C-- 数字 コマンド でそのコマンドに -数字 の引数を与えられるってこと。 C-- 3 C-p とかやると 三行「下に」移動する。
383 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/12/31(土) 14:31:15.96 ] >>382 なるほど、C-uの繰り返しがデフォルトで4となっていましたが、 それの基本的な機能なのですね わかりました
384 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/12/31(土) 14:34:32.20 ] >>383 C-- はあくまで負の数な。 正の数の動作が基本だから C-3 C-p とか M-3 C-p とかの方が普通。
385 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/12/31(土) 14:56:23.71 ] >>293 え、POSTできるけど……
386 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/12/31(土) 15:01:55.78 ] フォントを設定するとき、ある family に属するフォントが無い場合、別の family を使う、というのを実現するのに 以下のような関数を作ったのですが、もっと妥当なやり方があれば教えていただけると助かります。 (require 'cl) (defun safe-font (&rest family-list) "有効なフォントファミリを返す。" (find-if (lambda (f) (find-font (font-spec :family f))) family-list)) (set-face-attribute 'default nil :font (safe-font "あずきフォントL" "MeiryoKe_Console" "MS Gothic" "mono"))
387 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/12/31(土) 15:02:52.09 ] >>385 >>359
388 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/12/31(土) 15:10:04.48 ] flet で作ったローカルな関数をスコープから外れてからも呼ぶ方法はありませんでしょうか? 具体的にはこんな感じです。 (flet ((greeting (msg) (message "%s" msg))) (defun say-hello () (greeting "hello")) (defun say-good-bye () (greeting "good bye"))) (say-hello) ;; greeting が無いって怒られないようにしたい (say-good-bye) ;; 同上 (greeting "nono") ;; でも greeting は外から見せたくない
389 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/12/31(土) 15:24:12.63 ] >>388 flet の代わりに labels を使う。 ダイナミックスコープとレキシカルスコープを調べるべし。
390 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/12/31(土) 15:24:53.27 ] macroletなら。 Emacsの関数はただのlambda式(か、それをバイトコンパイルしたもの)なので、 fletじゃ無理。実行時にgreetingが見えなければエラーになって終わり。
391 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/12/31(土) 15:36:12.19 ] >>389 ありがとうございます。macrolet だとマクロとしてその場に展開、 labels だと文脈依存の関数としてちゃんと関数として定義されるってことですね。 レキシカルとダイナミックを見てて思ったんですが、 純粋なローカル変数を使いたい場合は let より lexical-let を使うべきな気がするんですけど (内部の関数で参照しているシンボルを不用意に束縛しないため) そういう認識であっていますか?
392 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/12/31(土) 15:44:04.23 ] いや。クロージャとして持ち出したい場合以外は普通のletの方がいい。 なぜならEmacsには基本的にそっちしかないから。 レキシカルスコープは擬似的なものなんだよ。 基本的にはgensymで作った「変な名前の内緒のグローバル変数」に 値や式を持っておいてそれをsymbol-valueで取り出す。 labelsにせよ、lexical-letにせよ、適当な式をmacroexpand-allすればわかる。
393 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/12/31(土) 16:17:46.66 ] >>392 なるほど。そうすると let で使うシンボル名は せめて既に使われているようなのを不用意に使わないよう気をつけるしかないですか。
394 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/12/31(土) 21:45:31.70 ] 次のようなテキストファイルがあります Test1243 (@import "./foo/foo.txt") (@import "/usr/mytext.txt") Pipipi テキスト中に(@import path)と書いてある時はPathのファイルを埋め込んで別のテキストファイルとして出力したいです Elispの正規表現でpathの文字列を取り出すのは分かるのですが ファイルを読み込んだ上でファイルを作るのが良くわかりません よろしくお願いします
395 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/12/31(土) 22:00:24.55 ] こんな感じのこと? ;; 文字コードてきとー (defun hoge-func () (let ((in (read-file-name "入力ファイル: ")) (out (read-file-name "出力先ファイル: "))) (with-temp-buffer (insert-file-contents in) (goto-char (point-min)) ;; 正規表現てきとー (while (re-search-forward "(@import \"\\([^\"]+\\)\")" nil t) (let* ((fn (match-string 1)) (contents (save-match-data (with-temp-buffer (insert-file-contents fn) (buffer-string))))) (replace-match contents nil nil nil 0))) (write-region (point-min) (point-max) out))))
396 名前:名無しさん@お腹いっぱい。 [2011/12/31(土) 22:22:46.05 ] emacsのtext-modeで、タブを押したときにインデントを、 前の行には関係なく、一定量に設定するにはどうすればよいでしょうか? (1)ではなく(2)となるようにしたいのですが。 (1)前の行を参照するタブ 123456789 abc ←スペースの後の位置に移動 (2)タブの移動量を8に 123456789 abc// ←ここに移動
397 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/12/31(土) 22:32:56.01 ] よーわからんけど C-q C-i でタブ文字強制入力じゃだめ?
398 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/12/31(土) 22:33:24.10 ] C-q TAB で純粋にタブ移動できるけど恒久的にやる方法はちょっとわからない。 というかいつの間に indented-text-mode = text-mode になってたんだ・・気づかなかった。
399 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/12/31(土) 22:41:12.31 ] もっとまともな方法があるとは思うけど↓でtext-modeのTABは強制的に\tになる。 (add-hook 'text-mode-hook (lambda () (setq indent-line-function (lambda () (insert " "))) ))
400 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/12/31(土) 22:41:52.06 ] " " のところは C-q C-i でタブが入力されてると思ってくれ。
401 名前:396 mailto:sage [2011/12/31(土) 22:54:22.58 ] >>397-400 ありがとうございます。 >>399 これで完璧に解決しました。とても助かりました。
402 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/12/31(土) 23:11:00.92 ] TAB関連で tab-to-tab-stop の文字位置へ移動するにはどんなコード書けばいいんだろう?
403 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/12/31(土) 23:14:38.73 ] (move-to-tab-stop)じゃあかんの?
404 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/01(日) 00:07:44.48 ] Elispをすらすら書ける人は 普段からlispに慣れている人なのかな 尊敬するわ
405 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/01(日) 01:15:55.55 ] 一口にLispっつーても色々あって、それぞれノウハウ違うから elispをスラスラ書ける人は普段からelispに慣れてる人だと思う
406 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/01(日) 01:48:01.75 ] リストの処理とかがスラスラ書けても バッファの弄り方とかテキストプロパティとかオーバレイとか辺りになってくると あんまりLisp関係ないもんね。
407 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/01(日) 12:40:54.90 ] 暇なので elisp 紹介 ■emacs で google map 表示 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 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/01(日) 12:43:07.23 ] oh... ちょっと間違った ↓ね。 (defadvice google-maps-static-show (before google-maps-set-lang activate) (ad-set-args 0 (append '(:language "ja") (ad-get-args 0))))
409 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/01(日) 13:35:41.22 ] >>407 dd、これはいいねぇ
410 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/01(日) 13:46:38.69 ] おれもー どっかから拾ってきた奴 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 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/01(日) 15:04:21.29 ] せめて unwind-protect で overlay の後始末はするべきだな。
412 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/01(日) 15:08:16.25 ] >>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 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/01(日) 15:11:01.01 ] いいですね。いただきます。
414 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/01(日) 16:34:08.50 ] >>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 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/01(日) 16:57:08.39 ] >>412 副作用が怖いですが アドバイス対象をinsert-for-yankにすると一つで済みました
416 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/01(日) 17:59:01.61 ] >>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 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/01(日) 18:23:18.31 ] >>416 loop を使うとシンプルになるんですね。 勉強しないといかんなーloop難しい
418 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/01(日) 19:44:03.56 ] >>416 わかりやすいコードでいいね
419 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/02(月) 00:40:25.00 ] NTEmacs スレが沈んだ >>1 が2008年9月とかのんびりした進行だっただけに誰も次スレ建てなかったわけだ
420 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/02(月) 14:53:59.03 ] flet で関数を置き換えた際に、その関数内で置き換え前の関数を呼ぶ方法はありませんでしょうか? (flet ((load (file &optional noerror nomessage nosuffix must-suffix) (load file noerror t nosuffix must-suffix))) (load "something")) こんな風にすると再帰してしまいます。
421 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/02(月) 14:59:40.35 ] 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 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/02(月) 15:15:59.61 ] >>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 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/02(月) 15:37:23.73 ] >>387 www.emacswiki.org/emacs/http-post-simple.el
424 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/02(月) 15:41:37.42 ] >>423 そんな標準で用意されていない elisp 持ち出されても。 むしろそういうのが標準パッケージに取り込まれないあたりが話になんね。 やっぱ url.el はうんこちんちんだな。
425 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/02(月) 15:52:00.34 ] どうせemacsから画像のアップロードとかしないからいいんじゃね。
426 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/02(月) 16:13:53.44 ] Gnu pack emacsを使っています (open-file "./index.html")のようにして windowsの関連付けどおりにファイルを開くことは可能でしょうか それらしき関数が見当たらなかったので質問しました
427 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/02(月) 16:19:35.26 ] gnusで仕様的に正しいmime multipartなメッセージ作れるんじゃないの?と思ってみてみたけど multipart/mixedとかは良い感じに実装されてるのにmultipart/form-dataはないのな。惜しいな。
428 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/02(月) 16:22:33.06 ] >>426 gnupack で cygwin もセットで導入しているなら (defun open-file (file) (interactive) (start-process "cygstart" nil "cygstart" file)) cygwin いれてないなら cygstart を start に置き換えればいいんじゃないかな。
429 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/02(月) 16:26:41.04 ] >>428 interactiveなのに引数必須とはいかがなものか。 (defun open-file (&optional file) (interactive "fFile: ") (start-process "cygstart" nil "cygstart" file))
430 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/02(月) 17:08:05.60 ] >>429 file が nil だとエラーになるだろうし、 &optional がいらない。
431 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/02(月) 17:08:59.52 ] ニワカが増えたな。
432 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/02(月) 17:11:57.96 ] るびきちのせいだ
433 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/02(月) 17:19:09.42 ] >>429 水準の間違いは昔からだろ。ただの勘違いかもしれないけど。
434 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/02(月) 17:20:19.64 ] 神社で除夜の鐘ならせるところってあるんだ? てっきり寺だけかと思ってたんだが。
435 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/02(月) 17:25:14.37 ] るびきちはemacs内で完結しないでどんどん外部のプログラムをelisp内から使えよって言ってるけど 外部のプログラムが入ってくると色んな環境で動かす時めんどくさくてやだ。 elispで完結してる方がいいよ。
436 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/02(月) 17:58:55.73 ] elisp遅いし正規表現うんこだし非同期がアレじゃないの? まあ確かに面倒だしキチは嫌いだけどな
437 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/02(月) 20:06:07.02 ] 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 "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 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/02(月) 20:21:32.48 ] temp-file の中身のぞいてみたら?日本語の結果には明らかに mp3 っぽくな いものが入ってくるけど。google に投げるパラメータが正しいのか確認を。 で、気になったのが英語の方は再生できるとなると、http ヘッダがファイル に残ってても再生できるってことなのか?
439 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/02(月) 20:46:38.58 ] >>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 "translate.google.com/translate_tts?tl=%s&q=%s " "ja" (url-hexify-string "あけましておめでとうございます")) ↓ "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 "
440 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/02(月) 20:47:47.37 ] URL間違ってた・・・ ↓です。 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%a8%e3%81%86%e3%81%94%e3%81%96%e3%81%84%e3%81%be%e3%81%99
441 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/02(月) 21:43:52.50 ] あとは chrome で送ってる http ヘッダと url-http.el で送ってる http ヘッ ダを調べながら試してくしかないかなぁ。 どうやら User-Agent で弾いてはいないみたいだが。
442 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/02(月) 22:02:11.86 ] >>441 url-debug を t にしてみてみたところ、emacs 側でリクエスト文字列が途中で書き変わってたりということはありませんでした。 他でどうなんだろうとおもって wget で試してみたところ User-Agent に何か適当なのが入っていないと 403 エラーになりました。 指定して取得した結果は英語は大丈夫、日本語は Emacs の時とまったく同じ変な結果が返されてきました。 おっしゃるとおり Chrome のリクエストヘッダと比較して差分を調べて見ることにします。何か足りていないんでしょうね。 ありがとうございました。
443 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/02(月) 22:45:45.02 ] うまくいきましたので報告します。 結論から言って 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 "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 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/02(月) 22:50:38.11 ] >>443 環境や目的によるけれど、 open-jtalk なら日本語発声できるよ。 日本語のパースや発音方法を自前でするなら mbrola などでもできる。
445 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/02(月) 23:03:14.58 ] >>443 url.elは糞だ、外部プログラム呼ぶのはキチだって話してる最中にいい度胸だな。
446 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/02(月) 23:09:56.87 ] おもしろいね (setq speech-sound-player "mpg123 %s")
447 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/02(月) 23:19:58.45 ] おもしろいじゃん カーソル位置の単語を喋らせるのつくってみたよ (defun speech-at-point () (interactive) (speech-message (thing-at-point 'word))) (global-set-key (kbd "C-c C-s") 'speech-at-point) これで日本語対象にしてみたらダメだった 文字列から言語判別出来るようにすればよさそうだな
448 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/03(火) 00:37:02.55 ] 自分なりに改造してみた。 取り敢えず非同期に & >>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 "translate.google.com/translate_tts?sl=en&tl=%s&q=%s " (or lang speech-default-language) (url-hexify-string text)) 'speech-callback)))
449 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/03(火) 02:44:31.02 ] 手抜きで (or lang (and (string-match "\\cj" text) "ja") speech-default-language)
450 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/03(火) 12:03:34.70 ] ちょいとうざいがベルの代わりに声で叱ってもらう '("もう" "だめよ" "しかたないこね" "ちょっとだけよ")とかもいいな (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)
451 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/03(火) 13:41:41.56 ] そういやemacspeakってのあったよな。
452 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/03(火) 13:44:26.85 ] す、すばらしい (speech-message "C'est parfait!" "fr")