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

Re: how to setuo Mule-UCS



こんにちは。chiyu(AKABA Nobuyuki)といいます。

"T.Fukagawa" <bruce@xxxxxxxxxx> writes:
> 小島> これを「編集する」する意味があるかどうかはわかりませんが、ファイ
> 小島> ルを開いて、Unicode表を片手に、そのままコードを打てば「編集」もで
> 小島> きます。たとえば、\u8a9e を \u4eba に変えれば「日本人」となるはず
> 小島> です。native2ascii -reverse INPUTFILE OUTPUTFILE すれば確認できる
> 小島> と思います。Mule-UCS は必要ありません。
> 
> 小島> 以上
> 
> 小島> でも、これは深川さんの意図するものじゃあないですよね?
> 
> はい。さすがに、それは辛いです (^^;

JavaのUnicode Escapes(\uxxxx)をMule-UCSを使って
新しい文字コードとして定義したかったのですが、
自分にはまだそこまでの力はないので、
cgreek-emacs20 (古典ギリシア語環境)
http://www.etl.go.jp/etl/divisions/~ntakahas/npx/
のTeX形式での入出力の部分を参考にして、
次のような設定をしてみました。
Meadow1.10 + Mule-UCS-0.62を使用しました。

実は、次のような不具合があります。
下のコードをevaluateした後、はじめて(既存の).javaファイルを
find-fileすると、
File mode specification error: (args-out-of-range 0 3)
というエラーがエコーエリアに表示され、
バッファ内もUnicode Escapesがdecodeされていません。
そして、もう一度find-fileすると、以後は正しくdecodeされます。

java-mode-hookの設定に問題がある、ということは
わかるのですが、ではいったいどうしたらいいのでしょうか???
どなたかご教授お願いします....。

(defun mule-to-UE-region (beg end)
  "Convert multilingual characters in the region into Unicode Escapes notation."
  (interactive "*r")
  (save-excursion
    (save-restriction
      (narrow-to-region beg end) ;ナローイング
      (mule-to-UE-buffer))))

(defun mule-to-UE-buffer nil ;Mule-UCS-0.62/lisp/un-define.el内のchar-to-ucsを使用
  "Convert multilingual characters in the current buffer into Unicode Escapes notation."
  (interactive "*")
  (save-excursion
    (save-restriction
      (let (ch ch-id)
        (goto-char (point-min)) ;バッファの先頭へ
        (while (not (eobp)) ;バッファの最後でない間、
          (setq ch (following-char)) ;ポイント位置の文字コード
          (setq ch-id (nth 0 (split-char ch))) ;その文字のleading-charcter
          (if (not (eq 'ascii ch-id)) ;その文字がASCIIでなければ、
              (progn
                (insert (concat "\\u" (format "%04x" (char-to-ucs ch)))) 
                                        ;Unicode番号に変換
                (delete-char 1)) ;その文字自身(ch)を削除
            (forward-char 1))))))) ;ASCIIな場合は、そのまま次の文字へ。



(defun UE-to-mule-region (beg end)
  "Convert the region from Unicode Escapes notation into mule characters."
  (interactive "*r")
  (save-excursion
    (save-restriction
      (narrow-to-region beg end) ;ナローイング
      (UE-to-mule-buffer))))

(defun UE-to-mule-buffer nil ;Mule-UCS-0.62/lisp/un-define.el内のucs-to-charを使用
  "Convert the current buffer from Unicode Escapes notation into mule characters."
  (interactive "*")
  (save-excursion
    (save-restriction
      (goto-char (point-min)) ;バッファの先頭へ。
      (while (re-search-forward "\\\\u\\([0-9a-f][0-9a-f][0-9a-f][0-9a-f]\\)" nil t)
                                        ;JavaのUnicode Escapesを探す。
        (replace-match (char-to-string
                        (ucs-to-char (string-to-number 
                                      (buffer-substring (match-beginning 1) (match-end 1))
                                      16)))))))) ;それをMule内部の文字に変換

(defun java-find-file (filename &optional wildcards)
  "Do function find-file then do function UE-to-mule-buffer."
  (interactive "FFind file: \np")
  (find-file filename wildcards)
  (save-excursion ;find-fileをした後で
    (save-restriction
      (UE-to-mule-buffer))) ;バッファ内のUnicode EscapesをMule内部の文字に変換
  (set-buffer-modified-p nil)) ;バッファの修正フラグを「修正されてない」にする。


(defun java-save-buffer (&optional args)
  "Do funciton save-buffer after do function mule-to-UE-buffer."
  (interactive "p")
  (save-excursion
    (save-restriction
      (widen) ;ナローイングを解く
      (mule-to-UE-buffer) ;Unicode Escapesに変換した後で、
      (save-buffer args) ;save-bufferをする
      (UE-to-mule-buffer))) ;バッファ内のUnicode Escapesを元の文字に戻す。
  (set-buffer-modified-p nil)) ;バッファの修正フラグを「修正されてない」にする。

(defun java-write-file (filename &optional confirm)
  "Do function write-file after do function mule-to-UE-buffer"
  (interactive
   (list (if buffer-file-name
             (read-file-name "Write file: "
                             nil nil nil nil)
           (read-file-name "Write file: " default-directory
                           (expand-file-name
			    (file-name-nondirectory (buffer-name))
			    default-directory)
                           nil nil))
	 (not current-prefix-arg))) ;ここまでは、write-fileの定義をそのまま使っている。
  (save-excursion
    (save-restriction
      (widen) ;ナローイングを解く
      (mule-to-UE-buffer) ;Unicode Escapesに変換した後で、
      (write-file filename confirm) ;write-fileをする
      (UE-to-mule-buffer))); バッファ内のUnicode Escapesを元の文字に戻す。
  (set-buffer-modified-p nil)) ;バッファの修正フラグを「修正されてない」にする。


(add-hook 'java-mode-hook ;この設定で正しいの???
          (lambda () ;java-modeでファイルを開いた後、
            (UE-to-mule-buffer) ;バッファ内のUnicode Escapesを文字に変換する。
            (goto-char (point-min)) ;バッファの先頭へ移動。
            (set-buffer-modified-p nil) ;バッファの修正フラグを変更。
            (substitute-key-definition ;C-x C-s の置き換え
             'save-buffer 'java-save-buffer java-mode-map global-map)
            (substitute-key-definition ;C-x C-w の置き換え
             'write-file 'java-write-file java-mode-map global-map)))

以上。おげんきで。