Jak sprawić, aby uruchomienie emacsclient z programu uruchamiającego jedność wykorzystało istniejące okno emacsa

12

Jeśli utworzysz program uruchamiający emacsclient, kopiując plik .desktop (np. Emacs), nie będzie on działał w standardowy sposób uruchamiający Unity. Zawsze otwiera nowe okno; nie rozpoznaje istniejących okien Emacsclient, aby do nich przejść. Jak mogę sprawić, żeby się zachowywał?

Jako tło jest to bardzo przydatny tryb użycia dla Emacsa, w którym uruchamiasz go jako demon: emacs --daemona następnie przywołujesz okno emacsa emacsclient. Dobrym sposobem na zrobienie tego dla zwykłych użytkowników emacsa jest emacs --daemonzainstalowanie aplikacji startowych.

james.ferguson
źródło

Odpowiedzi:

16

Rozwiązaniem jest utworzenie emacsclient.desktoppliku zawierającego dyrektywę do klasy okna przy użyciu ustawień StartupWMClass. Bez tego Unity nie może powiedzieć, że to okno pochodziło od Emacsclienta. Spowoduje to utworzenie jednego na podstawie zawartości Emacsa (/usr/share/applications/emacs23.desktop):

mkdir -p ~/.local/share/applications
cat > !$/emacsclient.desktop <<EOF
[Desktop Entry]
Version=1.0
Name=Emacsclient
GenericName=Text Editor
Comment=View and edit files
MimeType=text/english;text/plain;text/x-makefile;text/x-c++hdr;text/x-c++src;text/x-chdr;text/x-csrc;text/x-java;text/x-moc;text/x-pascal;text/x-tcl;text/x-tex;application/x-shellscript;text/x-c;text/x-c++;
Exec=/usr/bin/emacsclient -c %F
Icon=/usr/share/icons/hicolor/scalable/apps/emacs23.svg
Type=Application
Terminal=false
Categories=Utility;Development;TextEditor;
StartupWMClass=Emacs
EOF

Umieść emacsclient w programie uruchamiającym (np. Dotknij Super, wpisz „emacsclient”, przeciągnij) i wyloguj się / zaloguj.

james.ferguson
źródło
W moim .bashrc definiuję TMPDIR = $ {HOME} / tmp, więc pliki tymczasowe znajdują się pod moim zaszyfrowanym $ HOME. emacs, wywołany z programu uruchamiającego, nie widzi tej definicji, ale emacsclient, wywołany z powłoki. emacs (po uruchomieniu serwera) otwiera gniazdo w / tmp, emacsclient próbuje komunikować się z emacsem przez gniazdo w $ {HOME} / tmp i robi to bardzo słabo. Czy mogę użyć emacsclient.desktop, aby przekazać prawidłową wartość dla TMPDIR?
waltinator
Przeniosłem moje pytanie na własny wątek i otrzymałem odpowiedź. Zobacz askubuntu.com/questions/64005/launcher-doesnt-respect-tmpdir/…
waltinator,
Unity emacsclient.desktopz jakiegoś powodu całkowicie mnie zignorowało . W końcu udało mi się to obejść, tworząc alacartezamiast tego program uruchamiający w (GUI „Menu główne”).
Brian Z
2

Rozwiązanie james.ferguson działa dobrze. Chciałem połączyć emacsclient z niektórymi typami plików jako „preferowaną aplikacją”. W tym celu znalazłem skrypt Jamesa z nową linią „Exec”

Exec=/usr/bin/emacsclient --alternate-editor emacs24 --no-wait %F

działa dla mnie lepiej: uruchamia nowy emacs, jeśli żaden nie jest uruchomiony, nie otwiera nowego okna i nie powoduje, że emacs narzeka na klientów wciąż czekających na coś, co się wydarzy.

Teraz mogę klikać pliki, które są otwierane w uruchomionym emacsie, jeśli taki istnieje, inaczej emacs się uruchomi.

użytkownik127094
źródło
1

Innym sposobem jest użycie skryptu :

if [ "$(pidof emacs)" ] ; then
    emacsclient "$@" &
else
    emacs -mm "$@" &
fi

Więc zawsze wywołujesz to samo polecenie.

yPhil
źródło