Emacsclient:起動から常時1つのemacsプロセスで終了せず、GUIを非表示にする


9

emacsclientは長いパッケージの読み込み時間を適切に処理できるため、少なくとも1つのemacsプロセスを保持し、ほとんどの場合、1つのemacsプロセスのみをバックグラウンドプロセスとして開いて、GUIを非表示にします。

現在、私は.bashrcで次の関数を定義しています。

emc () 
{ 
    if [[ $# -eq 0 ]]; then
        emacs --eval "(suspend-frame)" &
        return
    fi
    args=($*);
    setsid emacsclient -c -e "(find-file \"${args[*]}\")"
}

また、.bashrcに次の行があります。

emc

そのため、シェルを開くたびに、新しいemacsプロセスが発生します。

問題は、多くのシェルを開いた後、多くの不要なemacsプロセスが追加されることです。ただし、起動から常に1つのemacsプロセス維持したいだけです。


5
私は(emacswiki.org/emacs/EmacsAsDaemonemacs --eval "(suspend-frame)"よりも慣れ親しんでいません。emacsをデーモンとして呼び出さないことを選択する理由はありますか?のようなものを使用して、それが実行されていることを確認できます。emacs --daemonpgrep -U `whoami` emacs || emacs --daemon &
ebpa 2017年

Emacsクライアントを使用するためのMJ Wallのスクリプトを確認してください。
Tianxiang Xiong 2017年

回答:


13

ログイン時にemacsデーモンを起動してこれを行います。このコマンドをどこに置くかは、デスクトップマネージャーによって異なります。私はを使用していますi3。これは、ログイン時に以下を含むスクリプトを実行するように構成されています。

emacs --daemon &

これで、emacsは常にバックグラウンドで実行さemacsclient -c -nれ、ウィンドウマネージャーで便利なキーバインドにバインドされたで新しいクライアントを開きます。ターミナルで作業しているalias emc='emacsclient'場合は-n、使用方法に応じて、-c必要-tに応じて、または引数などの単純なエイリアスのみが必要です。

マニュアルでemacsclientのオプションを確認してください:((emacs)emacsclient Options、Emacsからでアクセス可能C-h r m emacsclient options <enter>)。-aフラグを使用して、emacsデーモンがまだ実行されていない場合は自動的に起動し-cたり-t、既存のフレームまたはターミナルクライアントを(同じセッションで)再利用する代わりに開いたりできます。

「-aコマンド」
'--alternate-editor = COMMAND'
     「emacsclient」がEmacsへの接続に失敗した場合に実行するコマンドを指定します。
     これは、スクリプトで「emacsclient」を実行するときに役立ちます。

     特別な例外として、COMMANDが空の文字列の場合、
     'emacsclient'はEmacsをデーモンモードで起動し( 'emacs --daemon'として)、
     その後、再度接続を試みます。

「-c」
「--create-frame」
     既存のグラフィカルな「クライアントフレーム」を作成する代わりに、既存の
     Emacsフレーム。「Cx C-c」の特別な動作については、以下を参照してください。
     クライアントフレーム。Emacsが新しいグラフィックフレームを作成できない場合(例:
     Xサーバーに接続できない場合)、テキストを作成しようとします
     「-t」オプションを指定したかのように、ターミナルクライアントフレーム
     代わりに。

「-t」
「--tty」
「-nw」
     代わりに、現在のテキストターミナルに新しいクライアントフレームを作成します。
     既存のEmacsフレームを使用する。これは「-c」と同じように動作します
     テキスト端末を作成することを除いて、上記のオプション
     フレーム(*注:非ウィンドウターミナル::)。

4

systemdサービスマネージャー(最近ではほとんどのGNU / Linuxディストリビューションが含まれます)を使用するオペレーティングシステムを使用している場合、最善の解決策はsystemdを使用してEmacsデーモンを起動時に開始することです。これを行うに$HOME/.config/systemd/user/emacs.serviceは、次の内容のファイルを作成します。

[Unit]
Description=Emacs text editor
Documentation=info:emacs man:emacs(1) https://gnu.org/software/emacs/

[Service]
Type=simple
ExecStart=/usr/bin/emacs --fg-daemon
ExecStop=/usr/bin/emacsclient --eval "(kill-emacs)"
Environment=SSH_AUTH_SOCK=%t/keyring/ssh
Restart=on-failure

[Install]
WantedBy=default.target

次に、サービスを開始し、今後のすべてのブートで自動的に開始するように設定する必要があります。

$ systemctl enable --user emacs
$ systemctl start --user emacs

これでemacsclient通常どおり使用できます。あなたが通常でそれを実行した場合-n-cまたは-tオプション、あなたはあなたのシェルでエイリアスを設定することができます。またEDITORVISUAL環境変数を設定して、希望どおりに実行emacsclientすることもできます。たとえば、Bashでは、次のコードを.bashrcファイルに追加できます。

alias emc="emacsclient -c"
export VISUAL="emacsclient -c"
export EDITOR="emacsclient -t"

Emacsデーモンを停止する必要がある場合は、次のようにしてこれを行うことができます。

$ systemctl stop --user emacs

そして、起動時に永久に実行を停止したい場合:

$ systemctl disable --user emacs

1
おそらくEmacsWikiへのこのリンクは認められるべきです:EmacsAsDaemon
HongboZhu

0

私の方法は、.bashrcでエイリアスを定義することで、以前の回答とかなり似ています emacs --daemon

alias ds="emacs --daemon"

これとは別に、キーボードショートカットをにctrl-alt-E設定していemacsclient -cます。emacsの作業を開始したいときは、ターミナルを開いて入力dsし、ショートカットを使用して各emacsclientインスタンスを呼び出します。

これが誰かを助けることを願っています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.