文字 / 改行コード

Last modified: "2019/01/02 17:49:36"

Table of contents


知っていると便利な辺り

バッファの文字コード / 改行コードを変換

[ ローカル設定から変更 ]

「ツール(T)」→「ローカル設定(L)」→「もろもろ」から変更する。

[ キー操作から変更 ]

バッファの文字コードを変換 --- C-x C-k f (change-fileio-encoding)
バッファの改行コードを変換 --- C-x C-k n (change-eol-code)
change-eol-code は、crlf → cr → lf が、ぐるぐるまわる。


開いたファイルの文字コードが違っていた場合に、正しいコードに変更する

find-file でファイルを開いたとき、ファイルの文字コードが意図したものと違った場合に、 正しいコードに変更するには、C-u M-x revert-buffer して、 文字コード ( sjis, euc-jp, jis ... ) を指定する。

または、ESC ESC (revert-buffer *encoding-euc-jp*) とかする。 その他文字コードの指定は、*encoding-sjis*, *encoding-jis* とか。 詳しくは、encoding.l を参照するといいかも。


いろいろ

指定されたディレクトリ内のファイルのエンコーディングを全部変換

[xyzzy:04555](亀井さん)より。

(defun convert-encoding-directory (from to encoding)
  (setq from (namestring from))
  (setq to (namestring to))
  (or (and (path-equal from to)
           (not (yes-or-no-p "入力と出力が同じっぽいっすけどいいっすか?")))
      (let (buffer)
        (unwind-protect
            (progn
              (do-events)
              (setq buffer (create-new-buffer "*foo*"))
              (set-buffer buffer)
              (set-buffer-fileio-encoding encoding)
              (mapc #'(lambda (f)
                        (message "~a..." f)
                        (erase-buffer buffer)
                        (insert-file-contents (merge-pathnames f from))
                        (write-region (point-min) (point-max)
                                      (merge-pathnames f to)))
                    (directory from :file-only t)))
          (and buffer (delete-buffer buffer)))))
  (message "done"))

(defun sjis2utf (from to)
  (interactive "Dsjis2utf: \nDto: ")
  (convert-encoding-directory from to *encoding-utf8*))

(defun utf2sjis (from to)
  (interactive "Dutf2sjis: \nDto: ")
  (convert-encoding-directory from to *encoding-sjis*))

指定ディレクトリ内のファイル文字/改行コードを一気に変換

山本 真二さんのぺーじ を参考に。私がずいぶん触ってしまったので、かなりアヤしい。PHP のマニュアルを変換したくてつくった。

Dir: 変換するファイルのあるディレクトリ
Wild: *.txt とかする
Encoding: tab 押して適当に探す
with-subdir=t, without-subdir=nil: サブディレクトリを対象にするかしないか
(defun my-conv-fileio-and-eol-code-dir (dir wild encoding eol-code recursive)
  (interactive
      "DDir: \nsWild: \nZEncoding: \nnEOL-Code(LF=0, CRLF=1, CR=2): \nSwith-subdir=t, without-subdir=nil: ")
  (let ((files (directory dir
                          :wild wild
                          :absolute t
                          :file-only t
                          :recursive recursive)))
    (set-buffer (create-new-buffer "*WORK*"))
    (set-default-directory dir)
    (dolist (file files)
      (erase-buffer (selected-buffer))
      (ed::insert-file-contents file t)
      (set-buffer-file-name file)
      (set-buffer-fileio-encoding encoding)
      (change-eol-code eol-code)
      (set-buffer-modified-p t)
      (save-buffer))
    (delete-buffer (selected-buffer))
    ))

指定ディレクトリ以下のみ文字コード・改行コード指定

xyzzy Part3 214 より。C-x C-f C:/tmp/euc-jp/hoge.txt とかで、ファイルを新規に作成すると、 文字コード euc-jp 、改行コード LF でファイルが作成される。ファイラから、 N で作成してもいいみたい。

(setq *eucjp-lf-directory* '(
                             "C:/tmp/euc-jp/"
                             "//server/home/"
                             ))

(defun set-eucjp-lf-hook ()
  (let ((file (get-buffer-file-name))
        dir dir-length)
    (when (and (zerop (point-max))
               (string file))
      (setq dir (directory-namestring file))
      (dolist (eucjp-lf-dir *eucjp-lf-directory*)
        (setq dir-length (length eucjp-lf-dir))
        (when (and (>= (length dir) dir-length)
                   (string-equal eucjp-lf-dir (subseq dir 0 dir-length)))
          (set-buffer-fileio-encoding *encoding-euc-jp*)
          (set-buffer-eol-code 0)
          (return))))))
(add-hook '*find-file-hooks* 'set-eucjp-lf-hook)

上記は、サブディレクトリも効くようになっているが、指定ディレクトリ直下のみにしたい場合は、

(when (string-equal sjis-crlf-dir dir) ...

とのこと。xyzzy Part3 215 より。