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 emacsclient
mà 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 --daemon
quá 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 -a
thự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 -a
như 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 --args
chuyể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 open
giao 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 Messages
bộ đệ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!
emacsclient
một lần nữa, và bắt đầu nó bằng (server-start)
trong tôi init.el
dường như được làm việc tốt hơn so với emacs --daemon
lú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-file
và sau đó đặtdebug-on-error
thà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-file
có 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ọierror
và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!