Tạo emacsclient chỉ tạo khung nếu chưa có khung


11

Làm cách nào tôi có thể emacsclient -a '' -ntạo một khung mới chỉ khi chưa có khung?

Vấn đề với -ccờ là nó tạo ra một khung mới mỗi lần. Vấn đề không có nó là nếu không có khung mở thì nó sẽ mở trong dòng lệnh.

Nếu tôi có thể kiểm tra xem có khung Emacs mở từ vỏ hay không, tôi có thể gọi có hoặc không -ctùy thuộc vào đó để có được hành vi tôi muốn. Tôi đã thử:

$ emacsclient -a '' --eval '(frames-on-display-list)'
(#<frame F1 0xba2740>)

Tôi luôn nhận được kết quả tương tự.

Tôi có thể sử dụng các tệp tạm thời hoặc pgrep, nhưng các phương pháp đó rất dễ bị lỗi.

Điều này tương tự với câu hỏi này , nhưng nó không phải là một bản sao, vì OP đã hài lòng với việc phải mở khung trước khi gọi emacsclient.


1
Cùng câu hỏi superuser.com/questions/358037/... với elisp, bashshcâu trả lời.
Konstantin Morenko

Câu trả lời:


3

Tôi đã kết thúc việc tạo ra kịch bản này dựa trên điều này

#!/bin/bash -e

if [[ "$DISPLAY" ]]; then
        frame=`emacsclient -a '' -e "(member \"$DISPLAY\" (mapcar 'terminal-name (frames-on-display-list)))" 2>/dev/null`
        [[ "$frame" == "nil" ]] && opts='-c' # if there is no frame open create one
        [[ "${@/#-nw/}" == "$@" ]] && opts="$opts -n" # don't wait unless we've asked to run in a terminal
else
        opts='-nw'
fi

exec emacsclient -a '' $opts "$@"

Nếu không có màn hình, nó sẽ mở ra -nw. Nếu $DISPLAYđược đặt, nó sẽ tìm các khung trong màn hình đó để xem nó có cần tạo khung mới không.

Chỉnh sửa: Tôi đã sửa đổi nó để bạn có thể chỉ định thủ công -nwnếu bạn muốn mở trong một thiết bị đầu cuối ngay cả khi có màn hình.


1
Tiểu nitlog: $@ nên được trích dẫn .
dshepherd

0

Bạn có thể dùng:

emacsclient -s server_name -e '(+ 1 0)' >/dev/null 2>&1

để kiểm tra xem máy chủ Emacs "server_name"đã chạy chưa. Nếu lệnh trả về mã thoát 0, nó đang chạy. Nếu vậy, chỉ cần sử dụng emacsclientlệnh:

emacsclient -s server_name -n file_name.txt

Nếu nó không chạy, bạn có thể mở một máy chủ Emacs mới với ví dụ:

emacs --eval '(setq server-name "server_name")' --eval '(server-start)' file_name.txt &

Nhưng theo cách đó một khi bạn đóng vỏ, bạn sẽ giết máy chủ, phải không? Việc emacsclient -a ''bắt đầu emacs --daemonnếu cần thiết, vẫn tồn tại ngay cả khi bạn đóng vỏ.
gameufo

@spelufo Máy chủ không bị giết bằng cách giết vỏ. Lưu ý &ở cuối lệnh; nó có nghĩa là chạy máy chủ như một quá trình nền ..
Håkon Hægland

Mà rèn nó cho nền của vỏ hiện tại. Nó không bị giết khi bạn lấy lại vỏ của mình, nhưng nó bị giết khi bạn đóng hoàn toàn vỏ đó ( C-d).
gameufo

Trình nền tiếp tục chạy ngay cả khi bạn đóng tất cả các thiết bị đầu cuối của bạn. Nó sẽ chỉ tiếp tục chạy nếu server-startkhởi động máy chủ như tiến trình daemon. Bạn nhận được gì nếu bạn bắt đầu emacs theo cách đó và sau đó đóng tất cả các emacs và terminal, sau đó mở một terminal mới và chạy pgrep emacs?
gameufo

@spelufo Thật ra nó vẫn chạy sau C-d. Tôi đã thử điều này ngay bây giờ bằng cách sử dụng gnome-terminaltrên Ubuntu 14.10 .. Tôi nghĩ rằng bạn đang đề cập đến một phiên bản đang chạy sau khi đóng tất cả các khung Emacs? Sau đó, điều đó sẽ đòi hỏi một quy trình daemon có ..
Håkon Hægland
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.