Starten Sie emacsclient mit dem Fokus über die Befehlszeile

11

Wenn ich emacsclient wie folgt über die Befehlszeile starte:

emacsclient -a '' -c "$@"

Es beginnt immer im Hintergrund (Terminalfenster über dem Emacsclient-Fenster), daher muss ich mit der Maus auf das Fenster klicken, um zu Emacsclient zu wechseln.

Es ist wirklich frustrierend. Kann ich emacsclient dazu bringen, den Frame zu fokussieren, der beim Aufrufen über die Befehlszeile angezeigt wird?

Geben Sie hier die Bildbeschreibung ein

Glück1928
quelle
Dies ist wahrscheinlich eher eine Funktion des Fenstermanagers / der Desktop-Umgebung als von emacs / emacsclient. In meinem Fall wird der neue Frame oben im Terminalfenster angezeigt, z. B. (Gnome 3.20 auf Fedora 24).
NickD

Antworten:

14

Möglicherweise können Sie server-switch-hookden Rahmen verwenden und anheben. Etwas wie:

(add-hook 'server-switch-hook #'raise-frame)

Wenn Sie sich dann nicht auf den neuen Frame konzentrieren, können Sie stattdessen Folgendes versuchen:

(add-hook 'server-switch-hook (lambda () (select-frame-set-input-focus (selected-frame))))

Wenn Sie einen Shell-Befehl zum Aufrufen eines Emacs-Frames benötigen (ohne eine oder mehrere zu bearbeitende Dateien anzugeben), können Sie dies auch über die Befehlszeile tun:

emacsclient -e "(raise-frame)"
Glucas
quelle
Es funktioniert nicht. Wenn Sie jedoch einen Dateinamen in die Befehlszeile einfügen, wird Emacs im Vordergrund angezeigt, aber ohne zu öffnende Datei bleibt es im Hintergrund.
Glück1928
Wenn Sie keine Dateinamenargumente übergeben müssen, können Sie auch eine Funktion über die Befehlszeile aufrufen, z. B.:emacsclient -e '(raise-frame)'
Glucas
1
Ihr Rat (Select-Frame-Set-Input-Focus (Select-Frame)) hat bei mir funktioniert.
Tim Stewart
2

Dieses Problem wurde auch als Problem gemeldet ( siehe Spacemacs-Problem Nr. 7078 ). Die Lösung, ein dort veröffentlichtes Wrapper-Skript zu verwenden, hat bei mir funktioniert. Der Vollständigkeit halber werde ich den Inhalt des Skripts hier hinzufügen:

#!/usr/bin/bash

if [[ "$#" -lt 1 ]] ; then
    emacsclient -c -e \
                "(select-frame-set-input-focus (selected-frame))" \
                "(delete-other-windows)" \
                "(spacemacs/home)" else
    emacsclient -c -e \
                "(select-frame-set-input-focus (selected-frame))" \
                "(delete-other-windows)" \
                "(find-file \"$1\")" fi

Ich habe nicht genügend Reputationspunkte, um hier einen Kommentar abzugeben. Aber es wäre großartig, wenn Informationen darüber, wo die platziert werden server-switch-hooksollen, von @glucas zur Antwort hinzugefügt werden könnten. Am Ende habe ich keine seiner Lösungen dazu gebracht, ganz einfach zu funktionieren ...

Dalanicolai
quelle