web-dev-qa-db-ja.com

emacsclient:フレームが存在しない場合はフレームを作成します

を使用してemacsサーバーを起動します

emacs --daemon

次に、を使用してファイルを開きます

emacsclient filename.ext

ただし、最初のファイルはを使用して開く必要があります

emacsclient -c filename.ext

emacsclientの-cコマンドラインフラグを使用せずに、後で後続のファイルで使用できる新しいフレームを作成するため。

これを自動化したい。 「emacsフレームがない場合、emacsclientはフレームを作成する必要があります。そうでない場合は、現在のフレームを使用する必要があります」。どうすればそれができますか?

9
Idlecool

これはdimitriのソリューションに似ていますが、emacsがemacs --daemonとして起動された場合を処理します。 emacs --daemonは非表示のウィンドウを作成し、既存のウィンドウをチェックするときにxpropが誤検知を発生させます。

#!/bin/bash

emacsclient -n -e "(if (> (length (frame-list)) 1) 't)" | grep -q t
if [ "$?" = "1" ]; then
    emacsclient -c -n -a "" "$@"
else
    emacsclient -n -a "" "$@"
fi
10
Jim Hunziker

フレームがまだない場合は、最初にフレームを作成してから、既存のフレームでファイルを開くことができます。これは、ウィンドウディスプレイで現在開いているフレームがない場合に、最初のディスプレイでフレームを作成するスニペットです。 x-display-listを使用してディスプレイにフレームが既に存在するかどうかを確認するなど、さまざまな方法でこれを微調整することをお勧めします。 `.emacsには(require 'cl)が必要です。これには、WindowsまたはAquaで動作するための調整が必要になる場合があります。

emacsclient -e '(unless (find-if (lambda (f)
                                   (let ((p (frame-parameters f)))
                                     (assq '\''window-system p)))
                                 (frame-list))
                  (make-frame-on-display (getenv "DISPLAY")))'
emacsclient filename.ext

これが私がLinuxであなたが求めていることを正確に行うために使用するemacs-client.shスクリプトです:

#!/bin/sh

xprop -name emacs >/dev/null 2>/dev/null
if [ "$?" = "1" ]; then
    emacsclient -c -n -a "" "$@"
else
    emacsclient -n -a "" "$@"
fi
7
dimitri

Gillesの関数をserver-switch-hookに追加すると、思い通りのことができると思います。残念ながら、emacs --daemonをテストするために動作させることができないようです。

(add-hook 'server-switch-hook
          (lambda ()
            (unless (find-if (lambda (f)
                               (let ((p (frame-parameters f)))
                                 (assq 'window-system p)))
                             (frame-list))
              (make-frame-on-display (getenv "DISPLAY")))))
2
Ivan Andrus

私の解決策は、デーモンの起動後にフレームの作成を強制することです。

function em() {
  emacs --bg-daemon --display=:0
  # Forces emacs to notice I'm using X as well.
  emacsclient --create-frame --display=:0 --no-wait
}

その後、-create-frameを使用する必要はありません。

2
Jean-Marc E

OSXでは、この関数を定義するだけです(Jim Hunzikerのアプローチと同様)

emacs () { pgrep -xiq emacs && emacsclient -n $@ || emacsclient -n -c --alternate-editor="" $@; }
0
ws6079

Tty/consoleモードでも動作するさらに別のバージョン:

#!/bin/bash                                                                                                                          

emacsclient -n -e "(if (> (length (frame-list)) 1) 't)" | grep t                                                                     
if [ "$?" = "1" ]; then                                                                                                              
    if [ "$DISPLAY" = "" ]; then                                                                                                     
        emacsclient -c -a "" "$@"                                                                                                    
    else                                                                                                                             
        emacsclient -c -n -a "" "$@"                                                                                                 
    fi                                                                                                                               
else                                                                                                                                 
    if [ "$DISPLAY" = "" ]; then                                                                                                     
        emacsclient -a "" "$@"
    else
        emacsclient -n -a "" "$@"
    fi
fi

(Jim Hunzikersの回答に基づく)

0
Zitrax

Jim Hunzikerの答えは私にはうまくいきません(状況によっては、Xフレームがない場合でもframe-listが2つの項目を返します)。 DISPLAYを1つだけ使用すると仮定すると、次のように機能します。

#!/bin/bash

emacsclient -n -e "(null (cl-remove-if (lambda (frame) (null (display-graphic-p frame))) (frame-list)))" | grep >/dev/null nil
if [ "$?" = "1" ]; then
    emacsclient -c -n -a "" "$@"
else
    emacsclient -n -a "" "$@"
fi
0
brettk