[Message Prev][Message Next][Thread Prev][Thread Next][Message Index][Thread Index]

[MD:1851] buffer-file-coding-sytem for empty buffer



>>>>> meadow-users-jp の No. 2636
>>>>> Message-Id: <wkn1gmcmy5.fsf@xxxxxxxxxxxxxxxxxxxxxx> で、
>>>>> "yagi" == yagi@xxxxxxxxxxxxxxxさま曰く...

yagi> 誤解されたかもしれませんが、
yagi> うまくいったのはファイルが存在しない場合だけです。

yagi> Keiichi Suzuki <keiichi@xxxxxxxxx> writes:
>> こんな patch でよろしいでしょうか?

yagi> 当初 find-buffer-file-type-coding-system を修正すべきかな、

;; この関数って find-file-not-found-set-buffer-file-coding-system() でし
;; か使われていないような気がするのですが、気のせいでしょうか?

yagi> と考えたのですが、そうすると dos-w32.el に find-file-binary なる
yagi> 関数があるものの C-x RET c でコードを指定できてしまうことになります。

ここまでの問題と矢木さんがおっしゃられていることをそのまま実現すると...

(defun find-file-not-found-set-buffer-file-coding-system ()
  (save-excursion
    (set-buffer (current-buffer))
    (let* ((dummy-insert-op (list 'insert-file-contents (buffer-file-name)))
	   (coding-system-pair
	    (if coding-system-for-read
		(cons coding-system-for-read coding-system-for-read)
	      (find-buffer-file-type-coding-system dummy-insert-op))))
      (setq buffer-file-coding-system (car coding-system-pair))
      (setq buffer-file-type (eq buffer-file-coding-system 'no-conversion)))))

のようにして、 find-file-binary() で coding-system-for-read を
no-conversion に拘束してしまえば済みそうな気がします。

しかし、 find-file-binary() が、 coding-system-for-read を no-conversion 
に拘束していないこと、そもそもno-conversion で find-file したいのならば 
C-x RET c で no-conversion を指定すればよいこと、
file-name-buffer-file-type-alist の存在を加味すると find-file-binary() 
というのは eol conversion を指定するための関数ではないかという気がします。

yagi> file-coding-system-alist と file-name-buffer-file-type-alist の
yagi> 使い分けはよくわかりません。

file-name-buffer-file-type-alist で binary として定義されているものであ
れば、単に no-conversion で find-file したいということであれば、わざわざ
このようなものを用意しなくとも、 file-coding-system-alist を使えば済むは
ずです。

しかし、わざわざ file-name-buffer-file-type-alist などというものを用意し
ていることを考えると、 dos 系の fopen での "rb" や "rt" を決定するための
ものではないかと思うのです。

find-buffer-file-type-coding-system() で `insert-file-contents' の場合、 
coding-system-for-* / file-coding-system-alist /
default-buffer-file-coding-system が non-nil で eol conversion を指定さ
れていない時は、 file-name-buffer-file-type-alist で binary と定義されて
いるファイルは *-unix を返し、 `write-file' の場合には、 binary のファイ
ルは *-unix、 text のファイルは *-dos にすると言うのが良いのではないでしょ
うか?

... とはいっても最初に書いた「気のせい」が本当ならば、あまり意味がないよ
うにも思います。 ^^;;;

-- 
鈴木圭一 / keiichi@xxxxxxxxx
PGP finger print (DH/DSS)
0B32 B37E 6DE9 3BC1 68A4  4089 7AAF 2B03 ECBD 614B