を使用してemacsサーバーを起動します
emacs --daemon
次に、を使用してファイルを開きます
emacsclient filename.ext
ただし、最初のファイルはを使用して開く必要があります
emacsclient -c filename.ext
emacsclientの-c
コマンドラインフラグを使用せずに、後で後続のファイルで使用できる新しいフレームを作成するため。
これを自動化したい。 「emacsフレームがない場合、emacsclientはフレームを作成する必要があります。そうでない場合は、現在のフレームを使用する必要があります」。どうすればそれができますか?
これは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
フレームがまだない場合は、最初にフレームを作成してから、既存のフレームでファイルを開くことができます。これは、ウィンドウディスプレイで現在開いているフレームがない場合に、最初のディスプレイでフレームを作成するスニペットです。 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
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")))))
私の解決策は、デーモンの起動後にフレームの作成を強制することです。
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を使用する必要はありません。
OSXでは、この関数を定義するだけです(Jim Hunzikerのアプローチと同様)
emacs () { pgrep -xiq emacs && emacsclient -n $@ || emacsclient -n -c --alternate-editor="" $@; }
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の回答に基づく)
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