ทำให้ emacsclient สร้างเฟรมเฉพาะในกรณีที่ไม่มีอยู่แล้ว


11

ฉันจะemacsclient -a '' -nสร้างเฟรมใหม่ได้เฉพาะในกรณีที่ยังไม่มีเฟรมอยู่แล้ว?

ปัญหาเกี่ยวกับการ-cตั้งค่าสถานะคือมันสร้างเฟรมใหม่ทุกครั้ง ปัญหาที่ไม่มีคือถ้าไม่มีการเปิดเฟรมมันจะเปิดในบรรทัดคำสั่ง

หากฉันสามารถตรวจสอบว่ามีเฟรม Emacs ที่เปิดอยู่จากเปลือกหอยฉันสามารถโทรออกด้วยหรือไม่-cขึ้นอยู่กับว่าจะได้รับพฤติกรรมที่ฉันต้องการ ฉันเหนื่อย:

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

ฉันได้รับผลลัพธ์เดียวกันเสมอ

ฉันสามารถใช้ไฟล์ชั่วคราวหรือ pgrep แต่วิธีการเหล่านั้นมีข้อผิดพลาดมาก

นี้จะคล้ายกับคำถามนี้แต่มันไม่ได้เป็นที่ซ้ำกันตั้งแต่ OP emacsclientมีความพึงพอใจกับต้องมีกรอบเปิดก่อนที่จะเรียก


1
คำถามเดียวกันsuperuser.com/questions/358037/...ด้วยelisp, bashและshคำตอบ
Konstantin Morenko

คำตอบ:


3

ฉันสิ้นสุดการสร้างสคริปต์นี้ตามนี้

#!/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 "$@"

-nwหากมีการแสดงผลจะเปิดไม่มี หาก$DISPLAYมีการตั้งค่ามันจะค้นหาเฟรมในจอแสดงผลนั้นเพื่อดูว่าจำเป็นต้องสร้างเฟรมใหม่หรือไม่

แก้ไข: ฉันได้แก้ไขเพื่อให้คุณสามารถระบุได้ด้วยตนเอง-nwหากคุณต้องการเปิดในเทอร์มินัลแม้ว่าจะมีจอแสดงผล


1
nitpick ไมเนอร์: ควรจะยกมา$@
dshepherd

0

คุณสามารถใช้ได้:

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

เพื่อตรวจสอบว่าเซิร์ฟเวอร์ Emacs "server_name"ทำงานอยู่หรือไม่ หากคำสั่งส่งคืนโค้ดออก 0 คำสั่งจะทำงาน ถ้าเป็นเช่นนั้นเพียงใช้emacsclientคำสั่ง:

emacsclient -s server_name -n file_name.txt

ถ้ามันไม่ทำงานคุณสามารถเปิดเซิร์ฟเวอร์ Emacs ใหม่ด้วยตัวอย่าง:

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

แต่อย่างนั้นเมื่อคุณปิดเชลล์คุณจะฆ่าเซิร์ฟเวอร์ใช่มั้ย การemacsclient -a ''เริ่มต้นemacs --daemonหากจำเป็นซึ่งยังคงอยู่แม้ว่าคุณจะปิดเชลล์
spelufo

@spelufo เซิร์ฟเวอร์ไม่ได้ถูกฆ่าโดยการฆ่าเชลล์ สังเกต&ที่ท้ายคำสั่ง; มันหมายถึงการเรียกใช้เซิร์ฟเวอร์เป็นกระบวนการพื้นหลัง ..
HåkonHægland

ซึ่งทำให้มันเป็นพื้นหลังของเปลือกปัจจุบัน มันจะไม่ถูกฆ่าเมื่อคุณได้รับกระสุนกลับคืน แต่มันจะถูกฆ่าเมื่อคุณปิดเปลือกนั้นโดยสมบูรณ์ ( C-d)
spelufo

ภูตยังคงทำงานแม้ว่าคุณจะปิดอาคารทั้งหมดของคุณ มันจะทำงานต่อไปหากserver-startเริ่มเซิร์ฟเวอร์เป็นกระบวนการ daemon คุณได้อะไรถ้าคุณเริ่มต้น emacs ว่าวิธีการแล้วปิด emacs และอาคารทั้งหมดแล้วเปิดอาคารผู้โดยสารแห่งใหม่และการทำงานpgrep emacs?
spelufo

@spelufo จริงๆแล้วมันยังทำงานC-dอยู่ ฉันลองตอนนี้โดยใช้gnome-terminalUbuntu 14.10 .. ฉันคิดว่าคุณกำลังอ้างถึงอินสแตนซ์ที่กำลังทำงานอยู่หลังจากปิดเฟรม Emacs ทั้งหมดหรือไม่ จากนั้นจะต้องใช้กระบวนการภูตใช่ ..
HåkonHægland
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.