Emacsdaemon และ Emacsclient บน Mac


25

ระบบปฏิบัติการ: OS X 10.9.5, Mavericks

GNU Emacs 24.3.1 (x86_64-apple-darwin13.1.0, Carbon เวอร์ชั่น 1.6.0 AppKit 1265.19) ปี 2014-04-03 บน Rainers-MacBook-Pro-3.local

ฉันติดตั้ง emacs ผ่านhomebrewจากrailwaycatและใช้งานได้ดี - ไม่มีการร้องเรียน ฉันไม่ได้ใช้ emacs ใน termoinal และฉันมักจะเริ่มใช้งานผ่านแอปพลิเคชัน

อย่างที่ฉันพูด - ฉันมีความสุขจนถึงตอนนี้

ฉันมีสิ่งหนึ่งที่ฉันไม่สามารถจัดการให้ถูกต้อง (ซึ่งทำงานได้ดีกับ linux มาก่อน) ซึ่งก็คือ:

  1. รับ emacs daemon เริ่มต้นเมื่อเข้าสู่ระบบ
  2. ใช้ emacsclient เพื่อเปิด
  3. ปิด emacsdaemon และบันทึกไฟล์ al เมื่อออกจากระบบ

สูตรการทำงานใดบ้างที่สามารถช่วยฉันตั้งค่านี้

เพิ่มข้อมูลแล้ว

ในการเริ่ม emacs daemon เมื่อเข้าสู่ระบบ

ฉันสร้างแอปพลิเคชัน Automator เพื่อเรียกใช้คำสั่ง bash

/usr/local/bin/emacs --daemon

และเพิ่มเข้าไปในรายการเข้าสู่ระบบที่ใช้งานได้ดี

การใช้ daemon จากเทอร์มินัล

ฉันสามารถใช้ emacs daemon ได้โดยใช้

emacsclient .bashrc

ซึ่งเปิด. bashrc ในเซสชันเทอร์มินัล emacs

การใช้ประโยชน์จาก GUI

ตอนนี้ยังคงเป็นคำถาม: ฉันจะใช้ประโยชน์จาก GUI ได้อย่างไร

เมื่อฉันเข้าใจ emacsclient ฉันไม่สามารถเปิด emacsclient ได้เว้นแต่ฉันจะระบุไฟล์ที่จะเปิด

ฉันต้องการเปิด GUI emacsclient และเปิดไฟล์ทั้งหมดที่เปิดไว้ก่อนหน้านี้หรือไม่ เป็นไปได้ไหม

ฉันพบว่าฉันสามารถใช้

emacsclient -c

ในเทอร์มินัลเพื่อทำสิ่งที่ฉันต้องการ - แต่ฉันสามารถทำสิ่งเดียวกันกับ GUI ได้หรือไม่?


ฉันไม่เข้าใจความหมายของ "จาก GUI" ที่นี่ อาจหมายถึง "ดับเบิลคลิกที่ไฟล์ใน Finder" หรืออย่างอื่น
tarsius

การใช้ตัวเรียกใช้งานแอป (เช่นผ่าน Spotlight)
Rainer

ตัวเรียกใช้งานแอปอนุญาตให้เลือกไฟล์หรือไม่ (ซึ่งจะเปิดขึ้นโดยใช้แอปพลิเคชันเริ่มต้นสำหรับประเภทไฟล์) หรือเฉพาะ "แอพ" emacsclientไม่ใช่แอพที่เกี่ยวข้องกับ OS X เท่านั้นEmacsคือ (และเฉพาะเมื่อมีการติดตั้งด้วยวิธีดังกล่าว) ทำไมคุณไม่ใช้การเชื่อมโยงคีย์ระบบเพื่อเลือกแอปพลิเคชัน / หน้าต่างที่เปิดอยู่ (จะไม่ทำงานหาก Emacs เริ่มทำงานในโหมด daemon และยังไม่มีเฟรม ("หน้าต่าง"))
Tarsius

ฉันกำหนดแอพที่เรียกว่า Emacsclient ซึ่งเปิดตัว emacsclient - ดังนั้นแอป Emacsclient จึงอยู่ที่นั่น เห็นได้ชัดว่าฉันสามารถเปลี่ยนไปใช้อินสแตนซ์ emacs ที่กำลังทำงานอยู่ได้ แต่นี่คือประเด็นที่ควรพิจารณาเกี่ยวกับขั้นตอนการทำงานที่อธิบายไว้ข้างต้น
Rainer

1
คำถามนี้เป็นคำถามที่เกือบจะเป็นประโยชน์มากกว่าคำตอบของมัน :)
รอย Truelove

คำตอบ:


6

