help-gnu-emacs
[Top][All Lists]
Advanced

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

scripting input methods (was back (batch) translate chars to keyboard ev


From: Rustom Mody
Subject: scripting input methods (was back (batch) translate chars to keyboard events)
Date: Mon, 13 Feb 2012 12:50:28 +0530

Rustom Mody <rustompmody@gmail.com> wrote:
I have some bunch of sanskrit (devanagari) to type.  It would be easiest for me if I could have the
English (roman) as well as the sanskrit (devanagari).

For example using the devanagari-itrans input method I can write the gayatri mantra using

OM bhUrbhuvaH suvaH
tatsaviturvarenyam
bhargo devasya dhImahi
dhiyo yonaH prachodayAt

and emacs produces *on the fly* (ie I cant see/edit the above)

  ॐ भूर्भुवः सुवः
  तत्सवितुर्वरेण्यम्
  भर्गो देवस्य धीमहि
  धियो योनः प्रचोदयात्

Can I do it in batch mode? ie write the first in a file and run some command on it to produce the second?






On Mon, Feb 13, 2012 at 9:45 AM, Nick Dokos <nicholas.dokos@hp.com> wrote:


Yup, it can be done, probably in multiple ways but here is one.

I saw your question on the python list and did a bit of digging: I came
up with a method that probably will work but will require more work to
flesh out. The key was that input methods read events one at a time and
(from the Elisp manual):

 -- Function: read-event &optional prompt inherit-input-method seconds
    This function reads and returns the next event of command input,
    waiting if necessary until an event is available.  Events can come
    directly from the user or from a keyboard macro.

So if you could get the text to become the body of a keyboard macro,
you could change the input method, execute the macro and that would
submit the text to the input method as if you had typed it.

Trying the theory, I started a keyboard macro, typed in OM and a newline
and ended the keyboard macro. I can then switch the input method to
devanagari-itrans, execute the macro and presto! I get the proper symbol
(at least to my untrained eyes).

You can insert the definition of a macro in a buffer (and name it, edit it,
save it to a file and load the file later, and execute the macro by name as
if it were a function (which it is, strictly speaking). The OM macro above
turns out to look like this :

(fset 'om
  (lambda (&optional arg) "Keyboard macro." (interactive "p") (kmacro-exec-ring-item (quote ([79 77 return] 0 "%d")) arg)))


 
I would change the python (or whatever) program to produce the whole
fset form into a file, then start emacs, load the file, switch input
method and execute the macro: M-x om.

Nick


Thanks for your efforts Nick!
Some questions:
1. Why fset? 

I can get the following to work

(defun om (&optional arg)
  "Keyboard macro."
  (interactive "p")
  (kmacro-exec-ring-item '([79 77 return] 0 "%d") arg))

so assuming its just a stylistic question. [If not please enlighten]
By 'work' I mean after this definition, M-x om inserts ॐ into the buffer if devanagari-itrans is active. So far so good

After that I am a bit stuck:
2. kmacro-exec-ring-item has just this much documentation.

kmacro-exec-ring-item is a compiled Lisp function in `kmacro.el'.

(kmacro-exec-ring-item ITEM ARG)

Execute item ITEM from the macro ring.

Does not take me far :-(

3.  I guess this is really the same as the above question...
You say
 
So all you need to do is produce that vector of ascii values in there. I
wrote a trivial python program to produce the ascii codes of your text
and stuffed the output into the vector, reevaluated the fset, and
executed the macro with a result that looks suspiciously like the one in
your email.


The python (or elisp) to a text (ASCII-only) string to its ASCII is 1 line:

>>> def Ascii(str): return [ord(c) for c in str]

I ran this on my file and got:
[79, 77, 32, 98, 104, 85, 114, 98, 104, 117, 118, 97, 72, 32, 115, 117, 118, 97, 72, 10, 116, 97, 116, 115, 97, 118, 105, 116, 117, 114, 118, 97, 114, 101, 110, 121, 97, 109, 10, 98, 104, 97, 114, 103, 111, 32, 100, 101, 118, 97, 115, 121, 97, 32, 100, 104, 73, 109, 97, 104, 105, 10, 100, 104, 105, 121, 111, 32, 121, 111, 110, 97, 72, 32, 112, 114, 97, 99, 104, 111, 100, 97, 121, 65, 116, 10]

Ok so remove the commas, ADD A 'return'  after to last 10 (Whats that??)
And it almost works
ie I get the devanagari output followed by a elisp error:

Debugger entered--Lisp error: (void-variable प्रचोदयात्)
  eval(प्रचोदयात्)
  eval-last-sexp-1(t)
  eval-last-sexp(t)
  eval-print-last-sexp()
  call-interactively(eval-print-last-sexp nil nil)
  execute-kbd-macro([79 77 32 98 104 85 114 98 104 117 118 97 72 32 115 117 118 97 72 116 97 116 115 97 118 105 116 117 114 118 97 114 101 110 121 97 109 98 104 97 114 103 111 32 100 101 118 97 115 121 ...] 1 kmacro-loop-setup-function)
  kmacro-exec-ring-item(([79 77 32 98 104 85 114 98 104 117 118 97 72 32 115 117 118 97 72 116 97 116 115 97 118 105 116 117 114 118 97 114 101 110 121 97 109 98 104 97 114 103 111 32 100 101 118 97 115 121 ...] 0 "%d") 1)
  om(1)
  call-interactively(om t nil)
  execute-extended-command(nil)
  call-interactively(execute-extended-command nil nil)

The प्रचोदयात् is the devanagari of the last line: prachodayAt
If I remove the 10 (newline?) it seems to work without the elisp error

I guess the problem would be solved if some more suitable function than
I wonder if there is some better function than kmacro-exec-ring-item could be found for this?

reply via email to

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