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

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



井上です。

もうdefunも慣れてきたみたいですね。おめでとうございます。

Reiko TAKAHASHI <HFC03614@...> writes:

> ;;; バッファ全体をファイルに追加(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しなくてもいいかも知れません。それから、やるとしたら
(save-excursion
やりたいこと.....)
という形式です。だから上の関数では(save-excursion)は意味を持っていません。
でも、よくできました。(私が言っていいのかな?)

>  *scratch*で遊んでみたり、無謀にも_emacsや.emacsにまで入れてみたりしまし
> たが、どのやり方でも元気に動いてくれています(と思う)。ちょっとうれしい
> ……(^_^)。ただ、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があるか見られます。

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

-- 
                    Koichi Inoue, ARGV
                    E-Mail: inoue@...
                    ICQ UIN: 74900690