Emacs เปิดไฟล์ในเฟรมใหม่เมื่อเปิดด้วย“ open -a”


20

ฉันต้องการที่จะสามารถเรียก Emacs จากบรรทัดคำสั่งและเริ่ม Emacs แบบกราฟิกหากไม่ได้ทำงานหรือเยี่ยมชมไฟล์ใน Emacs ที่กำลังทำงานอยู่ ฉันพยายามทำสิ่งนี้emacsclientซึ่งฉันรู้ว่าเป็น "วิธีที่ถูกต้อง" ในการทำสิ่งนี้ แต่ฉันมีปัญหามากมายกับมันใน OS X มันจะผิดพลาดแบบสุ่มหรือemacs --daemonกระบวนการจะหยุดทำงานในระหว่างการปิดหรือรีบูตเครื่อง และความไม่แน่นอนทั่วไป ในขณะที่ฉันต้องการที่จะได้รับการทำงานในขณะนี้open -aใช้งานได้จริงดีกว่ามากยกเว้นปัญหานี้ฉันจะอธิบายด้านล่าง:

ใช้open -aแบบนี้:

$ open -a Emacs file.txt

จะเริ่ม Emacs หากไม่ได้ใช้งานและไปที่ไฟล์ แต่ถ้าฉันทำสิ่งนี้เมื่อบัฟเฟอร์ปัจจุบันไม่ใช่*scratch*ไฟล์ที่เปิดในเฟรมใหม่ (เช่นหน้าต่างระบบใหม่)

นี่คือตัวอย่างเซสชัน:

$ open -a Emacs file.txt

สิ่งนี้เริ่มต้น Emacs และเปิด file.txt ดังนั้นจึงมีเฟรมเดียวที่มีบัฟเฟอร์นี้อยู่ภายใน ถ้าฉันสลับไปที่*scratch*บัฟเฟอร์และทำสิ่งนี้:

$ open -a Emacs file1.txt

มันเปิดไฟล์นี้ในเฟรมเดียวกัน ขณะนี้มีเฟรมเดียวที่เปิดไฟล์นี้และถ้าฉันทำสิ่งนี้:

$ open -a Emacs file2.txt 

มันเปิดเฟรมใหม่ส่งผลให้เปิดสองเฟรมในครั้งเดียว

ฉันได้ลองเล่นซอกับบรรทัดคำสั่ง args เพื่อ Emacs โดยใช้--argsสวิตช์ไปopenแต่ดูเหมือนจะไม่ทำงานสำหรับการโทรครั้งต่อไปเช่น:

$ open -a Emacs --args --eval='(print "foo")'
$ open -a Emacs --args --eval='(print "bar")'

นี่พิมพ์เฉพาะ "foo" ในบัฟเฟอร์ข้อความ ... ครั้งที่สองที่ Emacs เพิ่งถูกนำไปที่ส่วนหน้า แต่ไม่มีข้อความที่พิมพ์

ฉันไม่แน่ใจว่าวิธีopenการสื่อสารกับแอปพลิเคชันที่ทำงานอยู่แล้วไม่มีใครรู้ว่าฉันจะหาได้อย่างไร หรือมีวิธีที่จะได้รับบันทึกรายละเอียดของสิ่งที่เกิดขึ้นมากกว่าMessagesบัฟเฟอร์หรือไม่? ไม่มีอะไรน่าสนใจถูกพิมพ์ไปที่บัฟเฟอร์นั้นในช่วงเซสชั่นด้านบนดังนั้นฉันไม่รู้ว่าฉันจะแฮ็ค Emacs Lisp ได้อย่างไรเพื่อทำสิ่งที่ฉันต้องการ ...

ขอบคุณ!


ฉันไม่รู้อะไรเกี่ยวกับ OSX ดังนั้นฉันจึงไม่สามารถให้อะไรเป็นรูปธรรมได้ ถ้าฉันจะแก้จุดบกพร่องนี้ฉันจะโยนข้อผิดพลาดทางไวยากรณ์ลงไปfind-fileแล้วตั้งค่าdebug-on-errorเป็น t และตรวจสอบการติดตามสแต็กสำหรับเบาะแสบางอย่างว่า Emacs ถูกเรียกใช้อย่างไร การเพิ่มข้อผิดพลาดfind-fileอาจทำได้ง่ายเพียงแค่คัดลอกคำจำกัดความของฟังก์ชั่นไปยังบัฟเฟอร์รอยกระเพื่อมและเพิ่มการเรียกเข้าไปerror(เช่น(error "cause stack trace")ไม่เคยเปลี่ยนไฟล์แหล่งที่มาสำหรับfind-file- ทำสิ่งนี้ในเครื่องขูด!
Joe Casadonte

@ โจขอบคุณ! นั่นเป็นความคิดที่ดีมากฉันจะระลึกไว้เสมอว่าในอนาคต ฉันสิ้นสุดขึ้นจริงพยายามที่จะใช้emacsclientอีกครั้งและเริ่มต้นด้วย(server-start)ในของฉันinit.elดูเหมือนว่าจะทำงานได้ดีกว่าที่บูตขึ้นซึ่งเป็นสิ่งที่ผมเคยพยายามครั้งแรกที่ฉันพยายามemacs --daemon emacsclient
michiakig

คำตอบ:


26

คำตอบอยู่ที่นี่: ตัวแปร emacs เป็น "open with" ในเฟรมดั้งเดิม

เป็นการเปลี่ยนการตั้งค่าเริ่มต้นใน emacs รุ่นใหม่กว่า เพิ่ม:

(setq ns-pop-up-frames nil)

เป็นไฟล์. emacs

มีความสุขมากที่ได้พบสิ่งนี้


มันมีประโยชน์มาก! ร่วมกับopen -a /Applications/Emacs.app $1สิ่งต่าง ๆ ที่ดูเหมือนว่าจะทำงานได้ดี! โปรดทราบว่าฉันเริ่มเซิร์ฟเวอร์ใน init เพื่อให้มี emacs สำหรับ git เช่น
Dror
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.