Thiết lập cơ bản của máy chủ Emacs trong OSX


9

Gần đây tôi đã mua chiếc máy Mac đầu tiên của mình sau một thập kỷ và đang trong quá trình định cấu hình nó. Tôi là người dùng Emacs và đã xác định tôi chỉ muốn Emacs thông thường không phải Aquamac để tôi có thể sử dụng cấu hình hiện tại của mình từ các hệ điều hành khác. Tôi đã thử làm theo rất nhiều cách tôi đã tìm thấy trên mạng (như cái này , cái nàycái này từ trang web mà tôi đã tải xuống Emacs ), và đã thử kết hợp các mảnh theo bất kỳ cách nào, nhưng chưa bao giờ đưa mọi thứ vào trạng thái thậm chí tiếp cận những gì tôi đã từng / hy vọng:

  1. Một daemon Emacs bắt đầu chạy hoặc khi khởi động hoặc ngay khi tôi cần ; hoặc là tốt. Bất kỳ khung Emacs mới nào cũng được hỗ trợ bởi cùng một máy chủ.
  2. Khi tôi mở tệp văn bản từ Finder, tệp sẽ mở trong Emacs, trong khung đồ họa hiện có nếu có thể.
  3. Nếu tôi chạy Emacs.app, hệ thống sẽ sử dụng lại trình nền emacs đang chạy trong nền thay vì bắt đầu một phiên bản mới và mở một cửa sổ mới trên đó. ( mũ chóp )
  4. Khi tôi chạy Emacs từ một thiết bị đầu cuối, thiết bị đầu cuối sẽ tiến hành công việc của nó mà không cần đợi tôi kết thúc với Emacs (trừ khi tôi sử dụng '-nw')
  5. AFAIK không có điểm nào trong các hoạt động được mô tả ở trên nếu Emacs kết thúc ở trạng thái ("chế độ chỉnh sửa máy chủ?") Trong đó chờ tôi gõ C-x #, mặc dù tôi không hiểu sâu về thao tác này.
  6. (Tôi sẽ coi đây là một phần thưởng) Có một số cách để tôi gọi Emacs từ một thiết bị đầu cuối để Emacs sử dụng lại một khung hiện có nếu có thể.

Làm thế nào tôi có thể cấu hình Emacs để hành xử như thế này?

