เริ่ม emacs daemons แยกกันสองรายการสำหรับคอนโซลและ GUI


14

โดยปกติผมเริ่ม emacs กับ GUI (server-start)และเริ่มต้นเซิร์ฟเวอร์ทันทีกับ ตอนนี้ฉันสามารถเปิดเอกสารในเซสชัน emacs ที่มีอยู่จากเทอร์มินัลผ่านemacsclient -n <file>หรือจากเบราว์เซอร์ไฟล์ได้อย่างง่ายดาย

เมื่อเวลาผ่านไป แต่ผมต้องการที่จะทำงาน emacs emacsclient -tภายในอาคารผู้โดยสารของฉันโดยใช้ สิ่งนี้เกิดขึ้นบ่อยที่สุดเมื่อเขียนคอมไพล์บันทึกการกระทำหรือทำงานอื่น ๆ ที่มีขนาดเล็กมาก ในกรณีเหล่านั้นความจริงที่ว่าไฟล์ init ของฉันถูกโหลดในอินสแตนซ์ GUI ของ emacs หมายความว่าฉันไม่ได้รับการปรับแต่งใด ๆ ที่เฉพาะเจาะจงกับ TTY emacs

ฉันรู้ว่าฉันสามารถวิ่งได้

emacs -nw -q -l "some-custom-init-file.el"

แต่นั่นจะทำการบรรจุซ้ำทุกครั้ง ฉันจะได้สิ่งที่ดีที่สุดของทั้งสองโลกได้หรือไม่? มีวิธีตั้งค่า "TTY daemon" หรือไม่เพื่อให้ฉันสามารถใช้การปรับแต่งแยกต่างหากสำหรับการทำงานภายในเครื่องเทอร์มินัลกับการเยี่ยมชมไฟล์ในหน้าต่าง emacs ที่มีอยู่


1
คุณสามารถชี้ไปที่ตัวอย่างของการปรับแต่งที่แตกต่างระหว่างโหมด TTY และ GUI ได้หรือไม่?
stsquad

1
@stsquad สิ่งที่ง่ายอย่างหนึ่งคือฉันใช้ขอบด้านซ้ายในโหมด GUI แต่เนื่องจากไม่มีขอบในโหมด TTY จึงไม่มีช่องว่างระหว่างหมายเลขบรรทัดและข้อความ สามารถแก้ไขได้(setq linum-format "%d ")ในไฟล์การปรับแต่ง TTY ธีมสีของฉันก็ดูแปลก ๆ ในโหมด TTY ดังนั้นฉันจะเลือกธีมอื่นสำหรับ TTY อย่างแน่นอน จริง ๆ แล้วฉันไม่ได้มีความแตกต่างมากมายในขณะนี้ แต่ตอนนี้ฉันรู้ว่าฉันสามารถมีเซิร์ฟเวอร์ที่แตกต่างกันรายการอาจเติบโต
nispio

@nispio: ฉันขอแนะนำให้คุณM-x report-emacs-bugและขอคุณสมบัติใหม่เช่นความสามารถในการมีชุดรูปแบบใบหน้าที่แตกต่างกันใน TTY และในเฟรม GUI (ที่จริงแล้วชุดรูปแบบสามารถระบุสีที่แตกต่างอย่างสิ้นเชิงสำหรับเฟรมประเภทต่างๆเหล่านั้นดังนั้นคุณสามารถปรับธีมของคุณได้) . การใช้ daemons หลายตัวสำหรับเคสที่แยกต่างหากนั้นเป็นเพียงวิธีการแก้ปัญหาสำหรับการขาดฟังก์ชั่นที่เกี่ยวข้องใน Emacs
Stefan

คำตอบ:


14

ใช้emacs --daemon=your-server-name -l "custom-init-file"เพื่อเริ่มเซิร์ฟเวอร์ใหม่และemacsclient -nw -s your-server-nameเชื่อมต่อกับเซิร์ฟเวอร์จากเทอร์มินัลเอง ส่วนในการใช้ Emacs เป็นเซิร์ฟเวอร์ในคู่มือมีตัวเลือกการเริ่มต้นมากขึ้น


มันใช้งานได้! มีวิธีที่ดีในการฆ่าเซิร์ฟเวอร์ที่เริ่มต้นด้วยวิธีนี้นอกเหนือจากการค้นหาและลบไฟล์เซิร์ฟเวอร์หรือไม่
nispio

(ฉันต้องเพิ่ม-qสวิตช์เพื่อไม่ให้มีการinit.elเรียกใช้ค่าเริ่มต้นก่อนไฟล์ init ที่กำหนดเอง)
nispio

2
ไม่emacsclient -s your-server-name -e "(kill-emacs)"ทำในสิ่งที่คุณต้องการ? ดังกล่าวข้างต้นเป็นเพียงแค่เรียก emacsclient และ (kill-emacs)evals คุณสามารถแทนที่(kill-emacs)ด้วย(save-buffers-kill-emacs)เช่นกัน
Vamsi

