Emacs emacs içinden yeniden başlatın


44

Emac'larımı çok yeniden başlatıyorum. Tek yapmak istediğim, mevcut etkilerini öldüren bir fonksiyon yaratmak, sadece yerine yeni bir tane koymak. İdeal olarak, bu bir TTY'de de işe yarayabilir.


8
Meraktan, neden bu kadar sık ​​öldürüp hemen yeniden başlatıyorsun?
Dan

2
Çok aktif bir şekilde kendimi geliştiriyorum .emacs.d, bu da çevreme ne attığım atıkları gidermek için emacs'ı yeniden başlattığım anlamına geliyor. Bunu yaptığım birkaç kullanım durumu daha var, ama bu en büyüğü.
PythonNut

1
@PythonNut, sorunuzu biraz düzeltmeniz gerektiğini düşünüyorum. bashSonlandırdıktan sonra yeniden başlatmayı söyleyebilir misiniz? Ya da vi? Ya da kural olarak başka herhangi bir işlem? Hayır, çünkü bu onların kaygı kapsamı dışındadır ve dışarıdan gerektiği gibi ele alınmaktadır. Her durumda, gerçekten istediğiniz şey, VM'lerini temizleyerek ve init kodunuzu yeniden çalıştırarak ( işlemine son vermeden ) , emacs'ı yeniden başlatmanın bir yoludur . Bu emacs için faydalı ve uygun olacaktır.
Var

4
@harpo evet bashile yeniden başlayabilirim exec bash. Vim hakkında hiçbir fikrim yok.
PythonNut

11
FWIW, daha sonra çıkıp yeniden başlatmak yerine, yapılandırma değişikliklerini test etmek için yeni bir Emac örneği başlatmaya daha meyilliyim . Neden? Eğer kodumda bir hata varsa, Emacs yeniden başlattığımda config'umu yükleyemeyebilir ve bu noktada normal ayarlarımla çalışan bir örnek alamıyorum, bu yüzden daha az bilinen bir düzenleme kullanmalıyım. hatayı düzeltmek için ortam. Sık sık olmayacak, ama ne zaman can sıkıcı. emacs -qTabii ki sorunu çalıştırabilir ve çözebilirim, ancak yapılandırmamı hacklerken her zaman 'iyi' bir örneği çalışır durumda tutmayı tercih ederim, sadece güvende olmak için.
phils

Yanıtlar:


25

Not: Bir pakette aşağıdaki sarılmış olan restart-emacsmevcut burada .


Saf elisp kullanarak istediğinizi elde etmenin alternatif bir yolu (gerçekten bir kabuğa güvendiğinizden beri değil). İşin püf noktası, şu anki emirler öldürülmeden hemen önce bir başka emas işlemi ortaya çıkarmak.

(defun launch-separate-emacs-in-terminal ()
  (suspend-emacs "fg ; emacs -nw"))

(defun launch-separate-emacs-under-x ()
  (call-process "sh" nil nil nil "-c" "emacs &"))

