Re: Продолжение истории про buffer-file-coding-system ...

[email protected] (Nickolay Pakoulin)
Newsgroups gmane.emacs.xemacs.user.russian
Message-ID <[email protected]>
 intro: "DA" == Dmitry Astapov <[email protected]> writes:

  DA> Если кто помнит, некоторое время тому назад я (в письме
  DA> <[email protected]>) жаловался на то, что у меня не
  DA> работает конструкция:

  DA> (modify-coding-system-alist 'file "\\.abc\\'" '(windows-1251
  DA> . windows-1251))

  DA> Точнее, она работает, но не до конца - указаная coding-system
  DA> используется для чтения файла с диска, но buffer-file-coding-system
  DA> всегда оказывается "равным" set-language-environment. Т.е., в моем
  DA> случае, я всегда получаю buffer-file-coding-system == koi8-u-unix.

  DA> Соответственно, если ты после исправлений на автомате давишь C-x C-s, то
  DA> файл записывается в кодировке koi8-u. Особенно замечательно работает это
  DA> для xml-файлов в кодировке utf-8....

  DA> Чтобы этого не происходило, после открытия файла приходится делать M-x
  DA> set-buffer-file-coding-system RET ut-8 (например) RET. "И так 18
  DA> раз"(с)анекдот. Надоедает до невозможности.

Этот вопрос надо обсудить с разработчиками.  Лично мне кажется приведенный
отрывок кода несколько странным.  Обойти его можно.

Надо воспользоваться `insert-file-contents-post-hook'.  Добавь в init файл
такой код:

(defun hack-file-codesys (filename visit return-val)
  ;; `coding-system' is set in `insert-file-contents'
  (when (or (coding-system-p coding-system)
            (and (symbolp coding-system)
                 (find-coding-system coding-system)))
    (set-buffer-file-coding-system coding-system)
    coding-system))

(add-hook 'insert-file-contents-post-hook
          'hack-file-codesys)

У меня вроде работает (Хемакс 21.5 на винде).  Попробуй.

Приведённый код гарантированно не будет работать при открытии несуществующих
файлов.  До него просто не дойдет управление.  Для того, чтобы при открытии
несуществующего файла выставлялась нужная тебе кодировка, можно сделать вот
так:

(defun set-new-file-codesys (&rest ignored)
  (when (and (stringp buffer-file-name)
             (find-file-coding-system-for-read-from-filename
              buffer-file-name))
    (set-buffer-file-coding-system
     (find-file-coding-system-for-read-from-filename
      buffer-file-name)))
  nil)

(add-hook 'find-file-not-found-hooks
          'set-new-file-codesys)

У меня вроде как работает.

Если воспользуешься моими предложениями, сообщи, пожалуйста, о результатах.

Коля.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.