(Perhatikan bahwa, sebaliknya, pertanyaan ini tidak sama dengan Bagaimana memulai dalam mode daemon dan menekan dialog interaktif?, Karena pertanyaan itu "dijawab" oleh submitter yang menghilangkan apa yang menyebabkan prompt tertentu muncul.)
Saya ingin tahu apakah ada cara umum untuk tidak emacs --daemon
menggantung selamanya menunggu jawaban prompt yang ditampilkan di minibuffer yang belum ada.
Mustahil untuk terhubung dengan emacsclient untuk menjawab prompt ini, karena server tidak memulai sampai Emacs menyelesaikan urutan startup. (Ini berarti, jika Anda memiliki ALTERNATE_EDITOR yang disetel ke string kosong, yang membuat emacsclient
server yang tidak dapat menemukan memulai daemon baru, Anda dapat berakhir dengan beberapa daemon Emacs yang semuanya macet dan menunggu.) Saya harus killall emacs
memperbaiki masalahnya sebelum melanjutkan.
Saya dapat memainkan whack-a-mole dengan setiap hal menyebabkan prompt pada startup ketika saya mengidentifikasinya (dengan memulai Emacs dalam mode non-daemon dan melihat apa yang ditanyakan), tetapi itu bukan solusi karena tidak dapat menghentikan daemon berikutnya dari menggantung di startup karena alasan baru.
Untuk memberikan contoh: alasan umum itu akan hang adalah setelah sistem reboot atau crash Emacs, ketika Emacs pasca-reboot pertama ingin tahu apakah itu boleh saja mencuri lockfiles dari Emacs yang sudah tidak berfungsi. Saya bisa memperbaikinya dengan membuat saran agar prompt itu selalu menjawab "ya" tanpa interaksi. Tapi kemudian, salah satu file yang terbuka di sesi sebelumnya simpan adalah file TRAMP yang membutuhkan sudo atau kata sandi SSH, sehingga daemon macet menunggu pada prompt kata sandi. Jadi saya memperbaikinya dengan mengedit file sesi secara manual (dengan vi
atau emacs -q
!) Untuk menghapus file yang menyinggung — tetapi itu tidak mencegahnya terjadi di waktu berikutnya.
Jadi, saya bisa berhenti memuat sesi saya secara otomatis saat startup dan mengubahnya menjadi perintah yang harus saya jalankan secara manual dari emacsclient pertama saya. Tetapi jika itu tidak memuat sesi saya di latar belakang sehingga siap pada saat saya siap menggunakannya, seluruh tujuan daemon hilang!
Jadi yang saya suka adalah:
- (Terbaik) Beberapa cara untuk menunda minibuffer meminta hingga saya membuka emacsclient, sambil tetap menyelesaikan sisa inisialisasi.
- (OK) Beberapa cara untuk membuat semua minibuffer meminta saya belum menyarankan sebaliknya seperti yang dijelaskan di atas hanya kembali
no
kecuali emacsclient sedang berjalan. Saya dapat hidup dengan buffer TRAMP saya yang gagal asalkan sebagian besar berfungsi.
Apakah ada cara untuk mencapai salah satu dari tujuan ini?
sumber
(read-desktop)
, kemudian, sebelum menjalankanemacs --daemon
, membuat file kunci palsu dengan meletakkan integer ke .emacs.desktop.lock (di mana meletakkan file itu, sayangnya, tergantung pada konfigurasi Anda , tapi mungkin homedir Anda atau ~ / .emacs.d / .Jawaban:
Diskusi kami menyatakan bahwa Anda tidak memiliki X-server yang menjalankan ini membuat solusi pertama saya tidak berguna untuk Anda.
Berikut ini saya sajikan solusi kedua yang bekerja dengan bingkai terminal teks.
Ketika inisialisasi Anda memerlukan input pengguna melalui salah satu fungsi yang disarankan dengan
avoid-initial-terminal
Emacs menunggu hingga Anda membuka bingkai terminal teks. Prompt muncul di minibuffer frame itu dan Anda dapat memberikan respons interaktif Anda.Informasi terkait kode diberikan sebagai komentar dalam kode. Ada
TODO
spidol dengan deskripsi yang menunjukkan tempat untuk memasukkan konfigurasi Anda sendiri. Saat ini ada formulir tes di sana yang memvalidasi kode.Uji: Emacs-versi: 26.1
1) Jalankan
emacs --daemon
di konsol.2) Jalankan
emacsclient --tty
di konsol lain. Anda diminta kata sandi dan sebuah string. Setelah itu Anda juga diminta untuk menjawab kueri y-atau-np.sumber
Tidak persis apa yang Anda minta, tetapi mungkin solusi untuk masalah awal Anda:
Jika daemon memberi Anda bingkai grafis untuk menjawab pertanyaan yang muncul pada fase startup Anda tidak terjebak lagi.
Kode di bawah ini mendefinisikan saran umum
my-with-initial-frame
yang membuka bingkai pada tampilan pertama yang tersedia (misalnya,:0.0
).Saran itu dapat ditambahkan dengan mudah ke perintah kueri seperti
y-or-n-p
atauread-passwd
, seperti yang ditunjukkan di bawah ini.Hanya dengan membuka bingkai memberi Anda kemungkinan yang agak kasar untuk menjawab pertanyaan pada antarmuka pengguna. Orang juga bisa menggunakan kotak dialog untuk
y-or-n-p
tetapi itu akan membutuhkan solusi khusus untuk perintah permintaan tertentu. Saya ingin menghindarinya.Jika Anda mencoba kode itu di file init Anda, pastikan itu adalah hal pertama di sana.
Uji:
Asumsi:
Memiliki xserver yang sedang berjalan yang dapat dihubungkan oleh program melalui
DISPLAY
variabel lingkungan.Masukan di xterm:
emacs --daemon
emacsclient --eval '(y-or-n-p "A")'
Ada membuka bingkai dengan
y-or-n-p
prompt permintaanA (y or n)
. Jawab kueri itu dan coba lagi:emacsclient --eval '(y-or-n-p "B")'
Kueri baru dengan prompt
B (y or n)
di bingkai yang sama. Tutup frame itu, misalnya dengan C-x 5 0dan coba lagi:emacsclient --eval '(y-or-n-p "C")'
Frame baru terbuka dengan prompt permintaan
C (y or n)
.Hal yang sama berlaku untuk input kata sandi.
sumber
xterm
. Juga, saya tidak berpikir solusi ini dapat bekerja untuk mereka yang melakukannya - jika Anda memiliki daemon yang diatur untuk dijalankan saat startup, itu akan mencoba untuk membuka bingkai di atas layar login, yang tidak diperbolehkan, jadi itu adalah crash.server-start
di akhir startup sebaliknya, jika Anda memiliki startup yang bersih, Anda tidak perlu menunggu. Tapi ... Anda harus menunggu, karena kecuali saya salah paham, Anda tidak dapat menempatkan tugas untuk memulai daemon Emacs ke skrip login sistem Anda karena GUI tidak akan tersedia saat itu. (Dan dalam kasus seperti milik saya, tidak akan pernah nanti, juga.)Saya pikir menunda permintaan akan sulit secara umum, tetapi harus cukup mudah untuk mengubah Emacs sehingga permintaan tersebut segera memberi sinyal kesalahan.
Tidak hanya itu, tetapi jika Anda tidak dapat menjawab permintaan tersebut tanpa banyak senam, saya pikir itu memenuhi syarat sebagai bug, jadi saya sarankan Anda mengirimkan laporan bug untuk itu.
sumber
Warning: desktop file appears to be in use by PID xxx. Using it may cause conflicts. Use it anyway? (y or n)
prompt menjadi kesalahan, tanpa secara khusus merujuk ke "desktop" dalam beberapa cara (karena dengan cara itu, menjadi nongeneral, terletak mendera)?*Messages*
mungkin tidak cukup head-up pada klien pertama terhubung bahwa sesuatu mungkin serius dan perlu perhatian segera sebelum pengguna mencoba operasi stateful.emacs --daemon
atau dengan memulaiemacsclient
denganALTERNATE_EDITOR
variabel lingkungan yang disetel ke string kosong, Anda akan melihat output yang biasanya masuk ke*Messages*
gema di terminal hingga daemon menyelesaikan inisialisasi dan Emacs siap.Tapi banyak Emacs memulai daemon pada saat startup sistem atau waktu login, dan hasilnya dicatat atau dibuangdesktop
tetapi dalamy-or-n-p
fungsi (atau lebih rendah lagi). Kami memiliki beberapa mekanisme untuk menunda menampilkan kesalahan yang terjadi selama startup, jadi kami bisa menggunakannya untuk menampilkannya ketika emacsclient pertama terhubung ke daemon.*Messages*
— dan sementara sistem yang jarang digunakan*Warnings*
itu memunculkan jendela ke buffer jika bingkai aktif ada ketika peringatan dihasilkan, dalam hal ini, tidak ada bingkai yang ada, dan itu tidak Tampaknya mudah untuk menunda pop-up hingga emacsclient pertama setelah masalah peringatan. Jika itu bisa dilakukan, saran Anda untuk membuatyes-or-no-p
peringatan pra-klien sebagai gantinya akan sangat ideal. (Saya ragu pengguna menyisir*Messages*
startup!)