จะเปิด GUI Emac จาก Command Line ใน OSX ได้อย่างไร


91

ฉันจะเปิด GUI Emac จากบรรทัดคำสั่งใน OSX ได้อย่างไร

ผมได้ดาวน์โหลดและติดตั้ง Emacs จากhttp://emacsformacosx.com/

ฉันจะรับคำตอบที่ตรงตามเกณฑ์ทั้งหมดต่อไปนี้:

  1. หน้าต่าง emacs จะเปิดขึ้นที่หน้าหน้าต่างเทอร์มินัลของฉัน
  2. การพิมพ์ "emacs" จะเป็นการเปิดหน้าต่าง GUI Emacs การค้นหาไฟล์ในหน้าต่างนั้นจะเป็นค่าเริ่มต้นในการค้นหาในไดเร็กทอรีจากจุดที่ฉันเริ่ม Emacs
  3. การพิมพ์ "emacs foo.txt" เมื่อมี foo.txt จะเปิดหน้าต่าง GUI Emacs ที่โหลด foo.txt
  4. พิมพ์ "emacs foo.txt" เมื่อ foo.txt ไม่ไม่อยู่เปิดตัวหน้าต่าง GUI Emacs กับข้อความที่ว่างเปล่าบัฟเฟอร์ชื่อ "foo.txt" การทำ ^ X ^ S ในบัฟเฟอร์นั้นจะบันทึก foo.txt ในไดเร็กทอรีจากจุดที่ฉันเริ่ม Emacs

ข้อใดที่ไม่ตรงตามเกณฑ์เหล่านี้เมื่อป้อน 'emacs' ที่ข้อความแจ้งเทอร์มินัล ข้อกำหนดของคุณอธิบายพฤติกรรมเริ่มต้นบน Linux ฉันไม่ได้ใช้ Mac มาระยะหนึ่งแล้ว แต่ฉันคิดว่าเคล็ดลับคือการค้นหาโปรแกรมที่เหมาะสมเพื่อดำเนินการ - emacs.app อาจจะ?
Tyler

8
ไทเลอร์มาจากพื้นหลัง Linux ฉันอยู่กับคุณตลอดทาง แค่พิมพ์ "emacs" ที่พรอมต์ก็น่าจะทำได้ทั้งหมด การทำเช่นนั้นบน OSX จะเปิดโหมดข้อความ Emacs ในหน้าต่างเทอร์มินัลอย่างไรก็ตาม (จึงไม่ผ่านเกณฑ์ที่ 1) และนั่นไม่ใช่สิ่งที่ฉันต้องการ
Johan Walles

1
โยฮัน - คุณพบวิธีแก้ปัญหาในระหว่างนี้หรือยัง? ฉันกำลังต่อสู้กับปัญหาเดิม ๆ และคิดเกี่ยวกับการเริ่มต้นค่าหัว ที่น่ารำคาญอย่างยิ่งคือการเรียก emacs (ไม่ใช่ Emacs.app) จากบรรทัดคำสั่งจะเปิดหน้าต่างในพื้นหลัง ...
alexurba

1
@DougHarris ความต้องการของฉันตรงกับความเป็นจริงใน Linux distro ใด ๆ นั่นคือที่มาจาก ฉันดีใจที่คุณพบเวิร์กโฟลว์ที่เหมาะกับคุณ ไชโย!
Johan Walles

2
ฉันไม่รู้ว่ามันใช้งานได้บน OSX หรือไม่ แต่คุณสามารถลอง: emacsclient -c -a "" "$@"command
jfs

คำตอบ:


113

เรียกสคริปต์ต่อไปนี้ว่า "emacs" และวางไว้ในที่PATHใดที่หนึ่งของคุณ:

#!/bin/sh
/Applications/Emacs.app/Contents/MacOS/Emacs "$@"

ซึ่งครอบคลุม # 2, # 3 และ # 4

สำหรับ # 1 ให้วางไว้ที่ใดที่หนึ่งในไฟล์. macs ของคุณ:

(x-focus-frame nil)

emacsformacosx.comเว็บไซต์ตอนนี้มีหน้าวิธีการซึ่งเป็นที่ที่ข้อมูลโค้ดด้านบนมาจาก มีข้อมูลเพิ่มเติมที่นั่นเกี่ยวกับการทำงานemacsclientและ hooking Emacs git mergetoolถึง


1
ขอบคุณดาวิดคุณปกครอง!
Johan Walles

1
ใช้งานได้ดี เงินรางวัลที่กำลังจะมาถึง
Tamzin Blake

