Recently following a Debian update I found I was unable to reply to
articles in Gnus; I got an error along the lines of:
Args out of range: " .w_()'\"$\\/<>@!|", 64
It turns out that this message comes from derived-mode, more
specifically from derived-mode-merge-syntax-tables. That function
does something like:
(when (eq ?@ (char-syntax-from-code
(get-range-char-table key new ?@)))
...)
The obvious intention is: "get key from range-table, or ?@ if not
found". But char-syntax-from-code can't cope with ?@, it expects a
small number that is a valid offset in the string. When it receives
?@ (or 64), it signals "Args out of range".
In case it matters, the KEY for which the error occurs is the symbol
`latin-iso8859-13'. (Perhaps the Debian upgrade introduced this
charset to my XEmacs?)
Inspection revealed that @ happens to be at position 13 of the string
in question. Following that lead, I made this modification:
(when (eq ?@ (char-syntax-from-code
(get-range-char-table key new 13)))
...)
which removes the error for me. But this is clearly not the right
fix because it relies on a cryptic offset into an unrelated string.
It should probably be modified to this:
(when (let ((tmpcode (get-range-char-table key new 'multi)))
(or (eq tmpcode 'multi)
(eq (char-syntax-from-code tmpcode) ?@)))
...)
or to equivalent but more elegant code that I currently don't seem to
be able to write.
Someone with a better understanding of the code in question and of
syntax tables in general might come up with a better fix.