Emacs Part 39
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。
2011/11/29(火) 17:50:44.24Emacs Part 38
http://hibari.2ch.net/test/read.cgi/unix/1308635178/
0357名無しさん@お腹いっぱい。
2011/12/30(金) 23:04:23.29Common LispだけがLispじゃないんだし。
0358名無しさん@お腹いっぱい。
2011/12/30(金) 23:09:10.31どうせみんな書くんだろうし。
0359名無しさん@お腹いっぱい。
2011/12/30(金) 23:11:07.88リクエストメソッドをPOSTに出来るだけでしょ。
マルチパートの送信も出来ないのにPOST出来るとはとてもとても。
0360名無しさん@お腹いっぱい。
2011/12/30(金) 23:39:38.22clマクロを取りまく現状について
「こうしたねじれた事態は馬鹿げている」と強い口調で書いてはある
けれどバカと馬鹿げているではニュアンスがまるで違うからキとか言うのはよくない
0361名無しさん@お腹いっぱい。
2011/12/30(金) 23:42:51.170362名無しさん@お腹いっぱい。
2011/12/30(金) 23:44:13.73意味わからん。
0363名無しさん@お腹いっぱい。
2011/12/31(土) 00:31:14.97dolist, dotimes は subr.el に標準で用意されている。
正直 cl とマージすればいいと思うんだけど、何かポリシー
があるんだろうな。
0364名無しさん@お腹いっぱい。
2011/12/31(土) 00:33:53.26パッケージとして作るものに (require 'cl) するなって意味だったような。
0365名無しさん@お腹いっぱい。
2011/12/31(土) 00:51:35.45単語だけ切り出したらそう思うかもしれないけど、
全体の文脈からしてかなり烈しい内容だったと思うけどな。
この辺が幼稚な印象を強くしちゃうんだよ。rbktせんせ。
0366名無しさん@お腹いっぱい。
2011/12/31(土) 00:58:58.98find-if とかの cl-seq の中身便利なのに。
0367名無しさん@お腹いっぱい。
2011/12/31(土) 01:07:28.400368名無しさん@お腹いっぱい。
2011/12/31(土) 02:34:37.32>>364
すみません、私はcl.el大好きなんですが、
eval-when-compileで囲んでもやはり使うべきではない、
というのが現在の一般的な意見、ということになっているのでしょうか?
>>366
RMSがキーワード引数が好きではないから、という説を
どこかで聞いた気がします。
0369名無しさん@お腹いっぱい。
2011/12/31(土) 02:41:52.98買うかどうか悩んでるんだ。ソースコード編集してC-c C-cで部分実行するだけならこの画面で十分な気がするんだけどどうだろ
0370名無しさん@お腹いっぱい。
2011/12/31(土) 02:51:04.54使っちゃダメなのがCL関数
じゃないの?
0371名無しさん@お腹いっぱい。
2011/12/31(土) 04:32:15.06The 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」という点で
どのような違いがあるのでしょうか。
0372名無しさん@お腹いっぱい。
2011/12/31(土) 09:34:41.010373名無しさん@お腹いっぱい。
2011/12/31(土) 09:38:21.89喜んで使うのは三流グラマだけ。
0374名無しさん@お腹いっぱい。
2011/12/31(土) 09:52:56.96subr.el で定義されている -> ぶつかったらユーザの責任
cl.el で定義されている -> ぶつかったら cl.el をロードしたやつの責任
という点で異なる
0375名無しさん@お腹いっぱい。
2011/12/31(土) 10:01:45.63ゴミッカスが喜び勢い付くだけだからね〜
0376名無しさん@お腹いっぱい。
2011/12/31(土) 10:18:28.75れる可能性は高いよね。ところでanythingの標準添付の作業ってどこでされて
るんだ?trunk見ても見当たらないんだけど。
0377名無しさん@お腹いっぱい。
2011/12/31(土) 11:45:32.41cedet もそうだけどあえて一緒にしない方がいいパッケージってあるよな
0378名無しさん@お腹いっぱい。
2011/12/31(土) 13:02:19.330379名無しさん@お腹いっぱい。
2011/12/31(土) 13:08:23.97仮に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をマクロとして再実装するのはすごくたいへんなんでしょうか?
0380名無しさん@お腹いっぱい。
2011/12/31(土) 13:14:40.25関数に cl-* の接頭辞が付きまくってて目眩がした
ネームスペースの仕組みあればねえ。
0381名無しさん@お腹いっぱい。
2011/12/31(土) 14:00:39.92describe-keyで調べたらこう出ました
(negative-argument ARG)
Begin a negative numeric argument for the next command.
C-u following digits or minus sign ends the argument.
具体的にはどういうことなのでしょうか
使い道を知りたいです
0382名無しさん@お腹いっぱい。
2011/12/31(土) 14:12:24.79C-- 数字 コマンド でそのコマンドに -数字 の引数を与えられるってこと。
C-- 3 C-p とかやると 三行「下に」移動する。
0383名無しさん@お腹いっぱい。
2011/12/31(土) 14:31:15.96なるほど、C-uの繰り返しがデフォルトで4となっていましたが、
それの基本的な機能なのですね
わかりました
0384名無しさん@お腹いっぱい。
2011/12/31(土) 14:34:32.20C-- はあくまで負の数な。
正の数の動作が基本だから
C-3 C-p とか M-3 C-p とかの方が普通。
0385名無しさん@お腹いっぱい。
2011/12/31(土) 14:56:23.71え、POSTできるけど……
0386名無しさん@お腹いっぱい。
2011/12/31(土) 15:01:55.78以下のような関数を作ったのですが、もっと妥当なやり方があれば教えていただけると助かります。
(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"))
0387名無しさん@お腹いっぱい。
2011/12/31(土) 15:02:52.09>>359
0388名無しさん@お腹いっぱい。
2011/12/31(土) 15:10:04.48具体的にはこんな感じです。
(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 は外から見せたくない
0389名無しさん@お腹いっぱい。
2011/12/31(土) 15:24:12.63flet の代わりに labels を使う。
ダイナミックスコープとレキシカルスコープを調べるべし。
0390名無しさん@お腹いっぱい。
2011/12/31(土) 15:24:53.27Emacsの関数はただのlambda式(か、それをバイトコンパイルしたもの)なので、
fletじゃ無理。実行時にgreetingが見えなければエラーになって終わり。
0391名無しさん@お腹いっぱい。
2011/12/31(土) 15:36:12.19ありがとうございます。macrolet だとマクロとしてその場に展開、
labels だと文脈依存の関数としてちゃんと関数として定義されるってことですね。
レキシカルとダイナミックを見てて思ったんですが、
純粋なローカル変数を使いたい場合は let より lexical-let を使うべきな気がするんですけど
(内部の関数で参照しているシンボルを不用意に束縛しないため)
そういう認識であっていますか?
0392名無しさん@お腹いっぱい。
2011/12/31(土) 15:44:04.23なぜならEmacsには基本的にそっちしかないから。
レキシカルスコープは擬似的なものなんだよ。
基本的にはgensymで作った「変な名前の内緒のグローバル変数」に
値や式を持っておいてそれをsymbol-valueで取り出す。
labelsにせよ、lexical-letにせよ、適当な式をmacroexpand-allすればわかる。
0393名無しさん@お腹いっぱい。
2011/12/31(土) 16:17:46.66なるほど。そうすると let で使うシンボル名は
せめて既に使われているようなのを不用意に使わないよう気をつけるしかないですか。
0394名無しさん@お腹いっぱい。
2011/12/31(土) 21:45:31.70Test1243
(@import "./foo/foo.txt")
(@import "/usr/mytext.txt")
Pipipi
テキスト中に(@import path)と書いてある時はPathのファイルを埋め込んで別のテキストファイルとして出力したいです
Elispの正規表現でpathの文字列を取り出すのは分かるのですが
ファイルを読み込んだ上でファイルを作るのが良くわかりません
よろしくお願いします
0395名無しさん@お腹いっぱい。
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))))
0396名無しさん@お腹いっぱい。
2011/12/31(土) 22:22:46.05前の行には関係なく、一定量に設定するにはどうすればよいでしょうか?
(1)ではなく(2)となるようにしたいのですが。
(1)前の行を参照するタブ
123456789 abc
←スペースの後の位置に移動
(2)タブの移動量を8に
123456789 abc//
←ここに移動
0397名無しさん@お腹いっぱい。
2011/12/31(土) 22:32:56.010398名無しさん@お腹いっぱい。
2011/12/31(土) 22:33:24.10というかいつの間に indented-text-mode = text-mode になってたんだ・・気づかなかった。
0399名無しさん@お腹いっぱい。
2011/12/31(土) 22:41:12.31(add-hook 'text-mode-hook
(lambda ()
(setq indent-line-function (lambda () (insert " ")))
))
0400名無しさん@お腹いっぱい。
2011/12/31(土) 22:41:52.060402名無しさん@お腹いっぱい。
2011/12/31(土) 23:11:00.92tab-to-tab-stop の文字位置へ移動するにはどんなコード書けばいいんだろう?
0403名無しさん@お腹いっぱい。
2011/12/31(土) 23:14:38.730404名無しさん@お腹いっぱい。
2012/01/01(日) 00:07:44.48普段からlispに慣れている人なのかな
尊敬するわ
0405名無しさん@お腹いっぱい。
2012/01/01(日) 01:15:55.55elispをスラスラ書ける人は普段からelispに慣れてる人だと思う
0406名無しさん@お腹いっぱい。
2012/01/01(日) 01:48:01.75バッファの弄り方とかテキストプロパティとかオーバレイとか辺りになってくると
あんまりLisp関係ないもんね。
0407名無しさん@お腹いっぱい。
2012/01/01(日) 12:40:54.90■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 の管理下に入れておくとうっとおしくなくて良い。
0408名無しさん@お腹いっぱい。
2012/01/01(日) 12:43:07.23↓ね。
(defadvice google-maps-static-show (before google-maps-set-lang activate)
(ad-set-args 0 (append '(:language "ja") (ad-get-args 0))))
0409名無しさん@お腹いっぱい。
2012/01/01(日) 13:35:41.22dd、これはいいねぇ
0410名無しさん@お腹いっぱい。
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))))
0411名無しさん@お腹いっぱい。
2012/01/01(日) 15:04:21.290412名無しさん@お腹いっぱい。
2012/01/01(日) 15:08:16.25(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)))))
0413名無しさん@お腹いっぱい。
2012/01/01(日) 15:11:01.010414名無しさん@お腹いっぱい。
2012/01/01(日) 16:34:08.50もうちょっとマシな書き方出来ないか誰か添削してくれると嬉しい。
やってることは、
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)))))))
0415名無しさん@お腹いっぱい。
2012/01/01(日) 16:57:08.39副作用が怖いですが
アドバイス対象をinsert-for-yankにすると一つで済みました
0416名無しさん@お腹いっぱい。
2012/01/01(日) 17:59:01.61dolist の中から 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))
0417名無しさん@お腹いっぱい。
2012/01/01(日) 18:23:18.31loop を使うとシンプルになるんですね。
勉強しないといかんなーloop難しい
0418名無しさん@お腹いっぱい。
2012/01/01(日) 19:44:03.56わかりやすいコードでいいね
0419名無しさん@お腹いっぱい。
2012/01/02(月) 00:40:25.00>>1が2008年9月とかのんびりした進行だっただけに誰も次スレ建てなかったわけだ
0420名無しさん@お腹いっぱい。
2012/01/02(月) 14:53:59.03(flet ((load (file &optional noerror nomessage nosuffix must-suffix)
(load file noerror t nosuffix must-suffix)))
(load "something"))
こんな風にすると再帰してしまいます。
0421名無しさん@お腹いっぱい。
2012/01/02(月) 14:59:40.35て方法はある。
こんな感じかな?
(let ((original (symbol-function 'load)))
(flet ((load (file &optional noerror nomessage nosuffix must-suffix)
(funcall original file noerror t nosuffix must-suffix)))
(load "something")))
0422名無しさん@お腹いっぱい。
2012/01/02(月) 15:15:59.61なるほど!ありがとうございます。これでやりたいことが出来ました。
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)))
0423名無しさん@お腹いっぱい。
2012/01/02(月) 15:37:23.73http://www.emacswiki.org/emacs/http-post-simple.el
0424名無しさん@お腹いっぱい。
2012/01/02(月) 15:41:37.42そんな標準で用意されていない elisp 持ち出されても。
むしろそういうのが標準パッケージに取り込まれないあたりが話になんね。
やっぱ url.el はうんこちんちんだな。
0425名無しさん@お腹いっぱい。
2012/01/02(月) 15:52:00.340426名無しさん@お腹いっぱい。
2012/01/02(月) 16:13:53.44(open-file "./index.html")のようにして
windowsの関連付けどおりにファイルを開くことは可能でしょうか
それらしき関数が見当たらなかったので質問しました
0427名無しさん@お腹いっぱい。
2012/01/02(月) 16:19:35.26multipart/mixedとかは良い感じに実装されてるのにmultipart/form-dataはないのな。惜しいな。
0428名無しさん@お腹いっぱい。
2012/01/02(月) 16:22:33.06gnupack で cygwin もセットで導入しているなら
(defun open-file (file)
(interactive)
(start-process "cygstart" nil "cygstart" file))
cygwin いれてないなら cygstart を start に置き換えればいいんじゃないかな。
0429名無しさん@お腹いっぱい。
2012/01/02(月) 16:26:41.04interactiveなのに引数必須とはいかがなものか。
(defun open-file (&optional file)
(interactive "fFile: ")
(start-process "cygstart" nil "cygstart" file))
0430名無しさん@お腹いっぱい。
2012/01/02(月) 17:08:05.60file が nil だとエラーになるだろうし、
&optional がいらない。
0431名無しさん@お腹いっぱい。
2012/01/02(月) 17:08:59.520432名無しさん@お腹いっぱい。
2012/01/02(月) 17:11:57.960433名無しさん@お腹いっぱい。
2012/01/02(月) 17:19:09.420434名無しさん@お腹いっぱい。
2012/01/02(月) 17:20:19.64てっきり寺だけかと思ってたんだが。
0435名無しさん@お腹いっぱい。
2012/01/02(月) 17:25:14.37外部のプログラムが入ってくると色んな環境で動かす時めんどくさくてやだ。
elispで完結してる方がいいよ。
0436名無しさん@お腹いっぱい。
2012/01/02(月) 17:58:55.73まあ確かに面倒だしキチは嫌いだけどな
0437名無しさん@お腹いっぱい。
2012/01/02(月) 20:06:07.02url-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") ;; 動作がおかしい...
0438名無しさん@お腹いっぱい。
2012/01/02(月) 20:21:32.48いものが入ってくるけど。google に投げるパラメータが正しいのか確認を。
で、気になったのが英語の方は再生できるとなると、http ヘッダがファイル
に残ってても再生できるってことなのか?
0439名無しさん@お腹いっぱい。
2012/01/02(月) 20:46:38.58ヘッダ切り出ししなきゃいけなかったんですね。
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"
0440名無しさん@お腹いっぱい。
2012/01/02(月) 20:47:47.37↓です。
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%a8%e3%81%86%e3%81%94%e3%81%96%e3%81%84%e3%81%be%e3%81%99
0441名無しさん@お腹いっぱい。
2012/01/02(月) 21:43:52.50ダを調べながら試してくしかないかなぁ。
どうやら User-Agent で弾いてはいないみたいだが。
0442名無しさん@お腹いっぱい。
2012/01/02(月) 22:02:11.86url-debug を t にしてみてみたところ、emacs 側でリクエスト文字列が途中で書き変わってたりということはありませんでした。
他でどうなんだろうとおもって wget で試してみたところ User-Agent に何か適当なのが入っていないと
403 エラーになりました。
指定して取得した結果は英語は大丈夫、日本語は Emacs の時とまったく同じ変な結果が返されてきました。
おっしゃるとおり Chrome のリクエストヘッダと比較して差分を調べて見ることにします。何か足りていないんでしょうね。
ありがとうございました。
0443名無しさん@お腹いっぱい。
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 "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))))))
0444名無しさん@お腹いっぱい。
2012/01/02(月) 22:50:38.11環境や目的によるけれど、
open-jtalk なら日本語発声できるよ。
日本語のパースや発音方法を自前でするなら
mbrola などでもできる。
0445名無しさん@お腹いっぱい。
2012/01/02(月) 23:03:14.58url.elは糞だ、外部プログラム呼ぶのはキチだって話してる最中にいい度胸だな。
0446名無しさん@お腹いっぱい。
2012/01/02(月) 23:09:56.87(setq speech-sound-player "mpg123 %s")
0447名無しさん@お腹いっぱい。
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)
これで日本語対象にしてみたらダメだった
文字列から言語判別出来るようにすればよさそうだな
0448名無しさん@お腹いっぱい。
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 "http://translate.google.com/translate_tts?sl=en&tl=%s&q=%s"
(or lang speech-default-language) (url-hexify-string text))
'speech-callback)))
0449名無しさん@お腹いっぱい。
2012/01/03(火) 02:44:31.02(or lang (and (string-match "\\cj" text) "ja") speech-default-language)
0450名無しさん@お腹いっぱい。
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)
0451名無しさん@お腹いっぱい。
2012/01/03(火) 13:41:41.560452名無しさん@お腹いっぱい。
2012/01/03(火) 13:44:26.85(speech-message "C'est parfait!" "fr")
0453名無しさん@お腹いっぱい。
2012/01/03(火) 13:58:29.87おおー
set-process-sentiel で終了を検知すれば後始末が出来るんですね。
勉強になります。
0454名無しさん@お腹いっぱい。
2012/01/03(火) 14:50:57.48mplayerのWindows用gui無し版を入れたらはかどった。mpg123のwindowsビルドだとなんでか再生うまくいかなかったので。
http://www.mplayerhq.hu/design7/news.html
(setq speech-sound-player "mplayer -really-quiet %s")
0455名無しさん@お腹いっぱい。
2012/01/03(火) 15:00:57.910456名無しさん@お腹いっぱい。
2012/01/03(火) 15:05:52.66>>448 だと lexical-let を使ったけれど、
(let ((process (apply 'start-process (car cmdlist) nil cmdlist)))
(set-process-plist process `(temp-file ,temp-file))
(set-process-sentinel process
(lambda (process event)
(delete-file (get 'temp-file
(process-plist process))))))
という風にするほうが真っ当かもしれない。
0457名無しさん@お腹いっぱい。
2012/01/03(火) 15:08:39.08( )
| |
ヽ('A`)ノ マックス!!!
( )
ノε|
__[警]
( ) ('A`)
( )Vノ )
| | | |
■ このスレッドは過去ログ倉庫に格納されています