ฉันไม่รังเกียจ Emacs.app ที่ทำงานอยู่ตลอดเวลา แต่ความจริงที่ว่าฉันไม่สามารถปิดหน้าต่างได้โดยไม่ได้ตั้งใจฆ่าเซิร์ฟเวอร์ Emacs นั้นน่ารำคาญ และแม้ว่าคุณจะพยายามอย่างหนักเพื่อฆ่าเฟรมสุดท้ายมันก็ยังไม่ช่วยให้คุณ: "พยายามที่จะลบเฟรมที่มองเห็นหรือเป็นไอคอนเพียงอย่างเดียว" ... ดังนั้นเราจึงโกง

โซลูชันนี้จะซ่อน Emacs (เช่นCommand+ h) เมื่อคุณพยายามปิดหน้าต่างสุดท้ายโดยคลิกปุ่มปิด

เพิ่มสิ่งต่อไปนี้ลงใน Emac ของคุณที่อื่น

(defadvice handle-delete-frame (around my-handle-delete-frame-advice activate)
  "Hide Emacs instead of closing the last frame"
  (let ((frame   (posn-window (event-start event)))
        (numfrs  (length (frame-list))))
    (if (> numfrs 1)
      ad-do-it
      (do-applescript "tell application \"System Events\" to tell process \"Emacs\" to set visible to false"))))

และเพิ่ม Emacs ไปที่ "ผู้ใช้ & กลุ่ม> รายการเข้าสู่ระบบ" และคลิกช่องทำเครื่องหมาย "ซ่อน"

Emacs ของคุณยังต้องโทรหาที่(start-server)อื่นด้วย

ฉันใช้emacsclientเสื้อคลุมนี้เพื่อนำ Emacs ไปด้านหน้า:

#!/bin/sh
osascript -e 'tell application "Emacs" to activate'
exec emacsclient "$@"

ปัญหาที่พบ:

  • การเปิดใช้งาน / การซ่อน Emacs นำหน้าต่างทั้งหมดไปไว้ด้านหน้า มันน่ารำคาญเล็กน้อย
  • การคลิกที่ไอคอน Emacs ใน Dock ดูเหมือนจะสร้างหน้าต่างใหม่แบบสุ่มในบางครั้ง แต่ไม่เสมอไป.
  • สิ่งที่ต้องทำ: บางทีทำให้Command+ wในเฟรมสุดท้ายซ่อน Emac ด้วย?
  • ใหม่พร้อมการแก้ไข: การคลิกที่ไอคอน Dock เมื่อหน้าต่างทั้งหมดถูกย่อขนาดเล็กสุดจะไม่ขยายหน้าต่างให้ใหญ่สุดโดยอัตโนมัติ

นี่เป็นไปตามคำตอบของ @ noaham ที่แนะนำให้ลด Emacs ให้น้อยที่สุดและคำตอบนี้จะอธิบายวิธีการขอปิดหน้าต่างสุดท้าย

แก้ไข:

การค้นหาผ่านมาผมพบว่า"ที่สำคัญที่มีผลผูกพัน" สำหรับmac-apple-event-mapmac-ae-reopen-applicationที่โทร mac-ae-reopen-applicationดูเหมือนว่าจะตรวจสอบเฟรมที่มองเห็นและเป็นไอคอนและต้องพลาดเฟรมที่เราซ่อนอยู่ นี่อาจเป็นข้อผิดพลาด

การแก้ไขที่ง่ายคือเพียงแค่ปิดใช้งานการเชื่อมโยงคีย์ใน init ของคุณ:

(define-key mac-apple-event-map [core-event reopen-application] nil)

สิ่งนี้จะแนะนำข้อบกพร่องเล็กน้อยใหม่: การคลิกที่ไอคอน Dock เมื่อหน้าต่างทั้งหมดถูกย่อขนาดเล็กสุดจะไม่ขยายหนึ่งในนั้นให้ใหญ่ที่สุด การแก้ไขที่ถูกต้องคือการเขียนใหม่mac-ae-reopen-applicationแต่ฉันเพิ่งรู้ emacs และ elisp


ถ้าใครรู้วิธีหยุดหน้าต่างใหม่แบบสุ่ม (สัญลักษณ์แสดงหัวข้อที่สอง) โปรดบอกฉัน อาจเป็นสิ่งเดียวที่เหลือที่ยังคงดักฉันเกี่ยวกับการตั้งค่านี้
parent5446

@ parent5446 เรียบร้อยแล้ว! เฉกเช่นเดียวกับการแก้ไขครั้งแรก แต่ก็ใช้งานได้
bburky

ขอบคุณ! ส่วนของการแฮ็คนั้นไม่ได้รบกวนฉันตั้งแต่ส่วนใหญ่ฉันไม่ได้เริ่มต้น Emacs จากท่าเรืออย่างไรก็ตาม
parent5446

4

พอร์ต emac ของ Yamamoto Mitsuharu ของ emacs ไม่รองรับการทำงานหลายอย่าง (ดูปัญหานี้) ซึ่งหมายความว่าคุณไม่สามารถเริ่ม emacs daemon จากเทอร์มินัลและเปิดใช้งานหน้าต่าง gui ด้วย emacsclient

