Update (4/27/2020): See Enhanced text manipulation using accessibility APIs for an even better alternative to the dictation box!
When I find myself writing or editing something sufficiently long, I like to have full support for Select-and-Say. I used to use “open dictation box”, since that’s the obvious choice, until I discovered that using Notepad is much faster.
It’s kind of unbelievable that forking a process and starting a third-party editor could be faster than using the feature Nuance designed for this precise purpose. But amazingly it is, by a factor of about 2X! By my measurements, the dictation box starts up in about two seconds, whereas Notepad starts up in one. Transferring text from the dictation box takes about one second versus a half second for Notepad.
Just bind a few commands to make Notepad as easy to use as the dictation box:
from dragonfly import *
from dragonfly.windows.window import Window
class RunApp(ActionBase):
"""Starts an app and waits for it to be the foreground app."""
def __init__(self, *args):
super(RunApp, self).__init__()
self.args = args
def _execute(self, data=None):
StartApp(*self.args).execute()
WaitWindow(None, os.path.basename(self.args[0]), 3).execute()
class UniversalPaste(ActionBase):
"""Paste action that works everywhere, including Emacs."""
def _execute(self, data=None):
foreground = Window.get_foreground()
if foreground.title.find("Emacs editor") != -1:
Key("c-y").execute()
else:
Key("c-v").execute()
# In your universal grammar:
"edit text": RunApp("notepad"),
"edit everything": Key("c-a, c-x") + RunApp("notepad") + Key("c-v"),
"edit region": Key("c-x") + RunApp("notepad") + Key("c-v"),
# In your Notepad grammar:
"transfer out": Key("c-a, c-x, a-f4") + UniversalPaste(),
# To get Emacs support, put something like this in your .emacs file:
(setq frame-title-format
'(""
(buffer-file-name
"%f"
(dired-directory dired-directory "%b"))
" - %m"
" - Emacs editor"))
This gives you commands to start an editing session from several contexts: from nothing, from a selection, or from everything in your current field. And you get an easy way to transfer it out which works perfectly well with Emacs. Also, unlike the dictation box, this doesn’t prevent you from interacting with the existing app you have open (e.g. to visit another tab in Chrome). And if you accidentally mess up and paste it to the wrong place, it is still in your clipboard so you can easily recover it.
Of course, this same technique would work with another editor, it just needs to start up quickly and have full Select-and-Say support. Ideally, I would use it with an editor that has unlimited undo history. And if the editor can start in the background, this could be even faster by avoiding the process fork. If anyone knows a good candidate, please post in the comments!
Just one thing to keep in mind, the dictation box allows for rich text formatting whereas Notepad does not.
Good point. I suppose WordPad could be used if this is needed. From an informal test I just did it looks like it does start more quickly than the dictation box.
I have this functionality kinda wrapped up in my commands. I can select words by saying “select ” so long as it’s on the same line, then just speak over it. I can go to before or after any word, letter, or series of letters. I can select from the cursor, left or right through any word, letter, or series of letters.
I personally just want to do it all directly. From the beginning I supplanted all of dragon’s functionality. No doubt I have room to extend it further, but that’s what I end up expecting to do.
Though, different text buffers act different, so that needs to be known about the app your in. For instance, select a word, from left through right, and then when you press the left arrow some will go left of the whole selection, some will go right of the whole selection, and some will be like those but shifted a character further.
Thanks james,
What a brilliant idea, by the way why are you stop writing. I have a similar condition as yours and I cannot use mouse or keyboard anymore. Finding about Dragon and dragonfly and also your website was a huge relief for me.
Hope you best,
Bijan
Thanks Bijan! I’ve been taking on more ambitious long-term projects which don’t lend themselves to frequent posting. My most recent post on better text editing is a good example of this, and I’ve been working on some fancy features involving OCR for a while but I’d like them to have more polish before I post about them. I do check everything into my repositories, though (linked from the sidebar), for anyone who wants more detailed updates.