ฉันเคยมี init.el ทั่วไปสำหรับทั้ง terminal และ gui emacs และโหลดไฟล์ที่กำหนดเองแยกต่างหากสำหรับการปรับแต่งส่วนบุคคล ดังนั้นฉันจึงพลาด-q
Vamsi

1
โซลูชันนี้แก้ไขปัญหาที่ฉันมีเมื่อใช้ 'emacsclient -t' กับ mutt และในพื้นที่ทำงานแยกต่างหาก 'emacsclient -c' กล่าวง่ายๆ: daemon หยุดทำงานเมื่อ 'emacsclient -c' ถูกยิงก่อน 'emacsclient -t' ขอบคุณ Vamsi
Boccaperta-IT

9

นอกจากนี้ในการตอบ @ Vamsi make-frame-commandของคุณจะได้รับประโยชน์หลายประการเช่นเดียวกันในขณะที่ใช้เพียงเซิร์ฟเวอร์เดียวโดยแนบคำแนะนำแก่

ตัวอย่างเช่นในขณะที่ทำงานใน terminal ฉันต้องการให้สีพื้นหลังเป็นblack(ซึ่งแมปไป#202020) แต่ฉันต้องการใช้#202020ในโหมดกราฟิก ฉันใช้สิ่งนี้กับ:

(defadvice make-frame-command (after make-frame-change-background-color last activate)
  "Adjusts the background color for different frame types. 
Graphical (X) frames should have the theme color, while terminal frames should match the terminal color (which matches the theme color...but terminal frames can't directly render this color)"
    (if (display-graphic-p)
        (set-background-color "#202020")
      (set-background-color "black")))

คุณจะได้รับมากระยะจากนี้โดยใช้make-variable-frame-local( set-background-colorในข้างต้นอยู่แล้วกรอบท้องถิ่น)

ฉันไม่รู้ว่านี่เป็นรูปแบบที่ดีที่สุดหรือไม่ แต่ถ้าคุณมีความแตกต่างเล็กน้อยระหว่างโหมด TTY และ X-mode Emacs มันสามารถทำให้การจัดการการกำหนดค่าง่ายขึ้น

รหัสข้างต้นถูกดึงมาจาก. emacs.d ของฉัน


ฉันสงสัยว่าจะมีวิธีใดในการ "ตรวจจับ" โหมดที่ฉันใช้เป็นแบบต่อเฟรม
nispio

1
สิ่งนี้จะทำ (display-graphic-p)ให้tถ้าเฟรมปัจจุบันเป็นกราฟิกnilมิฉะนั้น เนื่องจากไม่สามารถย้ายเฟรมระหว่างกราฟิกและไม่ใช่ (afaik) การแนบคำแนะนำในการสร้างเฟรมจะช่วยให้มั่นใจได้ว่าสถานะที่ต้องการจะไปถึงเฟรมที่กำหนด
J David Smith

นี่เป็นคำตอบที่สะดวกที่สุดอย่างแน่นอน
Malabarba

4

คุณไม่ต้องการคำแนะนำในการเปลี่ยนการตั้งค่าของเฟรมต่างๆที่ทำงานใน emacs daemon เดียวกัน เพียงใช้ตะขอafter-make-frame-functionsอย่างนั้น

(defvar my/ttheme 'tango-dark)
(defvar my/gtheme 'tango)
(defun my/frame-configuration (frame)
  "configure the current frame depending on the frame type"
  (with-selected-frame frame
    (if (display-graphic-p)
        (progn
          (message "after-make-frame-functions hook: window system")
          (set-frame-size frame 115 60)
          ;; other settings for a graphical frame
          (load-theme my/gtheme t))
      (message "after-make-frame-functions hook: text console")
      (load-theme my/ttheme t)
      (set-frame-parameter frame 'menu-bar-lines 0))))

(add-hook 'after-make-frame-functions 'my/frame-configuration)

;; normal start without daemon
(if (not (daemonp))
  (my/frame-configuration (selected-frame)))

การกำหนดด้วยวิธีนี้จะมีโบนัสเพิ่มโดยตั้งค่าการกำหนดเฟรมที่ต้องการแม้ว่าคุณจะไม่ได้เริ่มในโหมด daemon

น่าเสียดายที่load-themeไม่ใช่เฟรมในเครื่องและเฟรมอื่น ๆ ก็มีสีเช่นกันถ้าคุณใช้ธีมที่แตกต่างกันสำหรับข้อความและเฟรมกราฟิก

ข้อมูลโบนัส:กำหนดค่าเทอร์มินัลของคุณด้วยอย่างน้อย 256 สีเพื่อให้ได้ความรู้สึกที่แท้จริงของธีมที่คุณเลือก ใช้การตั้งค่าเช่นนี้ในไฟล์เริ่มต้นเชลล์ของคุณ:

TERM=xterm-256color
export TERM

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