Ketika saya menjalankannya M-x compile
memunculkan subkulit baru untuk menjalankan perintah kompilasi saya. Segera setelah perintah kompilasi kembali, proses shell terbunuh. Saya dapat melihat mengapa hal ini diinginkan dalam kebanyakan kasus, tetapi saya saat ini dalam situasi di mana itu tidak membantu.
Saya bekerja di lingkungan build khusus sekarang yang mengharuskan saya mengambil beberapa langkah awal untuk mengatur build sebelum menjalankan compiler. Selama lingkungan masih ada, saya hanya perlu melakukan langkah-langkah pengaturan sekali. Tetapi ketika saya menggunakannya M-x compile
berarti saya harus melakukan langkah-langkah setiap kali saya ingin mengkompilasi atau mengkompilasi ulang.
Apakah ada cara agar saya dapat menelurkan subkulit yang akan bertahan di latar belakang? Satu itu M-x compile
dan M-x gdb
dapat menggunakan setiap kali mereka perlu menjalankan proses shell?
Motivasi:
Saya punya program (yang akan kita sebut xcc
) yang membangun kode C untuk platform khusus. Untuk membangun kode saya, saya mulai xcc
dari tcsh
prompt:
$ xcc
Program ini membutuhkan waktu 10+ detik untuk memuat, dan kemudian saya dapat memasukkan perintah pada prompt interaktifnya
xcc>> add target myprogram
xcc>> set source myprogram $PROJDIR/src/
xcc>> set includes myprogram $PROJDIR/include/
xcc>> set type myprogram primitive
xcc>> set inputs myprogram int8,int8
xcc>> set outputs myprogram fix16,fix16
xcc>> build myprogram
Langkah-langkah di atas dapat dibangun menjadi makro kustom buildmyprog.macro
sehingga saya bisa menjalankannya langsung dari shell, atau dari emacs denganM-x compile
$ xcc buildmyprog.macro
Masalah utama dengan pendekatan ini adalah kenyataan bahwa xcc
program butuh 10 detik untuk memuat, bahkan sebelum kompilasi dimulai. Saya cukup lelah menunggu 10 detik tambahan setiap kali saya kompilasi bahwa saya sudah mulai berjalan xcc
di ansi-term
dalam buffer terpisah. Sekarang setelah saya memodifikasi dan menyimpan kode, saya beralih ke ansi-term
buffer dan menjalankan
xcc>> build myprogram
Ini berfungsi dengan baik, tetapi setiap kali saya beralih ke buffer itu saya pikir, "Bukankah lebih bagus jika saya bisa mendorong F7
dan perintah kompilasi saya akan dikirim ke instance yang sudah berjalan xcc
?"
sumber
comint
mode turunan untuk lingkungan Anda. Jika Anda merasa ingin bertualang, berikut ini panduan untuk menulisnya.comint-send-input
. Itu pada dasarnya apa yang Anda lakukan dengan tangan, mengubahnya menjadi elisp seharusnya tidak terlalu sulit (terutama dibandingkan dengan menyiapkan comint).Jawaban:
Bisakah Anda melakukan pengaturan di shell Anda sebelum Anda memulai emacs? The
compile
sub-shell harus mewarisi lingkungan dari kakek-nenek nya melalui emacs.sumber
M-x compile
tidak mengirim perintahnya kembali ke juru bahasa python.Gunakan shell aktual di dalam Emacs kemudian, suka
eshell
atauansi-term
. Anda harus menggunakannyacompile
untuk kompilasi, meskipun itu dapat digunakan untuk menjalankan perintah apa pun.Saya tidak berpikir itu mungkin dengan perintah kompilasi, tapi mungkin saya kehilangan sesuatu. Jika tidak, Anda bisa memasukkan setiap langkah pengaturan ke skrip shell dan menjalankan skrip itu bersama
M-x compile
.sumber
M-x compile
atau beberapa perintah alternatif yang akan mengkompilasi file saat ini.M-x compile
panggilan, dan itulah yang dilakukan shell yang sebenarnya. Saya tidak berpikir itu mungkin dengan perintah kompilasi, tapi mungkin saya kehilangan sesuatu. Jika tidak, OP dapat menempatkan setiap langkah pengaturan ke dalam skrip shell dan menjalankan skrip itu denganM-x compile
eshell
untuk hal-hal shell, dancompile
untuk hal-hal kompilasi"? Itu mengalahkan seluruh intinya.Solusi yang mungkin adalah memiliki juru permanen yang tinggal di buffer khusus (semacam
*compilation*
buffer, tetapi di mana proses yang mendasarinya tidak akan pernah kembali). Anda kemudian dapat memilikirecompile
perintah -seperti untuk mengirim perintah kompilasi yang telah ditentukan sebelumnya kepada juru bahasa, dan menampilkan hasilnya.Di bawah ini adalah implementasi sementara dari strategi semacam itu. The
persistent-compile
perintah membutuhkan perawatan baik dari inisialisasi proses (ketika itu disebut untuk pertama kalinya atau dengan argumen awalan), dan kompilasi ulang (jika proses interpreter sudah bangun dan berjalan). Hasil kompilasi ditampilkan dalam*persistent-compilation*
buffer, dimasukkancompilation-shell-minor-mode
untuk mengambil manfaat daricompilation-mode
fitur yang biasa untuk bernavigasi di antara kesalahan.Berikut ini adalah contoh penggunaan, bersama dengan konten
*persistent-compilation*
buffer yang dihasilkan :M-x
persistent-compile
RET/bin/bash
RETFOO=bar
RETecho $FOO
RETM-x
persistent-compile
RETHati-hati, kode berikut tidak banyak diuji. Misalnya, saya tidak yakin apa yang terjadi ketika Anda mencoba mengkompilasi ulang sebelum penghentian kompilasi sebelumnya.
sumber