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!
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.
find-filedan kemudian mengaturdebug-on-errorke t dan memeriksa jejak stack untuk beberapa petunjuk tentang bagaimana Emacs sedang dipanggil. Menambahkan kesalahanfind-filedapat sesederhana menyalin definisi fungsi ke buffer awal lisp dan menambahkan panggilan keerrordalamnya (mis(error "cause stack trace"). TIDAK PERNAH MENGUBAH FILE SUMBER UNTUKfind-file- selalu lakukan ini di bufer awal!