Emacs membuka file dalam bingkai baru ketika dibuka dengan "open -a"

20

Saya ingin dapat memanggil Emacs dari baris perintah, dan memulai Emacs grafis jika tidak berjalan atau mengunjungi file dalam Emacs yang sudah berjalan. Saya mencoba melakukan ini dengan emacsclientyang saya tahu adalah cara yang "benar" untuk melakukan ini, tapi saya punya banyak masalah dengan itu pada OS X, itu akan crash secara acak, atau emacs --daemonproses akan menggantung selama mematikan atau me-reboot mesin, dan serpihan umum. Walaupun saya ingin membuatnya bekerja, saat ini open -asebenarnya bekerja jauh lebih baik, kecuali untuk masalah yang akan saya uraikan di bawah ini:

Gunakan open -aseperti ini:

$ open -a Emacs file.txt

akan memulai Emacs jika tidak berjalan, dan kunjungi file. Tetapi jika saya melakukan ini ketika buffer saat ini bukan *scratch*file dibuka dalam bingkai baru (yaitu jendela sistem baru).

Berikut ini contoh sesi:

$ open -a Emacs file.txt

Ini memulai Emacs dan membuka file.txt, jadi ada satu frame dengan buffer ini di dalamnya. Jika saya beralih ke *scratch*buffer, dan lakukan ini:

$ open -a Emacs file1.txt

Ini membuka file ini dalam bingkai yang sama. Sekarang ada satu frame dengan file ini terbuka, dan jika saya melakukan ini:

$ open -a Emacs file2.txt 

Ini membuka bingkai baru, menghasilkan dua bingkai terbuka sekaligus.

Saya sudah mencoba mengutak-atik baris perintah ke Emacs menggunakan --argssakelar open, tetapi ini sepertinya tidak berfungsi untuk panggilan selanjutnya, misalnya:

$ open -a Emacs --args --eval='(print "foo")'
$ open -a Emacs --args --eval='(print "bar")'

Ini hanya mencetak "foo" di buffer pesan ... yang kedua kalinya Emacs dibawa ke latar depan tetapi tidak ada pesan yang dicetak.

Saya tidak yakin bagaimana openberkomunikasi dengan aplikasi yang sudah berjalan, apakah ada yang tahu bagaimana saya bisa mengetahuinya? Atau adakah cara untuk mendapatkan log yang lebih terperinci tentang apa yang terjadi selain Messagesbuffer? Tidak ada yang menarik yang dicetak ke buffer itu selama sesi di atas, jadi saya tidak tahu bagaimana saya bisa meretas beberapa Emacs Lisp untuk melakukan apa yang saya inginkan ...

Terima kasih!

michiakig
sumber
Saya tidak tahu apa-apa tentang OSX jadi saya tidak bisa memberikan apa pun yang konkret. Namun, jika saya melakukan debug ini, saya akan melempar beberapa kesalahan sintaks ke dalam find-filedan kemudian mengatur debug-on-errorke t dan memeriksa jejak stack untuk beberapa petunjuk tentang bagaimana Emacs sedang dipanggil. Menambahkan kesalahan find-filedapat sesederhana menyalin definisi fungsi ke buffer awal lisp dan menambahkan panggilan ke errordalamnya (mis (error "cause stack trace"). TIDAK PERNAH MENGUBAH FILE SUMBER UNTUK find-file- selalu lakukan ini di bufer awal!
Joe Casadonte
@ Jo, terima kasih! Itu ide yang cukup bagus, saya akan mengingatnya untuk masa depan. Saya akhirnya mencoba untuk menggunakan emacsclientlagi, dan memulainya dengan (server-start)saya init.eltampaknya bekerja lebih baik daripada emacs --daemonsaat boot, itulah yang saya coba pertama kali saya coba emacsclient.
michiakig

Jawaban:

26

Jawabannya ada di sini: variabel emacs untuk "dibuka dengan" dalam bingkai asli

Ini perubahan ke pengaturan default di versi emacs yang lebih baru. Menambahkan:

(setq ns-pop-up-frames nil)

ke file .emacs.

Sangat senang telah menemukan ini.

Colin
sumber
Ini sangat membantu! Bersama dengan alias open -a /Applications/Emacs.app $1hal-hal sepertinya bekerja dengan baik! Perhatikan bahwa saya memulai server di init saya, untuk memiliki emacs tersedia untuk git misalnya.
Dror