The emacsclient
Program memungkinkan bendera --no-wait
(disingkat -n
) yang akan menyebabkan emacs server untuk mengunjungi file yang ditentukan, dan segera kembali.
emacsclient -n ~/.bashrc
Jika saya menyediakan editor alternatif, maka ini akan tetap berfungsi dalam kasus di mana tidak ada server Emacs yang berjalan
emacsclient -n -a "/usr/local/bin/emacs" ~/.bashrc
Namun, ini memberi saya perilaku tidak konsisten karena dalam kasus di mana server sedang berjalan, panggilan ini akan segera kembali. Dalam kasus di mana tidak ada server yang berjalan, dan editor alternatif digunakan, panggilan menjadi panggilan yang memblokir, dan tidak akan kembali sampai saya keluar dari Emacs.
Apakah ada cara untuk memberitahu emacs
(sebagai lawan emacsclient
) untuk membuat bingkai baru dan kemudian kembali?
emacsclient
server
nispio
sumber
sumber
-a ''
, "mulai daemon Emacs dan coba lagi emacsclient"?-a ''
akan memulai daemon alih-alih server. Kemudian ia mencoba untuk membuka terminal Emacs, tetapi karena saya telah memberikan-n
opsi, ia tidak tetap terbuka. Itu hanya memantul kembali ke shell.Jawaban:
Deskripsi
Perilaku default saat menjalankan emacsclient sedikit konservatif. Lihat komentar ini dari emacsclient.c :
Dari uraian dan komentar Anda, sepertinya Anda mencoba memulai server Emacs sesuai permintaan sementara juga menggunakan
-n
flag. Komentar "misalnya" di sini adalah mengapaemacsclient -n -a '' FILE
tidak memenuhi apa yang Anda cari ketika tidak ada server yang berjalan.-a ''
logika dijalankan daemon.emacsclient
katakan itu untuk membuat bingkai terminal baru, karena itu default kecuali Anda mengevaluasi elisp.-n
logika segera membunuh kerangka terminal baru.Jika Anda dapat mengubah Langkah 2 untuk membuat bingkai grafis baru secara default, maka
emacsclient -n -a '' FILE
lakukan apa yang Anda inginkan.Solusi Elisp
Anda dapat menyebabkan Emacs untuk membuat bingkai grafis baru secara default jika Anda menyarankan fungsi
server-process-filter
seperti:Masukkan itu ke dalam file init Anda, lalu, seperti yang dikatakan,
emacsclient -n -a '' FILE
dan Bob adalah paman Anda.Bandingkan dengan Solusi Shell
Di satu sisi, saya bisa menunjukkan beberapa keuntungan menggunakan pendekatan defadvice ini dibandingkan dengan menggunakan skrip yang disarankan oleh Archenoth
sebagai editor alternatif. Dengan defadvice:
save-buffers-kill-terminal
(C-x C-c
secara default) berperilaku konsisten di semua bingkai. Itu tidak pernah membunuh proses Emacs, karena setiap frame selalu merupakan bingkai klien.find-grep
itu keluar untuk proses eksternal berperilaku lebih baik ketika terminal bisu ada. Setidaknya, saya mengalami lebih sedikit sakit kepala terkait shell yang lepas.Di sisi lain ... ya.
Kesimpulan
Mungkin ada kompromi? Ini adalah yang terbaik yang bisa saya pikirkan. Anda menetapkannya sebagai $ EDITOR Anda.
sumber
Saya tidak yakin bagaimana melakukannya dengan ketat di dalam Emacs, tetapi untungnya ada cara lain untuk mendapatkan apa yang Anda gambarkan.
Jika Anda tidak memiliki sesuatu
.emacs
untuk memulai server, Anda selalu dapat membuat skrip kecil yang memulai Emacs dengan file yang ingin Anda edit dan memulai server bercabang.Sesuatu seperti:
Dan kemudian meneruskannya ke
-a
.Namun ...
Jika server Anda mulai
.emacs
, Anda tidak perlu membuat skrip; Anda memiliki opsi yang sedikit lebih singkat:Ampersand akan melatarbelakangi proses dan langsung mengembalikan shell Anda, bahkan ketika Emacs mulai untuk pertama kalinya.
Anda mungkin harus
disown
memprosesnya jika bash membunuh pekerjaan saat keluar. Jika itu masalahnya, Anda cukup menambahkan adisown
sampai akhir:Di Windows, padanan terdekatnya adalah "
start
" perintah ...Jadi, seperti saran skrip di atas, Anda mungkin harus membuat file batch yang berisi sesuatu seperti:
Dan kemudian tunjukkan
-a
argumen itu.Itu harus menjalankan file batch dan segera kembali setelah memulai Emacs dengan file yang sesuai.
sumber
&
merupakan hal pertama yang saya coba. Sayangnya, teks berikut dikirim kestderr
: dan kemudian terminal memblokir proses menunggu untuk berakhir:emacsclient: can't find socket; have you started the server? To start the server in Emacs, type "M-x server-start".
Saya menduga bahwaemacsclient
fork menjadi latar belakang, tetapi kemudian memanggilemacs
yang akan dibuka di latar depan.emacs --eval '(server-start)' $* &
mungkin? Dengan begitu server mulai, Anda mendapatkan terminal Anda, danemacsclient
memiliki server yang dapat dihubungkan.emacs
cara normal. Saya sadar kebanyakan orang mungkin tidak akan memiliki konfigurasi itu, jadi itu sekarang bagian pertama dari jawabannya. Semoga ini bisa membantu ..!