การตั้งค่าพื้นฐานของเซิร์ฟเวอร์ Emacs ภายใต้ OSX


9

ฉันเพิ่งซื้อ Mac เครื่องแรกของฉันในช่วงทศวรรษที่ผ่านมาและกำลังอยู่ระหว่างการกำหนดค่า ฉันเป็นผู้ใช้ Emacs และได้กำหนดไว้แล้วว่าฉันต้องการเพียงแค่ Emacs ปกติไม่ใช่ Aquamacs เพื่อที่ฉันจะสามารถใช้การกำหนดค่าที่มีอยู่จากระบบปฏิบัติการอื่นได้ ฉันได้พยายามต่อไปนี้เป็นจำนวนมากวิธีการชำระเงินที่ฉันได้พบออนไลน์ (ชอบคนนี้ , คนนี้และคนนี้จากเว็บไซต์จากที่ผมดาวน์โหลด Emacs ) และได้พยายามรวมชิ้นส่วนหลายวิธีใด ๆ แต่ไม่เคยมี สิ่งต่าง ๆ เข้าสู่สถานะแม้ใกล้ถึงสิ่งที่ฉันเคย / หวังว่า:

  1. Emacs ภูตเริ่มต้นทำงานอย่างใดอย่างหนึ่งที่เริ่มต้นหรือเร็วที่สุดเท่าที่ฉันต้องการมัน ; อย่างใดอย่างหนึ่งก็ดี เฟรม Emacs ใหม่ใด ๆ ได้รับการสนับสนุนโดยเซิร์ฟเวอร์เดียวกัน
  2. เมื่อฉันเปิดไฟล์ข้อความจาก Finder ไฟล์จะเปิดขึ้นใน Emacs ในกรอบกราฟิกที่มีอยู่ถ้าเป็นไปได้
  3. ถ้าฉันเรียกใช้ Emacs.app ระบบจะใช้ emacs daemon ที่ทำงานในพื้นหลังแทนการเริ่มต้นอินสแตนซ์ใหม่และเปิดหน้าต่างใหม่ ( หมวกปลาย )
  4. เมื่อฉันเรียกใช้ Emacs จากเครื่องเทอร์มินัลเครื่องจะทำงานโดยไม่รอให้ฉันทำงานกับ Emacs (เว้นแต่ฉันจะใช้ '-nw')
  5. AFAIK ที่ไม่มีจุดใดในระหว่างการดำเนินการที่อธิบายไว้ข้างต้น Emacs ควรจะอยู่ในสถานะ ("โหมดแก้ไขเซิร์ฟเวอร์?") ซึ่งมันกำลังรอให้ฉันพิมพ์C-x #แม้ว่าฉันจะไม่เข้าใจอย่างถ่องแท้
  6. (ฉันคิดว่านี่เป็นโบนัส) มีบางวิธีที่ฉันจะเรียก Emacs จากเทอร์มินัลเพื่อที่ Emacs จะนำกรอบที่มีอยู่มาใช้ใหม่ถ้าเป็นไปได้

ฉันจะกำหนดค่า Emacs ให้ทำงานเช่นนี้ได้อย่างไร

