Làm thế nào để khởi chạy GUI Emacs từ dòng lệnh trong OSX?


91

Làm cách nào để khởi chạy GUI Emacs từ dòng lệnh trong OSX?

Tôi đã tải xuống và cài đặt Emacs từ http://emacsformacosx.com/ .

Tôi sẽ chấp nhận một câu trả lời đáp ứng tất cả các tiêu chí sau:

  1. Cửa sổ emacs mở ra trước cửa sổ thiết bị đầu cuối của tôi.
  2. Nhập "emacs" sẽ khởi chạy cửa sổ GUI Emacs. Việc tìm kiếm các tệp trong cửa sổ đó sẽ được mặc định là tìm kiếm trong thư mục từ nơi tôi bắt đầu Emacs.
  3. Nhập "emacs foo.txt" khi foo.txt tồn tại sẽ khởi chạy cửa sổ GUI Emacs với foo.txt được tải.
  4. Nhập "emacs foo.txt" khi foo.txt không tồn tại sẽ khởi chạy cửa sổ GUI Emacs với bộ đệm văn bản trống có tên "foo.txt". Thực hiện ^ X ^ S trong bộ đệm đó sẽ lưu foo.txt trong thư mục từ nơi tôi bắt đầu Emacs.

Tiêu chí nào trong số đó không được đáp ứng bằng cách nhập 'emacs' tại dấu nhắc đầu cuối? Yêu cầu của bạn mô tả hành vi mặc định trên Linux. Tôi đã không sử dụng máy Mac trong một thời gian, nhưng tôi nghĩ mẹo chỉ là tìm chương trình phù hợp để thực thi - có thể là emacs.app?
Tyler

8
Tyler, xuất thân từ nền tảng Linux, tôi luôn đồng hành cùng bạn; chỉ cần gõ "emacs" vào lời nhắc là tất cả những gì tôi cần làm. Tuy nhiên, làm điều đó trên OSX sẽ khởi chạy chế độ văn bản Emacs trong cửa sổ đầu cuối (do đó không đạt tiêu chí 1) và đó không phải là điều tôi muốn.
Johan Walles

1
Johan - bạn đã tìm ra giải pháp trong lúc này chưa? Tôi đang đấu tranh với những vấn đề tương tự và nghĩ đến việc bắt đầu kiếm tiền thưởng. Đặc biệt gây phiền nhiễu là gọi emacs (và không phải là Emacs.app) từ dòng lệnh mở một cửa sổ ở chế độ nền ...
alexurba

1
@DougHarris Yêu cầu của tôi khớp với thực tế trên bất kỳ bản phân phối Linux nào, đó là nguồn gốc của chúng. Tôi rất vui vì bạn đã tìm thấy một quy trình làm việc phù hợp với mình. Chúc mừng!
Johan Walles

2
Tôi không biết liệu nó có hoạt động trên OSX hay không nhưng bạn có thể thử: emacsclient -c -a "" "$@"command
jfs

Câu trả lời:


113

Gọi tập lệnh sau là "emacs" và đặt nó vào PATHnơi nào đó của bạn :

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

Điều đó bao gồm # 2, # 3 và # 4.

Đối với số 1, hãy đặt cái này ở đâu đó trong tệp .emacs của bạn:

(x-focus-frame nil)

Trang emacsformacosx.com hiện có trang Hướng dẫn , là nơi xuất phát đoạn mã hàng đầu. Có thêm thông tin về việc chạy emacsclientvà kết nối Emacs với git mergetool.


1
Cảm ơn David, bạn quy tắc!
Johan Walles

1
Hoạt động tuyệt vời. Tiền thưởng sắp tới.
Tamzin Blake,

2
Trên Mavericks nếu tôi đang ở trong thư mục ~/foovà muốn mở, bar.txttôi gõ gmacs bar.txtnhưng nó tạo một tệp mới ~/bar.txtthay vì mở ~foo/bar.txt. Tôi có làm điều gì sai?
Daniel Compton