Tôi đặc biệt bối rối khi yêu cầu Finder mở mọi thứ trong Emacs theo cách tôi muốn (# 2), vì các hướng dẫn mà tôi tìm thấy thường tạo ra một số bí danh, Applescripts, bash script, v.v. và tôi không chắc mà tôi muốn nói với Finder để sử dụng để mở tệp văn bản.

Cảm ơn!

A. @lawlist hỏi: "Có phải khung mới được mở theo mặc định khi bạn mở tệp mới từ thiết bị đầu cuối mặc dù đã có khung hiện có không?" Câu trả lời là nếu tôi khởi động một máy chủ khi khởi động như được mô tả ở đây , mở một khung và sau đó mở một tệp bằng cách gõ /Applications/Emacs.app/Contents/MacOS/bin/emacsclient -n <whatever>, tôi có thể lấy tệp để mở trong một khung hiện có. Nếu không có khung hiện đang mở, tôi phải sử dụng "-nc" hoặc khi tôi cố mở tệp thì không có gì xảy ra.

B. @lawlist hỏi: "Bạn có muốn trình nền chạy khi đăng nhập không, hoặc sẽ đủ để tải Emacs thủ công sau khi đăng nhập?" Chạy bằng tay sẽ ổn thôi.


Bạn có thể đánh số chúng không, 1, 2, 3, 4, 5, 6 và có thể 7 và 8. Ngoài ra, một khung mới được mở theo mặc định khi bạn mở tệp mới từ thiết bị đầu cuối mặc dù đã có khung hiện có ? Tôi biết một số câu trả lời, nhưng không phải tất cả trong số chúng - vì vậy những con số cho các câu hỏi sẽ hữu ích. Bạn có muốn daemon chạy khi đăng nhập, hoặc nó sẽ đủ để tải Emacs thủ công sau khi đăng nhập?
luật

@Lauri Ranta có một câu trả lời hay. M-x server-startsẽ tự khởi động máy chủ để emacsclientcó thể giao tiếp với nó. Tôi đã đặt (server-start)trong init.eltệp của mình thay vì sử dụng trình nền khi đăng nhập - tuy nhiên, nhiều người thích tùy chọn đăng nhập daemon. Và tất nhiên, .emacstập tin sẽ là một nơi thích hợp cho (server-start).
luật

Liên quan đến việc mở các tệp từ Finder, tôi giả sử rằng bạn vượt xa giai đoạn cần một cái gì đó như thế này: dummies.com/how-to/content/ Lỗi Vì vậy, giả sử rằng điều đó không xảy ra, thì có lẽ bạn sẽ đi sẽ ổn với ns-find-file- được kích hoạt tự động khi một tệp được liên kết với Emacs.app. Chức năng tệp chặn của tôi trong các liên kết ở trên cũng sửa đổi ns-find-filenếu đó là điều mà bạn quan tâm. Tất nhiên, bạn cần xây dựng Emacs --with-ns.
luật

Câu trả lời:


10

Để làm cho Emacs.app mở tệp trong khung hiện có thay vì khung mới, hãy thêm (setq ns-pop-up-frames nil)vào tệp cấu hình như thế nào ~/.emacs.

Bạn có thể mở một tập tin từ một thiết bị đầu cuối với open -a emacs filehoặc emacsclient -n file. Nếu Emacs.app không mở nhưng có một Emacs --daemonquy trình, vì một số lý do emacsclient -n filekhông hoạt động nhưng emacsclient -nc filekhông.

Đảm bảo bạn sử dụng emacsclienttệp nhị phân đi kèm với phiên bản Emacs bạn sử dụng, như /Applications/Emacs.app/Contents/MacOS/bin/emacsclienthoặc /usr/local/bin/emacsclientnếu bạn đã cài đặt Emacs với Homebrew.

Để bắt đầu một máy chủ Emacs khi đăng nhập, ví dụ: hãy lưu nguyên bản này dưới dạng ~/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 được tải tự động vào lần đăng nhập tiếp theo, nhưng bạn có thể tải nó ngay lập tức bằng cách chạy launchctl load ~/Library/LaunchAgents/my.emacsdaemon.plist.

Chỉnh sửa: Tôi vẫn không biết tại sao mọi người lại liên kết các loại tệp với ứng dụng AppleScript thay vì chỉ Emacs.app. Kịch bản trong câu trả lời của kuzzooroo cũng có thể được viết dưới dạng kịch bản shell:

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

Bạn có thể sử dụng Thú mỏ vịt để lưu tập lệnh dưới dạng một ứng dụng:

Tôi mới bắt đầu sử dụng Emacs, nhưng tôi có một thiết lập hoàn toàn khác. Tôi đã tạo ứng dụng Emacs của riêng mình bằng cách tạo một bản sao iTerm.app, thay đổi CFBundleIdentifier trong Info.plist để ứng dụng sử dụng tệp ưu tiên khác và đặt lệnh mặc định thành /usr/local/bin/emacs. Tôi đã thêm (server-start)vào ~/.emacsvà tôi mở ứng dụng tùy chỉnh Emacs lúc đăng nhập. Tôi đã sử dụng Platypus để tạo một ứng dụng chạy emacsclient -n "$@";open -b my.emacsvà tôi đã biến nó thành ứng dụng mặc định cho các tệp văn bản.


2

Giải pháp của Lauri kết hợp với các đề xuất từ ​​các ý kiến ​​đã giải quyết phần lớn các vấn đề của tôi. Tôi đã dán bên dưới một số Applescript mà tôi đã ghép lại với nhau từ những thứ tôi tìm thấy trên mạng. Kịch bản giúp làm mờ một số nếp nhăn còn lại, ví dụ, hành vi của nó sẽ tốt hơn một chút nếu không có khung Emacs hiện tại.

EDIT: mục đích của tập lệnh là được liên kết với các tệp .txt trong 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
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.