2
เมื่อวันที่ Mavericks ถ้าผมอยู่ในโฟลเดอร์~/fooและต้องการที่จะเปิดbar.txtฉันพิมพ์gmacs bar.txtแต่มันสร้างไฟล์ใหม่ที่แทนการเปิด~/bar.txt ~foo/bar.txtฉันทำอะไรผิดหรือเปล่า?
Daniel Compton

2
ไฟล์. macs อยู่ที่ไหน
เบรน

1
คุณไม่สามารถเพิ่ม (x-focus-frame nil) ได้ทุกที่โดยจะต้องอยู่ในนิพจน์ (ตัวแปรชุดที่กำหนดเอง) ซึ่ง emac จะสร้างให้คุณเมื่อคุณตั้งค่าอะไรผ่านการปรับแต่ง เพียงปรับแต่งบางอย่างจากแถบเมนูเช่นการตั้งค่า "เคอร์เซอร์กะพริบ" (จากนั้นปิดหากคุณไม่ชอบ) จากนั้นส่วนนั้นจะถูกสร้างขึ้นใน. emac ของคุณ นอกจากนี้ยังมีการทดสอบหรือไม่? ฉันไม่แน่ใจว่าอีแมคในโกโก้จะเคารพการตั้งค่านี้ด้วยซ้ำ
Chuck Adams

71

ในเชลล์ของคุณใช้แทนคำสั่ง 'emacs' เพื่อชี้ไปที่แอปพลิเคชัน OSX emacs

ในเชลล์ของฉัน (เรียกใช้ bash เริ่มต้น) ฉันมีสิ่งต่อไปนี้ (ใน. bashrc ของฉัน)

alias emacs='open -a /Applications/Emacs.app $1'

จากนั้นพิมพ์ emac บนบรรทัดคำสั่งเพื่อเริ่มแอปพลิเคชัน emacs

อย่างไรก็ตามฉันขอแนะนำให้คุณเปิดสำเนาของ emac และใช้งานต่อไป หากเป็นกรณีนี้และคุณต้องการโหลดไฟล์ลงในสำเนาของ emac ที่มีอยู่คุณสามารถใช้ emacsclient ได้โดยวางสิ่งต่อไปนี้ใน. bashrc ของคุณ:

alias ec='/Applications/Emacs.app/Contents/MacOS/bin/emacsclient'

จากนั้นเพิ่มสิ่งต่อไปนี้ในไฟล์. macs ของคุณเพื่อเริ่มต้นเซิร์ฟเวอร์ emacs (ซึ่งรับการเรียกใช้ emacsclient)

;;========================================
;; start the emacsserver that listens to emacsclient
(server-start)

จากนั้นคุณสามารถพิมพ์

ec .bashrc

เพื่อโหลดสำเนาของ. bashrc ลงในเซสชัน emacs ที่มีอยู่!


4
สวัสดีคริส! คำตอบแรกของคุณไม่ผ่านเกณฑ์ 2 และ 4 คำตอบที่สองของคุณไม่ผ่านเกณฑ์ 2 ฉันกำลังมองหาวิธีแก้ปัญหาที่ตรงตามเกณฑ์ตัวเลขทั้งหมด ขอแสดงความนับถือ / Johan
Johan Walles

4
ดูเหมือนว่าปัญหาทั้งหมดของคุณสามารถแก้ไขได้หากคุณใช้ emacs เพื่อโหลดไฟล์แทนที่จะใช้บรรทัดคำสั่งเพื่อเปิดอินสแตนซ์ใหม่ทุกครั้ง โดยทั่วไปฉันจะเริ่ม emac ในตอนเริ่มต้นของวัน (หากยังไม่ทำงาน) และใช้เพื่อโหลดไฟล์เปลี่ยนไดเรกทอรีสร้างไฟล์ใหม่และสิ่งอื่น ๆ ที่ฉันต้องการโดยไม่ต้องแตะหน้าต่างเทอร์มินัล
Chris McMahan

ฉันต้องบอกว่ามีคำถามเหล่านี้หลายข้อในไซต์นี้ที่เกี่ยวข้องกับคำถามนี้ แต่นี่เป็นคำถามเดียวที่สามารถแก้ปัญหาการเปิดไฟล์ได้อย่างสมบูรณ์ในลักษณะที่คมคายสั้น ๆ
tylerthemiler

3
@tylerthemiler คำตอบที่ช่วยแก้ปัญหาได้อย่างสมบูรณ์อยู่ที่ไหน ทั้งสองคำตอบในคำตอบนี้ล้มเหลวเกณฑ์ 2 และคำตอบแรกล้มเหลว 4 เช่นกัน
Johan Walles

