From 27dcca5967082474229d5efafb941e0d5229c760 Mon Sep 17 00:00:00 2001 From: Marc Cornellà Date: Tue, 28 Sep 2021 10:10:43 +0200 Subject: refactor(emacs): simplify emacsclient wrapper code --- plugins/emacs/emacsclient.sh | 36 +++++++++++++++++------------------- 1 file changed, 17 insertions(+), 19 deletions(-) (limited to 'plugins/emacs/emacsclient.sh') diff --git a/plugins/emacs/emacsclient.sh b/plugins/emacs/emacsclient.sh index 04a2c2afd..0702d7a33 100755 --- a/plugins/emacs/emacsclient.sh +++ b/plugins/emacs/emacsclient.sh @@ -1,29 +1,27 @@ #!/bin/sh -_emacsfun() -{ - # get list of emacs frames. - frameslist=`emacsclient --alternate-editor '' --eval '(frame-list)' 2>/dev/null | egrep -o '(frame)+'` +emacsfun() { + local frames="$(emacsclient --alternate-editor "" -n -e "(length (frame-list))" 2>/dev/null)" - if [ "$(echo "$frameslist" | sed -n '$=')" -ge 2 ] ;then - # prevent creating another X frame if there is at least one present. - emacsclient --alternate-editor "" "$@" - else - # Create one if there is no X window yet. - emacsclient --alternate-editor "" --create-frame "$@" - fi + # Only create another X frame if there isn't one present + if [ -z "$frames" -o "$frames" -lt 2 ]; then + emacsclient --alternate-editor "" --create-frame "$@" + return $? + fi + + emacsclient --alternate-editor "" "$@" } # adopted from https://github.com/davidshepherd7/emacs-read-stdin/blob/master/emacs-read-stdin.sh # If the second argument is - then write stdin to a tempfile and open the # tempfile. (first argument will be `--no-wait` passed in by the plugin.zsh) -if [ "$#" -ge "2" -a "$2" = "-" ] -then - tempfile="$(mktemp --tmpdir emacs-stdin-$USERNAME.XXXXXXX 2>/dev/null \ - || mktemp -t emacs-stdin-$USERNAME)" # support BSD mktemp - cat - > "$tempfile" - _emacsfun --no-wait $tempfile -else - _emacsfun "$@" +if [ $# -ge 2 -a "$2" = "-" ]; then + tempfile="$(mktemp --tmpdir emacs-stdin-$USERNAME.XXXXXXX 2>/dev/null \ + || mktemp -t emacs-stdin-$USERNAME)" # support BSD mktemp + cat - > "$tempfile" + emacsfun --no-wait "$tempfile" + return $? fi + +emacsfun "$@" -- cgit v1.2.3-70-g09d2 From 2acae3797b713db2520bb27e76f25d3de6cee48e Mon Sep 17 00:00:00 2001 From: Marc Cornellà Date: Tue, 28 Sep 2021 12:30:29 +0200 Subject: fix(emacs): assess if there are open frames of the expected type This change looks at the frame type of the open frames ('framep) and looks if they're of the type requested based on the arguments passed to emacsclient (-nw/-t/--tty require tty frames, otherwise we need graphical frames). NOTE: this code considers anything different than t as graphical terminals, including MS-DOS types (pc). I don't have such a setup to test if this is correct. --- plugins/emacs/emacsclient.sh | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) (limited to 'plugins/emacs/emacsclient.sh') 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 -- cgit v1.2.3-70-g09d2 From de76f7cb491c7d566dd94f161b5dbc32e93af914 Mon Sep 17 00:00:00 2001 From: Marc Cornellà Date: Tue, 28 Sep 2021 12:34:44 +0200 Subject: fix(emacs): correctly pass arguments to emacsclient when $2 is stdin --- plugins/emacs/emacsclient.sh | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'plugins/emacs/emacsclient.sh') diff --git a/plugins/emacs/emacsclient.sh b/plugins/emacs/emacsclient.sh index 53a3a428a..25efe0d68 100755 --- a/plugins/emacs/emacsclient.sh +++ b/plugins/emacs/emacsclient.sh @@ -22,16 +22,17 @@ emacsfun() { emacsclient --alternate-editor "" "$@" } - -# adopted from https://github.com/davidshepherd7/emacs-read-stdin/blob/master/emacs-read-stdin.sh +# Adapted from https://github.com/davidshepherd7/emacs-read-stdin/blob/master/emacs-read-stdin.sh # If the second argument is - then write stdin to a tempfile and open the # tempfile. (first argument will be `--no-wait` passed in by the plugin.zsh) if [ $# -ge 2 -a "$2" = "-" ]; then + # Create a tempfile to hold stdin tempfile="$(mktemp --tmpdir emacs-stdin-$USERNAME.XXXXXXX 2>/dev/null \ || mktemp -t emacs-stdin-$USERNAME)" # support BSD mktemp + # Redirect stdin to the tempfile cat - > "$tempfile" - emacsfun --no-wait "$tempfile" - return $? + # Reset $2 to the tempfile so that "$@" works as expected + set -- "$1" "$tempfile" "${@:3}" fi emacsfun "$@" -- cgit v1.2.3-70-g09d2