Emacsclient: emacs เดียวประมวลผลตลอดเวลาตั้งแต่เริ่มต้นและไม่ปิด & ซ่อน GUI ที่ดีขึ้น


9

เนื่องจาก emacsclient สามารถจัดการเวลาในการโหลดแพ็กเกจที่ยาวกว่าได้ฉันจึงอยากให้กระบวนการ emacs อย่างน้อยหนึ่งกระบวนการและส่วนใหญ่จะมีเพียงกระบวนการเดียว emacsเปิดเป็นกระบวนการพื้นหลังและซ่อน GUI ได้ดีขึ้น

ตอนนี้ฉันกำหนดฟังก์ชันต่อไปนี้ใน. bashrc:

emc () 
{ 
    if [[ $# -eq 0 ]]; then
        emacs --eval "(suspend-frame)" &
        return
    fi
    args=($*);
    setsid emacsclient -c -e "(find-file \"${args[*]}\")"
}

และยังมีบรรทัดต่อไปนี้ใน. bashrc:

emc

ดังนั้นทุกครั้งที่ฉันเปิดเชลล์ฉันจะต้องมีกระบวนการ emacs ใหม่

ปัญหาคือฉันจะมีกระบวนการ emac ที่ไม่จำเป็นเพิ่มเติมอีกมากมายหลังจากเปิดเชลล์จำนวนมาก แต่ผมเพียงต้องการที่จะรักษาความเป็นหนึ่งเดียว emacs ประมวลผลตลอดเวลาจากการเริ่มต้นที่ดีกว่าซ่อน GUI


5
ฉันไม่คุ้นเคยกับการฝึกฝนemacs --eval "(suspend-frame)"มากกว่าemacs --daemon( emacswiki.org/emacs/EmacsAsDaemon ) มีเหตุผลที่คุณเลือกที่จะไม่เรียกใช้ emacs เป็น daemon หรือไม่? คุณสามารถใช้สิ่งที่ต้องการpgrep -U `whoami` emacs || emacs --daemon &เพื่อให้แน่ใจว่ามันกำลังทำงานอยู่
ebpa

ตรวจสอบสคริปต์ของ MJ Wallเพื่อใช้ไคลเอ็นต์ Emacs
Tianxiang Xiong

คำตอบ:


13

ฉันทำสิ่งนี้โดยเริ่มต้น emacs daemon เมื่อฉันเข้าสู่ระบบ ตำแหน่งที่คุณวางคำสั่งนี้ขึ้นอยู่กับผู้จัดการเดสก์ท็อปของคุณ ฉันใช้i3ซึ่งมีการกำหนดค่าให้เรียกใช้สคริปต์ในการเข้าสู่ระบบที่มีต่อไปนี้:

emacs --daemon &

ด้วยเหตุนี้ emacs จะทำงานในพื้นหลังเสมอและฉันเปิดไคลเอนต์ใหม่ด้วยemacsclient -c -nผูกไว้กับการผูกคีย์ที่สะดวกในตัวจัดการหน้าต่าง หากคุณกำลังทำงานใน terminal คุณต้องการเพียงนามแฝงง่ายๆเช่นalias emc='emacsclient'อาจจะมี-n, -cหรือ-tข้อโต้แย้งขึ้นอยู่กับว่าคุณจะใช้มัน

ตรวจสอบตัวเลือกสำหรับ emacsclient ในคู่มือ: ( (emacs) emacsclient Optionsซึ่งสามารถเข้าถึงได้จาก Emacs by C-h r m emacsclient options <enter>) คุณสามารถใช้การ-aตั้งค่าสถานะเพื่อเริ่มต้น emacs daemon โดยอัตโนมัติหากยังไม่ได้ทำงานอยู่และ-cหรือ-tเพื่อเปิดเฟรมใหม่หรือไคลเอ็นต์เทอร์มินัลแทนที่จะนำมาใช้ใหม่ที่มีอยู่ (ในเซสชันเดียวกัน):

'-a COMMAND'
'--alternate บรรณาธิการ = COMMAND'
     ระบุคำสั่งให้เรียกใช้หาก 'emacsclient' ล้มเหลวในการติดต่อ Emacs
     สิ่งนี้มีประโยชน์เมื่อเรียกใช้ 'emacsclient' ในสคริปต์

     เป็นข้อยกเว้นพิเศษถ้า COMMAND เป็นสตริงว่างแล้ว
     'emacsclient' เริ่มต้น Emacs ในโหมด daemon (เป็น 'emacs --daemon') และ
     จากนั้นลองเชื่อมต่ออีกครั้ง

'-ค'
'--create กรอบ'
     สร้างกราฟิกเฟรมลูกค้าใหม่แทนที่จะใช้ที่มีอยู่
     เฟรม emacs ดูพฤติกรรมพิเศษของ 'Cx C-c' ใน
     กรอบลูกค้า หาก Emacs ไม่สามารถสร้างเฟรมกราฟิกใหม่ (เช่น
     หากไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ X ได้) จะพยายามสร้างข้อความ
     กรอบไคลเอ็นต์เทอร์มินัลราวกับว่าคุณให้ตัวเลือก '-t'
     แทน.

't-'
'--tty'
'-nw'
     สร้างเฟรมไคลเอ็นต์ใหม่บนเทอร์มินัลข้อความปัจจุบันแทน
     ใช้เฟรม Emacs ที่มีอยู่ พฤติกรรมนี้เหมือนกับ '-c'
     ตัวเลือกที่อธิบายข้างต้นยกเว้นว่าจะสร้างเทอร์มินัลข้อความ
     frame (* note เทอร์มินัลที่ไม่ใช่หน้าต่าง: :)

4

หากคุณใช้ระบบปฏิบัติการที่ใช้systemd service manager (ซึ่งในปัจจุบันมีการแจกแจง GNU / Linux เกือบทั้งหมด) ดังนั้นทางออกที่ดีที่สุดอาจจะใช้ systemd เพื่อเริ่มต้น Emacs daemon ของคุณในการบู๊ต คุณสามารถทำได้โดยการสร้างไฟล์ที่$HOME/.config/systemd/user/emacs.serviceมีเนื้อหาดังต่อไปนี้:

[Unit]
Description=Emacs text editor
Documentation=info:emacs man:emacs(1) https://gnu.org/software/emacs/

[Service]
Type=simple
ExecStart=/usr/bin/emacs --fg-daemon
ExecStop=/usr/bin/emacsclient --eval "(kill-emacs)"
Environment=SSH_AUTH_SOCK=%t/keyring/ssh
Restart=on-failure

[Install]
WantedBy=default.target

จากนั้นคุณควรเริ่มบริการและตั้งให้เริ่มโดยอัตโนมัติสำหรับรองเท้าบู๊ตในอนาคตทั้งหมด:

$ systemctl enable --user emacs
$ systemctl start --user emacs

ตอนนี้คุณสามารถใช้งานได้emacsclientตามปกติ ถ้าคุณทำงานได้ตามปกติด้วย-n, -cหรือ-tตัวเลือกที่คุณสามารถตั้งค่านามแฝงในเปลือกของคุณ คุณอาจต้องการตั้งค่าEDITORและ / หรือVISUALตัวแปรสภาพแวดล้อมเพื่อให้ทำงานemacsclientตามที่คุณต้องการ ตัวอย่างเช่นใน Bash คุณอาจเพิ่มสิ่งต่อไปนี้ใน.bashrcไฟล์ของคุณ:

alias emc="emacsclient -c"
export VISUAL="emacsclient -c"
export EDITOR="emacsclient -t"

หากคุณต้องการหยุด Emacs daemon คุณสามารถทำได้ดังนี้:

$ systemctl stop --user emacs

และถ้าคุณต้องการที่จะหยุดมันอย่างถาวรจากการทำงานในการบูต:

$ systemctl disable --user emacs

1
บางทีการเชื่อมโยงไปยัง EmacsWiki นี้ควรได้รับการยอมรับ: EmacsAsDaemon
HongboZhu

0

วิธีที่ฉันทำมันค่อนข้างคล้ายกับคำตอบก่อนหน้านี้โดยกำหนด alias ไว้ใน. bashrc ของฉัน emacs --daemon

alias ds="emacs --daemon"

นอกเหนือจากนี้ฉันมีทางลัดที่สำคัญคณะกรรมการชุดctrl-alt-E emacsclient -cเมื่อฉันต้องการเริ่มทำงานกับ emacs ฉันจะเปิดเทอร์มินัลแล้วพิมพ์dsและเรียกอินสแตนซ์ emacsclient แต่ละอันด้วยทางลัดของฉัน

หวังว่านี่จะช่วยใครซักคน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.