6
ชั้นเชิงเล็ก ๆ น้อย ๆ ช่วยตอบคำถามได้นาน Googling น้อยก็เช่นกัน
duma

10

สิ่งนี้ช่วยปรับปรุงคำตอบของ David Caldwellโดยเริ่ม Emacs ในพื้นหลัง:

#!/bin/sh
$(/Applications/Emacs.app/Contents/MacOS/Emacs "$@") &

ตามที่ระบุไว้ในคำตอบอื่น ๆ นี้ครอบคลุม # 2, # 3 และ # 4 สำหรับ # 1 ให้วางไว้ที่ใดที่หนึ่งในไฟล์. macs ของคุณ: (x-focus-frame nil).

โปรดทราบว่าสิ่งต่อไปนี้ใช้ไม่ได้สำหรับฉัน - มันไม่เริ่ม Emacs ในไดเร็กทอรีที่ระบุในบรรทัดคำสั่ง (เช่นemacs .)

# NOT RECOMMENDED
#!/bin/sh
/Applications/Emacs.app/Contents/MacOS/Emacs "$@" &

1
วิธีนี้แก้ไขปัญหาเกี่ยวกับ OSX (อาจเริ่มต้นด้วย 10.9 Mavericks) เมื่อวันที่ 10.9 วิธีการ "ไม่แนะนำ" ล้มเหลวโดยที่อย่างน้อย 10.6 ไม่แนะนำให้ซิงค์เชลล์ $ PWD และ Emacs (pwd) คำตอบของ David อาจอยู่ที่อื่น แต่คุณจะทำให้เครื่องมือค้นหาเข้าใจได้อย่างไร: "pwd not pwd"?
infogizmo

ตัวอย่างข้อมูลทั้งสองในคำตอบนี้ไม่ได้เริ่ม emac ในไดเรกทอรีที่ถูกต้องเมื่อฉันทดสอบบน macOS 10.15.6 และ Emacs 26.2
gsingh2011

5

ฉันถือว่าคุณ:

  • เริ่มต้น emacs daemon เมื่อล็อกอิน
  • มี (เริ่มเซิร์ฟเวอร์) ใน. emac ของคุณ
  • อย่ารังเกียจที่จะมีสำเนา emac แยกต่างหากจำนวนมากทำงานอยู่

ถ้าเป็นเช่นนั้นฉันคิดว่าสิ่งนี้ตรงตามเกณฑ์เดิม 4 ข้อบวกอีกหนึ่งข้อ:

  1. หน้าต่าง emacs จะเปิดขึ้นที่หน้าหน้าต่างเทอร์มินัลของฉัน

มันจะเปิดไปที่เบื้องหน้าเสมอ (พร้อม x-focus-frame)

  1. การพิมพ์ "emacs" จะเป็นการเปิดหน้าต่าง GUI Emacs การค้นหาไฟล์ในหน้าต่างนั้นจะเป็นค่าเริ่มต้นในการค้นหาในไดเร็กทอรีจากจุดที่ฉันเริ่ม Emacs

จะเปิดหน้าต่าง emacs ที่มีอยู่ในโหมด dired

  1. การพิมพ์ "emacs foo.txt" เมื่อมี foo.txt จะเปิดหน้าต่าง GUI Emacs ที่โหลด foo.txt

หาก emac ทำงานอยู่แล้วและมีเซิร์ฟเวอร์จะเปิดขึ้นในหน้าต่างที่มีอยู่และมาที่ส่วนหน้า

  1. การพิมพ์ "emacs foo.txt" เมื่อไม่มี foo.txt จะเปิดหน้าต่าง GUI Emacs ที่มีบัฟเฟอร์ข้อความว่างชื่อ "foo.txt" การทำ ^ X ^ S ในบัฟเฟอร์นั้นจะบันทึก foo.txt ในไดเร็กทอรีจากจุดที่ฉันเริ่ม Emacs

แก้ไข.

หนึ่งพิเศษ:

การควบคุมกลับไปที่เซสชันเทอร์มินัลทันทีหลังจากพิมพ์คำสั่ง

~ / bin / emacs

#!/bin/bash
EMACSPATH=/Applications/Emacs.app/Contents/MacOS

# Check if an emacs server is available 
# (by checking to see if it will evaluate a lisp statement)

if ! (${EMACSPATH}/bin/emacsclient --eval "t"  2> /dev/null > /dev/null )
then
    # There is no server available so,
    # Start Emacs.app detached from the terminal 
    # and change Emac's directory to PWD

    nohup ${EMACSPATH}/Emacs --chdir "${PWD}" "${@}" 2>&1 > /dev/null &