(defun restart-emacs ()
  (interactive)
  ;; We need the new emacs to be spawned after all kill-emacs-hooks
  ;; have been processed and there is nothing interesting left
  (let ((kill-emacs-hook (append kill-emacs-hook (list (if (display-graphic-p)
                                                           #'launch-separate-emacs-under-x
                                                         #'launch-separate-emacs-in-terminal)))))
    (save-buffers-kill-emacs)))

Emacs bir GUI sürümünü başlatmak için kod basittir. Bir terminalde emacs başlatmak için kod biraz zor. suspend-emacsÜst işleme (kabuk) terminal girişi olarak geçirilecek bir dizgiyi geçirebileceğiniz gerçeğini kullanır . Belgelerden

(askıya alma ve isteğe bağlı KABUL)

Emacs'ı durdurun ve üstün işleme geri dönün. Daha sonra devam edebilirsiniz. 'Askıya alınamıyor' sıfır değilse veya sistem iş denetimini desteklemiyorsa, bunun yerine bir alt kabuk çalıştırın.

İsteğe bağlı arg STUFFSTRING sıfır değilse, karakterleri, askıya alındıktan sonra Emacs'in ailesi tarafından terminal girişi olarak okunmak üzere doldurulur.

Bu nedenle, temelde emakları öldürülmeden hemen önce askıya alıyoruz, ana kabuğa halihazırda askıda olan emaklara devam etmesini söyle (yakında çıkacak) ve daha sonra başka emaks işlemi başlat. Bunun, terminal emaklerinin gerçekte askıya alınamadığı / asılmayacağı, ancak pencerelerde bir alt kabuk başlattığı platformlarda çalışmadığını unutmayın.


Bu benim için işe yaramıyor: sh -c "emacs &"kabuktan kaçtığımda " emacs: standard input is not a tty" ile bitiyor . (Bunu yaptığımda M-x restart-emacsbu hata mesajını bile göremiyorum, Emacs sonlandırılıyor.)
Constantine

Benim için X altında çalışır. Bir terminalde çalışmaz çünkü stdin ve stdout'u / dev / null'a yönlendirir; üst tty'yi alt işleme geçirme büyük olasılıkla yapılabilir, ancak daha zor bir iştir.
Beni Cherniavsky-Paskin

1
Bu mükemmel çalışıyor ve aslında beni biraz korkutuyor. Neden yeryüzünde Emac'ların komutları içeren kabuğuna aktarmasına izin verilir?
Radon Rosborough

bunun için hangi anahtarlığı kullanıyorsun?
slk500

32

Bildiğim kadarıyla, Emacs'a sonlandırdıktan sonra yeniden başlamalarını söyleyemezsiniz, ancak çıkış kodunu, Emacs'ı ilk başta başlatan işlemin yeniden başlamak istediğinizi algılayabileceği şekilde ayarlayabilirsiniz.

Örneğin, bu kabuk betiği, 123 koduyla çıkarsa Emacs'ı yeniden başlatır.

#!/bin/sh
while emacs -nw "$@"; [ $? = 123 ]; do :; done

Daha sonra, kill-emacs-and-restartEmacs'ın betiğin tanıdığı sihirli sayıya eşit çıkış koduyla sonlandırılmasını sağladığımızı belirledik:

(defun kill-emacs-and-restart ()
  (interactive)
  (kill-emacs 123))

Şimdi, eğer Emacs'ı bu betik üzerinden çalıştırırsanız, yeniden başlayabilir M-x kill-emacs-and-restart(veya bir anahtar dizisine bağlayabilirsiniz).


Sorunun etrafında süpürgelik yapmanın güzel yolu! Bana nedenini söylersen bunu kabul edeceğim you cannot tell Emacs to re-start after terminating. Bu teknik bir sınırlama mı?
PythonNut

3
@PythonNut: Bir süreci yeniden başlatmanın tek yolunun exec...aileden gelen işlevlerden birini kullanmak olduğudır (yine de POSIX sistemlerinde). Emacs Lisp süreç kontrol fonksiyonları bu kadar düşük seviyeli aramaları göstermez. Ben de bu yüzden umarım birileri daha bilgili irade zili olsa da, bir uzman değilim.
Konstantin

2

Açıkça https://unix.stackexchange.com/questions/114238/is-it-possibe-to-change-parent-shells-working-directory-programmatically adresinden çalındı

"Bir dizgeye gömmek için doğru bir sözdizimine sahip olduğumu varsayarak, bunu yapmalı.

(defun restart-emacs ()
  (call-process "sh" nil nil nil "-c" "gdb -p $(ps h -o ppid -p $$) -ex 'call execl(\"/bin/sh\", \"/bin/sh\", \"-c\", \"exec emacs\")'"))

11
Lütfen yapma Bu, tüm Emacs'in iç temizliğini atlar ve onaylamadan tüm mevcut durumu (örneğin değiştirilmiş tamponları) atar .
lunaryorn

lunaryorn'in uyarısı doğru.
Joshua
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.