diff --git a/plugins/emacs/emacsclient.sh b/plugins/emacs/emacsclient.sh index 0702d7a33..53a3a428a 100755 --- a/plugins/emacs/emacsclient.sh +++ b/plugins/emacs/emacsclient.sh @@ -1,10 +1,20 @@ #!/bin/sh emacsfun() { - local frames="$(emacsclient --alternate-editor "" -n -e "(length (frame-list))" 2>/dev/null)" + local cmd frames + + # Build the Emacs Lisp command to check for suitable frames + # See https://www.gnu.org/software/emacs/manual/html_node/elisp/Frames.html#index-framep + case "$*" in + *-t*|*--tty*|*-nw*) cmd="(memq 't (mapcar 'framep (frame-list)))" ;; # if != nil, there are tty frames + *) cmd="(delete 't (mapcar 'framep (frame-list)))" ;; # if != nil, there are graphical terminals (x, w32, ns) + esac + + # Check if there are suitable frames + frames="$(emacsclient -a '' -n -e "$cmd" 2>/dev/null)" # Only create another X frame if there isn't one present - if [ -z "$frames" -o "$frames" -lt 2 ]; then + if [ -z "$frames" -o "$frames" = nil ]; then emacsclient --alternate-editor "" --create-frame "$@" return $? fi