นี่คือสิ่งที่ฉันทำ: ใน init.el ฉันมี(server-start)และฉันเปิดตัว Emacs.app เมื่อเข้าสู่ระบบ สิ่งที่น่ารำคาญในที่นี้คือมันจะเปิดหน้าต่างซึ่งฉันต้องย่อเล็กสุดด้วยตนเอง

ฉันมีสคริปต์ทุบตีเรียกemacscด้วยดังต่อไปนี้

#!/bin/bash                                                                          
export PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin
emacsclient -n -c

ฉันสร้างแอพด้วย applescript ซึ่งมีสิ่งต่อไปนี้

tell application "Emacs"
    activate
end tell
do shell script "~/bin/emacsc"

เป็นเรื่องสำคัญที่จะต้องส่ง-nแฟลกไปที่ emacsclient ไม่เช่นนั้นคุณจะสามารถใช้แอพ emacsc เพื่อเปิดไคลเอนต์ครั้งละหนึ่งตัวเท่านั้น การตั้งค่าตัวแปรพา ธ ทำให้แน่ใจว่า OS X สามารถค้นหา emacsclient รุ่นที่ถูกต้อง

การบอก Emac เพื่อ "เปิดใช้งาน" ช่วยให้มั่นใจได้ว่าหน้าต่างไคลเอนต์ของคุณจะเปิดตัวในเบื้องหน้า

อย่างที่ฉันบอกว่าสิ่งที่น่ารำคาญก็คือคุณต้องลดขนาดหน้าต่าง emacs ด้วยตนเองเมื่อเข้าสู่ระบบจากนั้นให้นั่งลงที่ท่าเรือ วิธีหนึ่งในการหลีกเลี่ยงปัญหานี้คือการ "ซ่อน" Emacs หลังจากเข้าสู่ระบบโดยอัตโนมัติ แต่การเปิดใช้งานจะทำให้เลิกการซ่อน


2

ฉันไม่แน่ใจว่า Railwaycat Emacs นั้นแตกต่างจากสูตรการชงที่บ้านทั่วไป แต่ด้วยวิธีที่คุณควรทำln -sfv /usr/local/opt/emacs/*.plist ~/Library/LaunchAgentsซึ่งจะทำงานemacs --daemonในการเข้าสู่ระบบ

plist จะรวมเป็นที่นี่เอกสารในสูตร ทั้งหมดที่คุณจะต้องนำมาใช้ก็คือการเปลี่ยนเส้นทางไปยัง emacs <string>#{opt_bin}/emacs</string>แอปของคุณในบรรทัด

BTW คุณสามารถรับ Emacs เป็นแอพพลิเคชั่น OS X ด้วย Homebrew Emacs หากคุณติดตั้งด้วย--cocoaตัวเลือก (คุณจะต้องเรียกใช้brew linkappsภายหลังเพื่อเชื่อมโยง/Applicationsหรือสร้างลิงค์ด้วยตัวเอง


1

เมื่อวันที่ภูตแม็คที่มี 90% ของเวลาที่จัดการโดยใช้launchd มันสามารถเรียกใช้พวกเขาในทริกเกอร์จำนวนมากรวมถึงผู้ใช้เข้าสู่ระบบ / ออกจากระบบ มีแอพพลิเคชั่น Mac สวย ๆ ชื่อLingonสำหรับดูและแก้ไขสิ่งต่าง ๆ ที่ launchd กำลังจัดการอยู่ วิกิ emacs มีการกล่าวถึงสิ่งนี้รวมถึงและตัวอย่างไฟล์การกำหนดค่า แต่ดูเหมือนว่าไม่ได้แก้ไขข้อกังวลของคุณเช่นวิธีปิด daemon เมื่อออกจากระบบ


0

สร้างแอปพลิเคชัน AppleScript เช่นนี้:

tell application "Terminal"
do shell script "/usr/local/bin/emacsclient -c"
endtell

คุณอาจต้องปรับเปลี่ยนเส้นทางหรือคุณอาจจะออกจากเส้นทางโดยสิ้นเชิง นอกจากนี้คุณยังสามารถใช้สิ่งที่นักเล่นด้วยเมื่อเริ่มภูตถ้ามันยังไม่ทำงาน


@Rainer มีความสำเร็จกับเรื่องนี้ไหม? คุณอาจต้องการค้นหาการใช้งานที่ชื่นชอบยิ่งขึ้นซึ่งแม้แต่จะเริ่ม daemon หากจำเป็นก่อนที่จะเชื่อมต่อกับมันโดยใช้ emacsclient "applescript emacsclient" ให้ผลลัพธ์ที่ดีด้วยการค้นหาโดย Google
Tarsius

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