ฉันสับสนโดยเฉพาะอย่างยิ่งโดยการเปิด Finder ให้เปิดสิ่งต่าง ๆ ใน Emacs แบบที่ฉันต้องการ (# 2) เนื่องจากคำแนะนำที่ฉันพบมักสร้างนามแฝงจำนวนหนึ่ง, Applescripts, สคริปต์ทุบตี ฯลฯ และฉันไม่แน่ใจ ซึ่งฉันต้องการบอก Finder ให้ใช้เพื่อเปิดไฟล์ข้อความ

ขอบคุณ!

A. @lawlist ถามว่า "เฟรมใหม่จะถูกเปิดตามค่าเริ่มต้นเมื่อคุณเปิดไฟล์ใหม่จากเทอร์มินัลแม้ว่าจะมีเฟรมอยู่หรือไม่" คำตอบคือถ้าฉันเริ่มต้นเซิร์ฟเวอร์เมื่อเริ่มต้นตามที่อธิบายไว้ที่นี่ให้เปิดเฟรมจากนั้นเปิดไฟล์โดยพิมพ์/Applications/Emacs.app/Contents/MacOS/bin/emacsclient -n <whatever>ฉันจะสามารถเปิดไฟล์ในเฟรมที่มีอยู่ได้ หากไม่มีเฟรมเปิดอยู่ฉันต้องใช้ "-nc" หรือเมื่อฉันพยายามเปิดไฟล์ไม่มีอะไรเกิดขึ้น

B. @lawlist ถามว่า "คุณต้องการให้ daemon ทำงานในการเข้าสู่ระบบหรือว่าจะเพียงพอที่จะโหลด Emacs ด้วยตนเองหลังจากเข้าสู่ระบบหรือไม่" การรันด้วยตัวเองจะเป็นเรื่องปกติ


คุณสามารถกำหนดหมายเลขโปรด, 1, 2, 3, 4, 5, 6 และอาจ 7 และ 8 นอกจากนี้เฟรมใหม่จะถูกเปิดตามค่าเริ่มต้นเมื่อคุณเปิดไฟล์ใหม่จากเทอร์มินัลแม้ว่าจะมีเฟรมอยู่แล้ว ? ฉันรู้คำตอบบางข้อ แต่ไม่ใช่ทั้งหมดคำตอบดังนั้นตัวเลขสำหรับคำถามจะเป็นประโยชน์ คุณต้องการให้ daemon ทำงานในการเข้าสู่ระบบหรือมันจะเพียงพอที่จะโหลด Emacs ด้วยตนเองหลังจากเข้าสู่ระบบ?
กฎหมาย

@Lauri Ranta มีคำตอบที่ดี M-x server-startจะเริ่มต้นเซิร์ฟเวอร์ด้วยตนเองเพื่อให้emacsclientสามารถสื่อสารกับมันได้ ฉันได้วางไว้(server-start)ในinit.elไฟล์แทนที่จะใช้ daemon เมื่อเข้าสู่ระบบ - อย่างไรก็ตามหลายคนชอบตัวเลือกการเข้าสู่ระบบ daemon และแน่นอนที่ไฟล์จะเป็นสถานที่ที่เหมาะสำหรับ.emacs (server-start)
ฏหมาย

ในส่วนที่เกี่ยวกับการเปิดไฟล์จาก Finder ฉันคิดว่าคุณอยู่ไกลเกินกว่าขั้นตอนของการต้องการบางสิ่งเช่นนี้: dummies.com/how-to/content/ ...... ดังนั้นสมมติว่ามันออกนอกทางแล้วคุณอาจจะไป เพื่อให้เหมาะสมกับns-find-file- ซึ่งเปิดใช้งานโดยอัตโนมัติเมื่อไฟล์เชื่อมโยงกับ Emacs.app ฟังก์ชั่นไฟล์สกัดกั้นของฉันในลิงก์ด้านบนยังแก้ไขns-find-fileหากนั่นเป็นสิ่งที่คุณสนใจ --with-nsแน่นอนคุณต้องสร้าง Emacs
ฏหมาย

คำตอบ:


10

เพื่อให้ Emacs.app ไฟล์ที่เปิดอยู่ในกรอบที่มีอยู่แทนกรอบใหม่เพิ่มไปยังแฟ้มการกำหนดค่าเช่น(setq ns-pop-up-frames nil)~/.emacs

คุณสามารถเปิดไฟล์จากขั้วด้วยหรือopen -a emacs file emacsclient -n fileหาก Emacs.app ไม่เปิดขึ้น แต่มีEmacs --daemonกระบวนการด้วยเหตุผลบางอย่างemacsclient -n fileใช้งานemacsclient -nc fileไม่ได้

ตรวจสอบให้แน่ใจว่าคุณใช้emacsclientไบนารีที่มาพร้อมกับเวอร์ชั่นของ Emac ที่คุณใช้เช่น/Applications/Emacs.app/Contents/MacOS/bin/emacsclientหรือ/usr/local/bin/emacsclientถ้าคุณติดตั้ง Emacs ด้วย Homebrew

ในการเริ่มต้นเซิร์ฟเวอร์ Emacs ที่เข้าสู่ระบบตัวอย่างเช่นบันทึกโปรแกรมนี้เป็น~/Library/LaunchAgents/my.emacsdaemon.plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>my.emacsdaemon</string>
  <key>ProgramArguments</key>
  <array>
    <string>/Applications/Emacs.app/Contents/MacOS/Emacs</string>
    <string>--daemon</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
  <key>KeepAlive</key>
  <true/> <!-- run the program again if it terminates -->
</dict>
</plist>

plist มีการโหลดโดยอัตโนมัติในครั้งต่อไปที่คุณเข้าสู่ระบบ launchctl load ~/Library/LaunchAgents/my.emacsdaemon.plistแต่คุณสามารถโหลดได้ทันทีด้วยการวิ่ง

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

macos=/Applications/Emacs.app/Contents/MacOS
if pgrep -qf 'Emacs.*--daemon'; then
  [[ $($macos/bin/emacsclient -e '(<= 2 (length (visible-frame-list)))') = t ]] && args=-nc || args=-n
else
  $macos/Emacs --daemon
  args=-nc
fi
$macos/bin/emacsclient $args "$@"
open -a /Applications/Emacs.app

คุณสามารถใช้Platypusเพื่อบันทึกสคริปต์เป็นแอปพลิเคชัน:

ฉันเพิ่งเริ่มใช้ Emacs แต่ฉันมีการตั้งค่าที่แตกต่างอย่างสิ้นเชิง ผมทำโปรแกรม Emacs ของตัวเองด้วยการทำสำเนาของ iTerm.app ที่เปลี่ยน CFBundleIdentifier ใน Info.plist /usr/local/bin/emacsเพื่อให้โปรแกรมประยุกต์ที่ใช้แฟ้มการกำหนดลักษณะที่แตกต่างกันและการตั้งค่าคำสั่งเริ่มต้นที่จะ ฉันได้เพิ่ม(server-start)ไป~/.emacsและฉันเปิดแอปพลิเค Emacs กำหนดเองในการเข้าสู่ระบบ ฉันใช้ Platypus เพื่อสร้างแอปพลิเคชันที่ทำงานemacsclient -n "$@";open -b my.emacsและฉันตั้งเป็นแอปพลิเคชันเริ่มต้นสำหรับไฟล์ข้อความ


2

วิธีแก้ปัญหาของ Lauri รวมกับข้อเสนอแนะจากความคิดเห็นส่วนใหญ่ได้แก้ไขปัญหาของฉัน ฉันได้วาง Applescript ด้านล่างที่ฉันเย็บเข้าด้วยกันจากสิ่งที่ฉันพบทางออนไลน์ สคริปต์ช่วยลดเลือนริ้วรอยที่เหลืออยู่เช่นพฤติกรรมของมันจะดีขึ้นเล็กน้อยหากไม่มีเฟรมของ Emacs ในปัจจุบัน

แก้ไข: วัตถุประสงค์ของสคริปต์คือการเชื่อมโยงกับไฟล์. txt ใน Finder

-- http://superuser.com/questions/457484/how-to-open-emacs-from-macs-finder
-- https://gist.github.com/ambethia/304964#comment-799519
on run {input}
    set filepath to quoted form of POSIX path of input
    tell application "Terminal"
        try
            -- we look for <= 2 because Emacs --daemon seems to always have an entry in visibile-frame-list even if there isn't
            set frameVisible to do shell script "/Applications/Emacs.app/Contents/MacOS/bin/emacsclient -e '(<= 2 (length (visible-frame-list)))'"
            if frameVisible is "t" then
                do shell script "/Applications/Emacs.app/Contents/MacOS/bin/emacsclient -n " & filepath
            else
                -- there is a not a visible frame, launch one
                do shell script "/Applications/Emacs.app/Contents/MacOS/bin/emacsclient -c -n " & filepath
            end if
        on error
            -- daemon is not running, start the daemon and open a frame     
            do shell script "/Applications/Emacs.app/Contents/MacOS/Emacs --daemon"
            do shell script "/Applications/Emacs.app/Contents/MacOS/bin/emacsclient -c -n"
        end try
    end tell

    -- bring the visible frame to the front
    tell application "Emacs" to activate

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