Làm cách nào tôi có thể thực hiện chạy emacsclient từ trình khởi chạy unity sử dụng lại cửa sổ emacs hiện có


12

Nếu bạn tạo một trình khởi chạy emacsclient bằng cách sao chép tệp .desktop (ví dụ: tệp Emacs), thì nó không hoạt động theo cách khởi chạy Unity tiêu chuẩn. Nó luôn luôn khởi chạy một cửa sổ mới; nó không nhận ra rằng các cửa sổ Emacsclient hiện có tồn tại để nhảy tới chúng. Làm thế nào tôi có thể làm cho nó cư xử?

Làm nền, đây là chế độ sử dụng rất hữu ích cho Emacs, nơi bạn chạy nó dưới dạng daemon: emacs --daemonvà sau đó bạn triệu tập một cửa sổ emacs với emacsclient. Một cách tốt để làm điều này cho người dùng emacs theo thói quen là đưa emacs --daemonvào Ứng dụng khởi động của bạn.

Câu trả lời:


16

Giải pháp là tạo một emacsclient.desktoptệp bao gồm một lệnh cho lớp đó của cửa sổ bằng cách sử dụng cài đặt StartupWMClass. Không có nó, Unity không thể nói rằng cửa sổ đó đến từ Emacsclient. Điều này sẽ tạo một cái dựa trên nội dung của Emacs (/usr/share/appluggest/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

Đặt emacsclient trong trình khởi chạy (ví dụ: nhấn Super, nhập "emacsclient", kéo nó vào) và đăng xuất / đăng nhập.


Trong .bashrc của tôi, tôi xác định TMPDIR = $ {HOME} / tmp để các tệp tạm thời nằm dưới $ HOME được mã hóa của tôi. emacs, được gọi từ launcher, không thấy định nghĩa này, nhưng emacsclient, được gọi từ shell. emacs (sau khi máy chủ khởi động) mở một ổ cắm trong / tmp, emacsclient cố gắng giao tiếp với các emacs qua một ổ cắm trong $ {HOME} / tmp và hoạt động rất kém. Tôi có thể sử dụng emacsclient.desktop để chuyển đúng giá trị cho TMPDIR không?
ví von

Tôi chuyển câu hỏi của mình sang một chủ đề của riêng nó, và đã được trả lời. Xem Askubfox.com/questions/64005/launcher-doesnt-respect-tmpdir/ mẹo
waltinator

Unity hoàn toàn bỏ qua tôi emacsclient.desktopvì một số lý do. Cuối cùng tôi đã khắc phục điều này bằng cách tạo launcher trong alacarte(GUI "Menu chính").
Brian Z

2

Giải pháp của james.ferguson hoạt động tốt. Những gì tôi muốn là liên kết emacsclient với một số loại tệp như là "ứng dụng ưa thích". Đối với điều này, tôi tìm thấy kịch bản của james với một dòng "Exec" mới

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

hoạt động tốt hơn đối với tôi: nó chạy một emacs mới nếu không có cái nào đang chạy, không mở một cửa sổ mới và không làm cho emacs phàn nàn về việc khách hàng vẫn chờ đợi những thứ xảy ra.

Bây giờ tôi có thể nhấp vào các tệp và chúng được mở trong một emacs đang chạy, nếu có, nếu không thì bắt đầu.


1

Một cách khác là sử dụng tập lệnh :

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

Vì vậy, bạn luôn luôn gọi cùng một lệnh.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.