2
Tệp .emacs ở đâu?
Bren

1
Bạn không thể thêm (x-focus-frame nil) ở bất kỳ đâu, nó phải nằm trong biểu thức (custom-set-variable), mà emacs sẽ tạo cho bạn khi bạn đặt bất kỳ thứ gì thông qua tùy chỉnh. Chỉ cần tùy chỉnh một cái gì đó từ thanh menu, chẳng hạn như bật "con trỏ nhấp nháy" (sau đó tắt nếu bạn không thích) và phần đó sẽ được tạo trong .emac của bạn. Ngoài ra, điều này thậm chí còn được thử nghiệm? Tôi không chắc emacs trên Cocoa thậm chí sẽ tôn trọng cài đặt này.
Chuck Adams

70

Trong shell của bạn, đặt bí danh lệnh 'emacs' để trỏ đến ứng dụng OSX emacs

Trong trình bao của tôi (chạy bash mặc định), tôi có những thứ sau (trong .bashrc của tôi)

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

Sau đó, gõ emacs trên dòng lệnh sẽ khởi động ứng dụng emacs.

Tuy nhiên, tôi khuyên bạn nên mở một bản sao của emacs và chỉ cần duy trì và chạy nó. Nếu đúng như vậy và bạn muốn tải tệp vào bản sao hiện có của emacs, bạn có thể sử dụng emacsclient bằng cách đặt phần sau vào .bashrc của bạn:

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

Sau đó, thêm phần sau vào tệp .emacs của bạn để khởi động máy chủ emacs (máy chủ nhận các cuộc gọi emacsclient)

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

Sau đó, bạn có thể gõ

ec .bashrc

để tải một bản sao của .bashrc vào một phiên emacs hiện có!


4
Xin chào Chris! Câu trả lời đầu tiên của bạn không đạt tiêu chí 2 và 4. Câu trả lời thứ hai của bạn không đạt tiêu chí 2. Tôi đang tìm một giải pháp đáp ứng tất cả các tiêu chí được đánh số. Trân trọng / Johan
Johan Walles

3
Có vẻ như tất cả các vấn đề của bạn có thể được giải quyết nếu bạn chỉ sử dụng chính emacs để tải tệp, thay vì dựa vào dòng lệnh để khởi chạy một phiên bản mới mỗi lần. Tôi thường khởi động emacs vào đầu ngày của mình (nếu nó vẫn không chạy) và sử dụng nó để tải tệp, thay đổi thư mục, tạo tệp mới và bất kỳ thứ gì khác mà tôi muốn mà không cần chạm vào cửa sổ đầu cuối.
Chris McMahan

Tôi phải nói rằng, có một số câu hỏi trên trang web này giải quyết câu hỏi này, nhưng đây là câu hỏi duy nhất giải quyết đầy đủ vấn đề mở một tệp, một cách hùng hồn ngắn gọn.
tylerthemiler

3
@tylerthemiler, đâu là câu trả lời giải quyết đầy đủ vấn đề? Cả hai câu trả lời trong câu trả lời này đều không đạt tiêu chí 2 và câu trả lời đầu tiên cũng không đạt tiêu chí 4.
Johan Walles

5
Một chút khéo léo sẽ giúp bạn trả lời câu hỏi một cách lâu dài. Một chút Google cũng vậy.
duma

10

Điều này cải thiện câu trả lời của David Caldwell bằng cách khởi động Emacs trong nền:

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

Như đã nêu trong câu trả lời khác, điều này bao gồm # 2, # 3 và # 4. Đối với # 1, đặt một nơi nào đó trong tập tin emacs của bạn: (x-focus-frame nil).

Lưu ý rằng điều sau không hoạt động đối với tôi - nó không khởi động Emacs trong thư mục được chỉ định trên dòng lệnh (ví dụ emacs .:)

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

