Emacs mở tập tin trong một khung mới khi được mở bằng


20

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!


Tôi không biết gì về OSX vì vậy tôi không thể cung cấp bất cứ điều gì cụ thể. Tuy nhiên, nếu tôi gỡ lỗi này, tôi sẽ ném một số lỗi cú pháp find-filevà sau đó đặt debug-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ỗi find-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ọi errorvào đó (ví dụ: (error "cause stack trace")KHÔNG BAO GIỜ THAY ĐỔI FILE NGUỒN CHO find-file- luôn luôn làm điều này trong một trò chơi cào!
Joe Casadonte

@Joe Cảm ơn! Đó là một ý tưởng khá hay, tôi sẽ ghi nhớ nó cho tương lai. Tôi thực sự đã kết thúc cố gắng sử dụng 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.
michiakig

Câu trả lời:


26

Câu trả lời ở đây: biến emacs thành "open with" trong khung ban đầu

Đó là thay đổi cài đặt mặc định trong các phiên bản mới hơn của emacs. Thêm vào:

(setq ns-pop-up-frames nil)

vào tập tin .emacs.

Rất vui vì đã tìm thấy điều này.


Điều này rất hữu ích! Cùng với một bí danh open -a /Applications/Emacs.app $1dường như hoạt động tốt! Lưu ý rằng tôi khởi động máy chủ trong init của mình, để có sẵn emacs cho git.
Dror
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.