#!/bin/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 } # with macport of emacs, this has issues. # https://github.com/railwaycat/emacs-mac-port/issues/49 #Let's just open one and then start the server #open -a Emacs.app # 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 "2" ]; 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 "$#" -ne "0" && emacsclient -n "$@" fi