else
    # The emacs server is available so use emacsclient

    if [ -z "${@}" ]
    then
        # There are no arguments, so
        # tell emacs to open a new window

        ${EMACSPATH}/bin/emacsclient --eval "(list-directory \"${PWD}\")"
    else    
        # There are arguments, so
        # tell emacs to open them

        ${EMACSPATH}/bin/emacsclient --no-wait "${@}"
    fi

    # Bring emacs to the foreground

    ${EMACSPATH}/bin/emacsclient --eval "(x-focus-frame nil)"
fi

สุดยอด! ดูเหมือนว่า args และ no-args ของคุณจะเปลี่ยนไป
eriksensei


4

วิธีแก้ง่ายๆ ...

มีการโพสต์วิธีแก้ไขปัญหาที่ซับซ้อนมากไว้ที่นี่ นั่นยุติธรรมเพราะดูเหมือนว่าไม่สำคัญ

อย่างไรก็ตามวิธีนี้ใช้ได้ผลดีกับฉันจริงๆ

ec() {
  emacsclient -n $@ 2> /dev/null
  if [[ $? == 1 ]]; then
    open -a Emacs.app  -- $@
  fi
}

การใช้งาน

ec file [...]

มาแกะกล่องกันว่าเกิดอะไรขึ้น:

  1. ส่งผ่านecข้อโต้แย้งทั้งหมดไปยัง emacsclient และอย่า ( -n) รอ emacs ก่อนดำเนินการต่อ
    1. หาก Emac ทำงานอยู่แล้วเราก็ดำเนินการเสร็จสิ้นและคุณกำลังแก้ไข
  2. กลืนข้อความแสดงข้อผิดพลาดที่โพสต์โดย emacsclient เมื่อไม่มีอีแมคทำงานอยู่ ( 2> /dev/null)
  3. จัดการรหัสทางออกด้วยตนเอง1( [[ $? == 1 ]])
    1. เปิด Emacs.app และส่งอาร์กิวเมนต์ของไฟล์ไปที่มัน (เส้นทางจะถูกเปิดอย่างถูกต้อง)
    2. คุณทำเสร็จแล้วและ Emacs ได้เปิดไฟล์ของคุณ

3

เพิ่งสร้าง emacs ด้วยตัวจัดการแพ็คเกจ homebrew ตามคู่มือนี้: http://www.emacswiki.org/emacs/EmacsForMacOS พร้อมการติดตั้ง brew --cocoa emacs หลังจากนั้นควรเปิดเวอร์ชัน. app เพื่อรับ gui ซึ่งในกรณีของฉันคือ /usr/local/Cellar/emacs/24.3/Emacs.app/Contents/MacOS/Emacs


- โกโก้เลิกใช้แล้ว ใช้ - กับโกโก้แทน!
Erwin Rooijakkers

3

ปรับปรุงเพิ่มเติมเกี่ยวกับการตอบสนองของ David James งานต่อไปนี้สำหรับฉัน:

ตามคำแนะนำในการเปิดไฟล์จากเทอร์มินัลที่http://www.emacswiki.org/emacs/EmacsForMacOS#toc20

open -a /Applications/Emacs.app <file-name>

เมื่อรวมสิ่งนี้เข้ากับการตอบสนองของ David Jame ฉันได้สร้างemax bash script ต่อไปนี้และวางไว้ในเส้นทางของฉันที่~ / bin

#!/bin/bash
(open -a /Applications/Emacs.app "$@") &

Caveat : เพื่อให้ emacs เปิดไดเร็กทอรีปัจจุบันในโหมดDired by nameคุณต้องใช้

emax .

สิ่งแวดล้อม:

  • OS X Yosemite เวอร์ชัน 10.10.2
  • GNU Emacs 24.4.2 (x86_64-apple-darwin14.0.0, NS apple-appkit-1343.14) ของ 2014-11-13

สิ่งนี้ใช้ได้กับไฟล์ที่มีอยู่เท่านั้น แต่จะไม่สร้างขึ้นมาใหม่หากไม่มี
Stíofán

ฉันใช้ macOS 10.15 (Catalina) และดูเหมือนว่าจะใช้งานได้ในครั้งแรก (เมื่อ Emacs ยังไม่ได้เปิด) แต่ไม่ทำงานในครั้งที่สอง (เมื่อเปิดหน้าต่าง Emacs อยู่แล้ว) คุณรู้วิธีแก้ไขปัญหานี้หรือไม่?
user102008

1

คำตอบอื่น ๆ ที่นี่ไม่ได้ผลสำหรับฉัน โดยเฉพาะอย่างยิ่งในเครื่องของฉันสคริปต์ทุบตี

