Tôi muốn có thể gọi Emacs từ dòng lệnh và bắt đầu Emacs đồ họa nếu nó không chạy hoặc truy cập một tệp trong Emacs đã chạy. Tôi đã cố gắng làm điều này emacsclientmà tôi biết là cách "đúng" để làm điều này, nhưng tôi đã gặp nhiều vấn đề với nó trên OS X, nó sẽ bị sập ngẫu nhiên, hoặc emacs --daemonquá trình sẽ bị treo trong khi tắt hoặc khởi động lại máy, và flakiness chung. Mặc dù tôi muốn làm cho nó hoạt động, nhưng hiện tại open -athực sự hoạt động tốt hơn nhiều, ngoại trừ vấn đề này tôi sẽ mô tả dưới đây:
Sử dụng open -anhư thế này:
$ open -a Emacs file.txt
sẽ khởi động Emacs nếu nó không chạy và truy cập tệp. Nhưng nếu tôi làm điều này khi bộ đệm hiện tại không phải *scratch*là tệp được mở trong một khung mới (tức là một cửa sổ hệ thống mới).
Đây là một phiên ví dụ:
$ open -a Emacs file.txt
Điều này khởi động Emacs và mở file.txt, vì vậy có một khung duy nhất có bộ đệm này trong đó. Nếu tôi chuyển sang *scratch*bộ đệm, và làm điều này:
$ open -a Emacs file1.txt
Nó mở tập tin này trong cùng một khung. Bây giờ có một khung duy nhất với tệp này mở và nếu tôi làm điều này:
$ open -a Emacs file2.txt
Nó mở một khung mới, dẫn đến hai khung hình mở cùng một lúc.
Tôi đã thử đấu tranh với dòng lệnh lập luận với Emacs bằng cách sử dụng --argschuyển đổi sang open, nhưng điều này dường như không hoạt động cho các cuộc gọi tiếp theo, ví dụ:
$ open -a Emacs --args --eval='(print "foo")'
$ open -a Emacs --args --eval='(print "bar")'
Điều này chỉ in "foo" trong bộ đệm tin nhắn ... lần thứ hai Emacs chỉ được đưa lên nền trước nhưng không có tin nhắn nào được in.
Tôi không chắc cách opengiao tiếp với các ứng dụng đang chạy, có ai biết làm thế nào tôi có thể tìm ra không? Hoặc có cách nào đó để có được một bản ghi chi tiết hơn về những gì đang diễn ra so với Messagesbộ đệm? Không có gì thú vị được in vào bộ đệm đó trong phiên ở trên, vì vậy tôi không biết làm thế nào tôi có thể hack một số Emacs Lisp để làm những gì tôi muốn ...
Cảm ơn!
emacsclientmột lần nữa, và bắt đầu nó bằng (server-start)trong tôi init.eldường như được làm việc tốt hơn so với emacs --daemonlúc khởi động lên, đó là những gì tôi đã cố gắng lần đầu tiên tôi đã cố gắng emacsclient.
find-filevà sau đó đặtdebug-on-errorthành t và kiểm tra dấu vết ngăn xếp cho một số manh mối về cách Emacs đang được gọi. Việc thêm một lỗifind-filecó thể đơn giản như sao chép định nghĩa hàm vào bộ đệm cào và thêm một cuộc gọierrorvào đó (ví dụ:(error "cause stack trace")KHÔNG BAO GIỜ THAY ĐỔI FILE NGUỒN CHOfind-file- luôn luôn làm điều này trong một trò chơi cào!