Skip to content

Instantly share code, notes, and snippets.

@tshu-w
Created August 8, 2022 08:16
Show Gist options
  • Save tshu-w/b7c05626c5849d64a04ac66d623c2559 to your computer and use it in GitHub Desktop.
Save tshu-w/b7c05626c5849d64a04ac66d623c2559 to your computer and use it in GitHub Desktop.
EmacsClient.app on macOS
#!/usr/bin/env bash
# This script starts emacs daemon if it is not running, opens whatever file
# you pass in and changes the focus to emacs. Without any arguments, it just
# opens the current buffer or *scratch* if nothing else is open. The following
# example will open ~/.bashrc
# ec ~/.bashrc
# You can also pass it multiple files, it will open them all. Unbury-buffer
# will cycle through those files in order
# The compliment to the script is et, which opens emacs in the terminal
# attached to a daemon
# If you want to execute elisp, pass in -e whatever.
# You may also want to stop the output from returning to the terminal, like
# ec -e "(message \"Hello\")" > /dev/null
# emacsclient options for reference
# -a "" starts emacs daemon and reattaches
# -c creates a new frame
# -n returns control back to the terminal
# -e eval the script
# Number of current visible frames,
# Emacs daemon always has a visible frame called F1
visible_frames() {
emacsclient -a "" -e '(length (visible-frame-list))'
}
change_focus() {
emacsclient -n -e "(select-frame-set-input-focus (selected-frame))" > /dev/null
}
# Preferred edit file at local emacs via tramp
if [ -n "$SSH_CLIENT" ] || [ -n "$SSH_TTY" ]; then
[ -z $hostname ] && export hostname=`cat $XDG_CACHE_HOME/hostname`
for arg in "$@"; do
[[ "$arg" != -* ]] && set -- "$@" /sshx:"$hostname":$(readlink -f -- "$arg") || set -- "$@" "$arg"
shift
done
fi
# Don't change focus with --help
if [ "$1" = "--help" ]; then
emacsclient --help
exit 0
fi
# try switching to the frame incase it is just minimized
# will start a server if not running
test "$(visible_frames)" -eq "1" && change_focus
if [ "$(visible_frames)" -lt "1" ]; then # need to create a frame
# -c $@ with no args just opens the scratch buffer
emacsclient -n -c "$@" && change_focus
else # there is already a visible frame besides the daemon, so
change_focus
# -n $@ errors if there are no args
test "$#" -eq "0" || emacsclient -n "$@"
fi
on open location address
if {address starts with "org-protocol"} then
do shell script "zsh -c 'ec \"" & address & "\"'"
else
do shell script "zsh -c 'ec --eval '\"'\"'(browse-url \"" & address & "\")'\"'\"''"
end if
end open location
on open filenames
set args to ""
repeat with f in filenames
set args to args & space & (quoted form of POSIX path of f)
end repeat
do shell script "zsh -c \"ec" & args & "\""
end open
do shell script "zsh -c 'ec'"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment