[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [bep] ファイルを結合するマクロ <Re: ミューをダウンロードしましたが・・・。



 r高橋です。

Reply Mitsugu SAKAMOTO <mitsugu@...>'s message:

} (defadvice apend-buffer-to-filename (after emacspeak pre act)
} 	"speak the current line" 
} 	(emacspeak-speak-line))
} 
} かなあ。

 おお! やっぱり裏技があるんですね! ありがとうございます。
これって、既存のコマンドとかでしゃべらせたいものが出てきたら、自分で勝手
に加えてしまっても大丈夫ですか?

Reply Koichi INOUE <inoue@...>'s message:

} > ;;; バッファ全体をファイルに追加(shift jis)
} > (defun append-buffer-to-file (filename)   
} >   (interactive "Ffilename: ")
} >   (save-excursion)
} >   (let 
} >       ((coding-system-for-write 'shift_jis-dos))
} >     (append-to-file 
} >      (point-min) 
} >      (point-max) 
} >      filename)))
} > ;;;ここまで
} 
} この関数はバッファの中のマークやポイントの位置を変更しないので、
} save-excursionしなくてもいいかも知れません。それから、やるとしたら

 きゃっ、ひそかに井上さんの「weather-insert-here」をまねしたつもりで、ふ
ふふと思っていたのですが、(save-excursion ...) は、

		      (save-excursion
			(goto-char (point-max)) ...)

みたいに使うんだったんですね。調べもせずに、ちゃっかり背伸びしすぎてしま
いました(^_^;)。

} (save-excursion
} やりたいこと.....)
} という形式です。だから上の関数では(save-excursion)は意味を持っていません。

 わかりました。
(point-min) と (point-max) は、バッファの最初と最後の値を返してくれるんで
すね。
実際に append-to-file するときのキー操作を思い浮かべながら考えていたので、
そこも勘違いしていました。
あと、万が一実際に (goto-char ...) していたとしても、(let ...) の中でやっ
ていれば自然に (save-excursion ...) される……というのはありますか? 
「副作用」は (let ...) の外まで残るんでしたっけ?(そうじゃないと意味がな
い……?)

} でも、よくできました。(私が言っていいのかな?)

 ありがとうございます。ほめてもらえるのはとってもうれしいっす。

} > ……(^_^)。ただ、BEPだと"filename: "のプロンプトはしゃべってくれない……
} > ですよね? これをしゃべらせるようにする裏技ってあるでしょうか?
} 
} 坂本さんが書いてくれている方法はもう中身を変更したくない関数や人がつくっ
} た関数をなんとかしゃべらせるためにはよく使う方法です。
} でも、今回の場合はもう少しよい方法があります。
} しゃべらない理由は、BEP(Emacspeak)が(interactive)の"F"で始まる引数を使っ
} てファイル名を読むことに対応していないのが原因っぽいです。
} ファイル名をユーザに問い合わせる方法としては、他に
} (read-file-name "append to file: ")
} というのがあり、こちらはEmacspeakで読み上げられます。
} これを使って以下のようにすることも可能です。
} 
} (defun append-buffer-to-file ()
}   (interactive)
}   (let ((filename (read-file-name "append-to-file: " default-directory))
} 	(coding-system-for-write 'shift_jis-dos))
}     (append-to-file (point-min) (point-max) filename)
} ))
} 
} ただし、本当はこれにファイル名でない文字列(たとえばディレクトリの名前)とか、
} 書き込めないファイル名を与えるとエラーになってしまうので、file-regular-p
} とかfile-writable-pとかを使って確認する必要があると思います。
} 今は割愛させてください。

 これ、一応自分で調べてやってみますね。
形ができたら、作ってみたのを書くので、また教えてください。

} > coding-system-for-write に shift_jis-dos というシンボルを束縛している……
} > と考えていいですか?
} 
} そうです。
} 
} > それで、なぜいきなりファイルの保存形式がshift_jisになるのでしょう?(Ema
} > csの変数にはなかったので、なぜいきなり shift_jis-dos を、意味のある変数と
} > して使えるのかな……と不思議です)。
} 
} shift_jis-dosはただのシンボルで、Emacsの中のどこかで「shift jisで改行コー
} ドはCR LFになっているcoding-systemを表す」と定義されています。
} tが「真」、nilが「偽」を表すというのと似ています。ただし、shift_jis-dos
} はtとかと違って変数としての値が定義されていないので、評価してもエラーになります。
} 前とだぶりますが、C-h Cでどのようなcoding-systemがあるか見られます。

 見てみました。
BEPだと、C-h Cのプロンプトもしゃべらないんですね。もしかして、他のよく使
うものは、しゃべるように、一つ一つ坂本さんが書いてくださったおまじないを
加えているんですか?
それから、ひとまず坂本さんのやり方で append-buffer-to-file をしゃべらせる
……というのは、最初から自分で作る関数ではやはり反則っぽいのでしょうか?

} これをletで定義することでなぜ保存形式がshift_jisになるかですが、
} 前にlearning lispで取り上げられたことがあるはずです。
} append-to-fileとかwrite-fileはそのときのcoding-system-for-writeの値(の
} シンボル)に従って、ファイルの保存形式を切り替えるようになっています。
} 後は
} (defun ff () x)
} (let ((x 'shift_jis-dos)) (ff))
} と同じです。

 coding-system-for-write と shift_jis-dos の役割というか関係というか、た
ぶんわかったような気がします。
coding-system-for-write のような場所(?)がちゃんとあって、それをチェックし
てからファイルを書き出すようになっているだなんて、Emacsってやっぱり賢いで
すね……!


**-***-***-***-***-***-***-***-***-***-***-***-**
           Reiko TAKAHASHI  (高橋玲子)
         E-mail:  HFC03614@...
         ICQ UIN: 85924121  (Twinkle)
**-***-***-***-***-***-***-***-***-***-***-***-**