#!/bin/sh
/Applications/Emacs.app/Contents/MacOS/Emacs "$@" 

เปิด emacs ในโฮมไดเร็กทอรีเสมอ เพื่อให้เปิดในไดเร็กทอรีการทำงานปัจจุบันฉันต้องทำ

#!/bin/sh
/Applications/Emacs.app/Contents/MacOS/Emacs "$PWD/$@"

แทน.


1
การสร้าง / ติดตั้งเฉพาะของฉันไม่มีปัญหานั้น แต่มีปัญหากับโซลูชันของคุณ หากคุณพยายามเปิดไฟล์มากกว่าหนึ่งไฟล์ไฟล์แรกเท่านั้นที่จะขยายไปยังไดเร็กทอรี PWD ส่วนที่เหลือจะไม่มีคำนำหน้าเส้นทาง $ PWD
kmarsh

0

คอมไพล์ Emacs ตามขั้นตอนต่อไปนี้:

./configure --with-x --prefix=/usr
make
sudo make install

และเสร็จแล้ว! อาจช่วยในการดาวน์โหลดและติดตั้ง XQuartz แต่นั่นเป็นเพียงความเห็นของฉัน


0

นี่คือสคริปต์ของฉันสำหรับ open emacs / emacsclient บน osx

#!/bin/bash

# Ensure (server-start) is added in your emacs init script.

EMACS=/Applications/MacPorts/Emacs.app/Contents/MacOS/Emacs
EMACSCLIENT=/Applications/Macports/Emacs.app/\
Contents/MacOS/bin/emacsclient

# test if client already exsit.
$EMACSCLIENT -e "(frames-on-display-list)" &>/dev/null

# use emacsclient to connect existing server.
if [ $? -eq 0 ]; then
    $EMACSCLIENT -n "$@"
# open emacs.app instead.
else
    `$EMACS "$@"` &
fi

0

จากทั้งหมดข้างต้นเมื่อใช้ "เปิด" - ตรวจสอบให้แน่ใจว่าคุณใช้ตัวเลือก "--args"

อย่าทำอย่างนี้:

alias emacs='open -a /Applications/Emacs.app $1'

แทนสิ่งนี้:

alias emacs='open -a /Applications/Emacs.app --args $1'

--argsป้องกันตัวเลือก "เปิด" จากการบริโภคตัวเลือกต่างๆที่มีไว้สำหรับ Emacs


ด้วยเหตุผลบางประการเมื่อฉันทดสอบสิ่งนี้บน macOS 10.15.6 และ Emacs 26.2 ไดเร็กทอรีการทำงานของ emacs ถูกตั้งค่าเป็นโฮมไดเร็กทอรีของฉันซึ่งหมายความว่าฉันไม่สามารถเปิดไฟล์โดยใช้พา ธ สัมพัทธ์ได้ สิ่งนี้ได้แก้ไขปัญหาของไฟล์ที่ไม่มีอยู่จริงที่เปิดอยู่
gsingh2011

0

คำตอบด้านบนเป็นสิ่งที่ดี แต่ผมอยาก emacs กระบวนการทำงานในพื้นหลังเพื่อให้ฉันยังคงสามารถใช้เปลือกของฉัน คำตอบนี้ดูเหมือนจะทำในสิ่งที่ฉันต้องการ แต่ไม่ได้เริ่มต้น emac ในไดเรกทอรีที่ถูกต้องซึ่งหมายความว่าจำเป็นต้องมีเส้นทางที่แน่นอน (หรือแฮ็กเพื่อต่อท้ายpwdเส้นทางที่ใช้ไม่ได้ในทุกกรณี) นอกจากนี้การใช้เพียงแค่&หมายความว่าถ้าฉันฆ่าเทอร์มินัลอีแมคก็จะถูกฆ่าเช่นกัน

ฉันตัดสินใจที่จะใช้screenและฟังก์ชั่นทุบตีและวิธีแก้ปัญหาต่อไปนี้ใช้ได้กับฉันบน macOS 10.15.6 และ emacs 26.2 ที่ติดตั้งด้วยbrew:

function emacs() {
    screen -d -m /Applications/Emacs.app/Contents/MacOS/Emacs "$@"
}

คำถามได้ร้องขอ Emacs อย่างชัดเจนในหน้าต่าง GUI และสิ่งนี้จะเปิด Emacs ในเซสชันเทอร์มินัล
Johan Walles

@JohanWalles สิ่งนี้จะเปิด Emacs ในหน้าต่าง GUI
gsingh2011

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