浏览代码

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.
Marc Cornellà 3 年之前
父节点
当前提交
2acae3797b
共有 1 个文件被更改,包括 12 次插入2 次删除
  1. 12 2
      plugins/emacs/emacsclient.sh

+ 12 - 2
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