From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Peter Heslin Newsgroups: gmane.emacs.devel Subject: Re: Using quail input methods to translate buffer text. Date: Fri, 07 Jul 2006 23:36:09 +0100 Message-ID: <8764i9caau.fsf@heslin.eclipse.co.uk> References: <87k66rlqys.fsf@heslin.eclipse.co.uk> <87y7v5fvp2.fsf@dur.ac.uk> NNTP-Posting-Host: main.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Trace: sea.gmane.org 1152311872 5681 80.91.229.2 (7 Jul 2006 22:37:52 GMT) X-Complaints-To: usenet@sea.gmane.org NNTP-Posting-Date: Fri, 7 Jul 2006 22:37:52 +0000 (UTC) Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Sat Jul 08 00:37:50 2006 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by ciao.gmane.org with esmtp (Exim 4.43) id 1FyyxB-00005F-9M for ged-emacs-devel@m.gmane.org; Sat, 08 Jul 2006 00:37:41 +0200 Original-Received: from localhost ([127.0.0.1] helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1FyyxA-00045D-S7 for ged-emacs-devel@m.gmane.org; Fri, 07 Jul 2006 18:37:40 -0400 Original-Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1Fyywz-00044j-S7 for emacs-devel@gnu.org; Fri, 07 Jul 2006 18:37:29 -0400 Original-Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1Fyywz-00044T-A8 for emacs-devel@gnu.org; Fri, 07 Jul 2006 18:37:29 -0400 Original-Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Fyywz-00044M-09 for emacs-devel@gnu.org; Fri, 07 Jul 2006 18:37:29 -0400 Original-Received: from [80.91.229.2] (helo=ciao.gmane.org) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA:32) (Exim 4.52) id 1FyyxU-0003ad-0q for emacs-devel@gnu.org; Fri, 07 Jul 2006 18:38:00 -0400 Original-Received: from list by ciao.gmane.org with local (Exim 4.43) id 1Fyywp-0008VR-M0 for emacs-devel@gnu.org; Sat, 08 Jul 2006 00:37:19 +0200 Original-Received: from 213-152-32-235.dsl.eclipse.net.uk ([213.152.32.235]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Sat, 08 Jul 2006 00:37:19 +0200 Original-Received: from pj by 213-152-32-235.dsl.eclipse.net.uk with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Sat, 08 Jul 2006 00:37:19 +0200 X-Injected-Via-Gmane: http://gmane.org/ Original-To: emacs-devel@gnu.org Original-Lines: 59 Original-X-Complaints-To: usenet@sea.gmane.org X-Gmane-NNTP-Posting-Host: 213-152-32-235.dsl.eclipse.net.uk User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.0.50 (gnu/linux) Cancel-Lock: sha1:rxpf2TBFeOsR9NShuloEuODUV9w= X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:56750 Archived-At: Kenichi Handa writes: > Currently I think there's no clean solution. Even appending > a space doesn't work for some input methods. OK, so I tried a different approach. I borrowed some lines of this code from quail.el without fully understanding the data structures, so it may be wrong, but it seems to work for my simple purposes. Are there any problems with this approach? (defun my-quail-conv (beg end) (interactive "r") (save-excursion (let ((output)) (goto-char beg) (while (< (point) end) (multiple-value-bind (trans map) (my-quail-conv-get-trans-and-map (quail-map) 0) (setf output (concat output (or (if map (my-quail-conv-get-compound-char trans map) trans) (char-to-string (char-after))))) (forward-char))) (with-output-to-temp-buffer "*conversion output*" (princ output))))) (defun my-quail-conv-get-compound-char (trans map) (multiple-value-bind (next-trans next-map) (my-quail-conv-get-trans-and-map map 1) (cond (next-map (forward-char) (my-quail-conv-get-compound-char next-trans next-map)) (next-trans (forward-char) next-trans) (t trans)))) (defun my-quail-conv-get-trans-and-map (alist offset) (let* ((ch (char-after (+ offset (point)))) (map (cdr (assq ch alist))) (trans (and map (quail-get-translation (car map) (char-to-string ch) 1)))) (if (consp trans) (setq trans (aref (cdr trans) 0))) (setq trans (etypecase trans (string trans) (null trans) (integer (char-to-string trans)))) (values trans (cdr map)))) -- Peter Heslin (http://www.dur.ac.uk/p.j.heslin)