5 ms·
I have an Automator workflow script, which uses emacsclient to edit any text, in my `~/Library/Services`. The service receives selected text in any application
by jxy 9y ago
I have an Automator workflow script, which uses emacsclient to edit any text, in my `~/Library/Services`. The service receives selected text in any application and output replaces the selected text. It consists of two parts: Run AppleScript, and Run Shell Script.
The AppleScript part is:
on run {input, parameters}
tell application "EmacsMac" to activate
tell application "System Events"
repeat until visible of process "Emacs" is true
delay 0.5
end repeat
end tell
return input
end run
and the Shell Script part (pass input to stdin) is:
tmp=$(mktemp "$HOME/tmp/EditTextinEmacsXXXXXXXX")
ec=/Applications/MacPorts/EmacsMac.app/Contents/MacOS/bin/emacsclient
cat > "$tmp"
until [ $($ec -q -e '(server-running-p)' 2>/dev/null) == t ]; do
sleep 1
done
$ec -q -c "$tmp"
rv="$?"
cat "$tmp"
if [ $rv -ne 0 ]; then
echo "Something went wrong. Please find your text in"
echo "$tmp"
else
rm "$tmp"
fi
Getting it to work with any editor should be straightforward.
- d1egoaz 9y agoWow, this is awesome! Is there any way to make it work without selecting text? (default to all available text on the textarea) BTW, I changed a few things: emacsclient path and the tmp folder: tmp=$(mktemp "/tmp/EditTextinEmacsXXXXXXXX") ec=/usr/local/bin/emacsclient cat > "$tmp" until [ $($ec -q -e '(server-running-p)' 2>/dev/null) == t ]; do sleep 1 done $ec -q -c "$tmp" rv="$?" cat "$tmp" if [ $rv -ne 0 ]; then echo "Something went wrong. Please find your text in" echo "$tmp" else rm "$tmp" fi
- swsieber 9y agoHmm... I'm not very familiar with this, but couldn't you send a key command to select the entire text (CMD A)?
- d1egoaz 9y agoI'm not very familiar either. But the Automator workflow starts with "receives selected text", so I'm not sure it has access to the current text field
- swsieber 9y agoDid not know that. I've used HammerSpoon on Mac, and you can send key shortcuts with that... you could probably glue them together easily
- d1egoaz 9y agoosascript is our friend osascript -e 'tell application "System Events" to keystroke "a" using command down'
- d1egoaz 9y agoI ended forking and creating this https://github.com/d1egoaz/vim-anywhere https://github.com/d1egoaz/vim-anywhere WIP
- jiqiren 9y agowhy not "mktemp -t EditTextinEmacs". This will touch a file in $TMPDIR which is more safe than /tmp.