1
Điều này khắc phục sự cố với OSX (có thể bắt đầu với 10,9 Mavericks). Kể từ ngày 10.9, phương pháp "không được khuyến nghị" không thành công, trong đó ít nhất là 10,6, phương pháp không được khuyến nghị đã đồng bộ hóa shell $ PWD và Emacs (pwd). Câu trả lời của David có thể nằm ở chỗ khác, nhưng làm cách nào để các công cụ tìm kiếm hiểu được: "pwd not pwd"?
infogizmo

Cả hai đoạn mã trong câu trả lời này không bắt đầu emacs trong đúng thư mục khi tôi thử nghiệm trên macOS 10.15.6 và Emacs 26.2.
gsingh2011

5

Tôi cho rằng bạn cũng vậy:

  • Khởi động daemon emacs khi đăng nhập
  • Có (khởi động máy chủ) trong .emac của bạn
  • Đừng bận tâm khi có nhiều bản sao emac riêng biệt đang chạy

Nếu vậy, tôi nghĩ điều này đáp ứng bốn tiêu chí ban đầu, cộng với một tiêu chí nữa:

  1. Cửa sổ emacs mở ra trước cửa sổ thiết bị đầu cuối của tôi.

nó sẽ luôn mở ra tiền cảnh (với x-focus-frame).

  1. Nhập "emacs" sẽ khởi chạy cửa sổ GUI Emacs. Việc tìm kiếm các tệp trong cửa sổ đó sẽ được mặc định là tìm kiếm trong thư mục từ nơi tôi bắt đầu Emacs.

Nó sẽ mở một cửa sổ emacs hiện có ở chế độ dired.

  1. Nhập "emacs foo.txt" khi foo.txt tồn tại sẽ khởi chạy cửa sổ GUI Emacs với foo.txt được tải.

Nếu emacs đã chạy và có một máy chủ, thì nó sẽ mở trong cửa sổ hiện có và xuất hiện ở nền trước.

  1. Nhập "emacs foo.txt" khi foo.txt không tồn tại sẽ khởi chạy cửa sổ GUI Emacs với bộ đệm văn bản trống có tên "foo.txt". Thực hiện ^ X ^ S trong bộ đệm đó sẽ lưu foo.txt trong thư mục từ nơi tôi bắt đầu Emacs.

Chính xác.

Thêm một:

Điều khiển trở lại phiên đầu cuối ngay sau khi gõ lệnh.

~ / 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

Tuyệt vời! Có vẻ như chân của bạn và chân không có cổ được chuyển sang.
eriksensei


4

Giải pháp đơn giản ...

Rất nhiều giải pháp rất phức tạp cho vấn đề này được đăng ở đây. Đó là công bằng vì nó có vẻ không tầm thường.

Tuy nhiên, giải pháp này hoạt động thực sự tốt đối với tôi.

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

Sử dụng

ec file [...]

Hãy giải nén những gì đang xảy ra:

  1. chuyển tất cả các ecđối số cho emacsclient và không ( -n) đợi emacs trước khi tiếp tục.
    1. Nếu Emacs đã chạy, chúng tôi đã hoàn tất và bạn đang chỉnh sửa.
  2. nuốt thông báo lỗi do emacsclient đăng khi không có emacs nào chạy. ( 2> /dev/null)
  3. Xử lý thủ công mã thoát 1( [[ $? == 1 ]])
    1. mở Emacs.app và chuyển các đối số tệp cho nó (các đường dẫn sẽ được mở chính xác.)
    2. Bạn đã hoàn tất và Emacs đã mở tệp của bạn.

3

Chỉ cần xây dựng emacs với trình quản lý gói homebrew theo hướng dẫn này: http://www.emacswiki.org/emacs/EmacsForMacOS với cài đặt brew --cocoa emacs Sau đó, người ta nên khởi chạy phiên bản .app để tải gui, trong trường hợp của tôi là /usr/local/Cellar/emacs/24.3/Emacs.app/Contents/MacOS/Emacs


--cocoa không được dùng nữa; sử dụng --with-cacao thay thế!
Erwin Rooijakkers

3

Cải thiện hơn nữa phản ứng của David James, những điều sau đây phù hợp với tôi:

