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 emacsclient
yang 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 --daemon
proses akan menggantung selama mematikan atau me-reboot mesin, dan serpihan umum. Walaupun saya ingin membuatnya bekerja, saat ini open -a
sebenarnya bekerja jauh lebih baik, kecuali untuk masalah yang akan saya uraikan di bawah ini:
Gunakan open -a
seperti 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 --args
sakelar 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 open
berkomunikasi 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 Messages
buffer? 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!
find-file
dan kemudian mengaturdebug-on-error
ke t dan memeriksa jejak stack untuk beberapa petunjuk tentang bagaimana Emacs sedang dipanggil. Menambahkan kesalahanfind-file
dapat sesederhana menyalin definisi fungsi ke buffer awal lisp dan menambahkan panggilan keerror
dalamnya (mis(error "cause stack trace")
. TIDAK PERNAH MENGUBAH FILE SUMBER UNTUKfind-file
- selalu lakukan ini di bufer awal!emacsclient
lagi, dan memulainya dengan(server-start)
sayainit.el
tampaknya bekerja lebih baik daripadaemacs --daemon
saat boot, itulah yang saya coba pertama kali saya cobaemacsclient
.Jawaban:
Jawabannya ada di sini: variabel emacs untuk "dibuka dengan" dalam bingkai asli
Ini perubahan ke pengaturan default di versi emacs yang lebih baru. Menambahkan:
ke file .emacs.
Sangat senang telah menemukan ini.
sumber
open -a /Applications/Emacs.app $1
hal-hal sepertinya bekerja dengan baik! Perhatikan bahwa saya memulai server di init saya, untuk memiliki emacs tersedia untuk git misalnya.