[Top][All Lists]

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

Re: Usage of standard-display-table in MSDOS

From: Kenichi Handa
Subject: Re: Usage of standard-display-table in MSDOS
Date: Thu, 09 Sep 2010 20:57:27 +0900

In article <address@hidden>, "Ehud Karni" <address@hidden> writes:

> > If you don't like it, you must give up decoding bytes
> > #x80..#x9A into Hebrew chars.  You decode them as raw-bytes,
> > and setup a display table to display them as Hebrew chars.
> > It can be done by this code:

> I think I solved this by using text properties.

Ah, ummm, a kind of dirty hack, but, perhaps it's
unavoidable in your situation.

> It is still unfinished, but it works, and I'll appreciate any comments.
> There are some problems, see at the end.

> Here is what I did (based on your advice).

> (define-charset 'hebrew-MSDOS-binary
>   "Hebrew subset of CP862 (#x80-#x9A) with no-conversion"
>   :code-space [#x80 #x9A]
>   :map (let ((map (make-vector 54 0))
>              (ix 27))
>          (while (> ix 0)
>          (setq ix (1- ix))
>            (aset map (+ ix ix)   (+ #x80 ix))
>            (aset map (+ ix ix 1) (+ #x80 ix)))
>          map)
>   :supplementary-p t)

For that, you don't have to use :map but can use
:code-offset as this:

(define-charset 'hebrew-MSDOS-binary
  "Hebrew subset of CP862 (#x80-#x9A) with no-conversion"
  :code-space [#x80 #x9A]
  :code-offset #x80
  :supplementary-p t)

> (defun hebrew-iso-with-8bit-pre-write (start end)
>        (let* ((text (if (numberp start)
>                       (buffer-substring start end)
>                       start))
>               (beg 0)
>               (end (length text))
>               va)
>            (while (setq beg (text-property-any beg end 'Hebrew 'DOS text))
>                (setq va (aref text beg))
>                (and (>= va #x05D0)                 ;; א
>                     (<= va #x05EA)                 ;; ת
>                     (aset text beg (- va #x550)))
>                (setq beg (1+ beg)))
>            (set-buffer (get-buffer-create " *heb-wrt*"))
>            (delete-region (point-min) (point-max))
>            (insert text)
>            nil))

You don't have to make a working buffer.  You can directly
modify the current buffer because it's already a working
buffer managed by Emacs itself.

> There are some Problems:

> 1. (describe-character-set 'hebrew-MSDOS-binary) exit with error:
>    Wrong type argument: char-or-string-p, [128 128 129 129 130 130 131 131 
> 132 132 ...]
>    The vector is the :map value.

Ah, I'll fix it soon.

> 2. The `:post-read-conversion' function must return a number otherwise there 
> is an error.
>    There is nothing about it in `define-coding-system' documentation.

I'm going to fix the docstring as this.


VALUE must be a function to call after some text is inserted and
decoded by the coding system itself and before any functions in
`after-insert-functions' are called.  This function is passed one
argument; the number of characters in the text to convert, with
point at the start of the text.  The function should leave point
the same, and return the new character count.

> 3. The documentation for `write-region-annotate-functions' has:
>     "The function should return a list of pairs of the form (POSITION . 
>     consisting of strings to be effectively inserted at the specified 
> positions
>     of the file being written (1 means to insert before the first byte 
> written).
>     The POSITIONs must be sorted into increasing order."
>   This did not work at all. I had to use the alternate pathway:
>     An annotation function can return with a different buffer current.
>     Doing so removes the annotations returned by previous functions, and
>     resets START and END to `point-min' and `point-max' of the new buffer.

For this part, I'm going to fix as this:


VALUE must be a function to call after all functions in
`write-region-annotate-functions' and `buffer-file-format' are
called, and before the text is encoded by the coding system
itself.  This function should convert the whole text in the
current buffer.  For backward compatibility, this funciton is
passed two arguments which can be ignored.

Kenichi Handa

reply via email to

[Prev in Thread] Current Thread [Next in Thread]