Theo hướng dẫn để mở tệp từ một thiết bị đầu cuối có tại http://www.emacswiki.org/emacs/EmacsForMacOS#toc20

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

kết hợp điều này với phản hồi của David Jame, tôi đã tạo tập lệnh bash emax sau đây và đặt nó vào đường dẫn của tôi tại ~ / bin

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

Lưu ý : để có được emacs để mở thư mục hiện tại ở chế độ Dired by name , bạn cần sử dụng

emax .

Môi trường:

  • Phiên bản OS X Yosemite 10.10.2
  • GNU Emacs 24.4.2 (x86_64-apple-darwin14.0.0, NS apple-appkit-1343.14) của 2014-11-13

Điều này chỉ hoạt động với một tệp hiện có, nó sẽ không tạo một tệp nếu không có
Stíofán.

Tôi đang sử dụng macOS 10.15 (Catalina) và có vẻ như điều này hoạt động lần đầu tiên (khi Emacs chưa mở), nhưng không hoạt động lần thứ hai (khi một cửa sổ Emacs đã được mở). Bạn có biết làm sao để sửa cái này không?
user102008

1

Các câu trả lời khác ở đây không hoàn toàn phù hợp với tôi. Đặc biệt, trên máy của tôi, tập lệnh bash

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

luôn mở emacs trong thư mục chính. Để mở nó trong thư mục làm việc hiện tại, tôi phải làm

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

thay thế.


1
Bản dựng / cài đặt cụ thể của tôi không có vấn đề đó, nhưng có vấn đề với giải pháp của bạn. Nếu bạn cố gắng mở nhiều hơn một tệp, chỉ tệp đầu tiên sẽ mở rộng đến thư mục PWD. Phần còn lại sẽ không có tiền tố đường dẫn $ PWD.
kmarsh

0

Biên dịch Emacs theo các bước sau:

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

Và bạn đã hoàn thành! Có thể hữu ích khi tải xuống và cài đặt XQuartz, nhưng đó chỉ là ý kiến ​​của tôi.


0

Đây là tập lệnh của tôi cho mở emacs / emacsclient trên 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

Trong tất cả các điều trên khi sử dụng "open" - hãy đảm bảo bạn sử dụng tùy chọn "--args"

Đừng làm điều này:

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

Thay vào đó:

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

các --argstùy chọn ngăn chặn "mở" từ tốn nhiều tùy chọn khác nhau dành cho Emacs.


Vì một số lý do, khi tôi kiểm tra điều này trên macOS 10.15.6 và Emacs 26.2, thư mục làm việc của emacs được đặt thành thư mục chính của tôi, có nghĩa là tôi không thể mở tệp bằng đường dẫn tương đối. Tuy nhiên, điều này đã khắc phục sự cố của các tệp không tồn tại đang mở.
gsingh2011

0

Các đầu câu trả lời là tốt, nhưng tôi muốn các emacs xử lý để chạy ở chế độ nền nên tôi vẫn có thể sử dụng vỏ của tôi. Câu trả lời này dường như thực hiện những gì tôi muốn, nhưng không bắt đầu emacs trong đúng thư mục, có nghĩa là bắt buộc phải có các đường dẫn tuyệt đối (hoặc hack để nối pwdvào các đường dẫn không hoạt động trong mọi trường hợp). Hơn nữa, sử dụng đơn giản &có nghĩa là nếu tôi giết thiết bị đầu cuối, emacs cũng sẽ bị giết.

Tôi đã quyết định sử dụng screenvà một hàm bash và giải pháp sau phù hợp với tôi trên macOS 10.15.6 và emacs 26.2 được cài đặt với brew:

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

Câu hỏi đã yêu cầu Emacs một cách rõ ràng trong cửa sổ GUI và điều này sẽ mở Emacs trong một phiên đầu cuối.
Johan Walles

@JohanWalles, thao tác này sẽ mở Emacs trong cửa sổ GUI.
gsingh2011
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.