Emacs'ta birden çok mermi çalıştırma


148

Windows 7'de Emacs 23.3.1 kullanıyorum. Mx shell kullanarak emacs'den shell çalıştırabileceğimi biliyorum. Aynı anda birden fazla kabuk penceresine sahip olmak istiyorum, ancak ikinci kez Mx kabuğu yazmak bana aynı kabuk penceresini açıyor.

Farklı kabuk pencerelere sahip olmanın bir yolu var mı?

Yanıtlar:


211

C-u M-x shell yapacağım.

Yeni kabuk için bir isim isteyecektir, sadece varsayılan için return tuşuna basmanız yeterlidir (ki bu *shell*<2>.

Eshell ile de çalışır.

Başka bir numara, eshell kullanırsanız: M-x eshellsizi geri götürdüğü gibi *eshell*(yeni bir eshell başlatmak yerine), sayısal bir önek argümanı kullanırsanız, sizi o eshell arabelleğine götürür. Mesela C-3M-xeshellsizi götürecek *eshell*<3>. Maalesef shell kullanıyorsanız (eshell yerine) bu numara işe yaramıyor gibi görünüyor (en azından Emacs 24.0.50.1'imde.)


2
Tamam, bu çalışıyor. Cu Mx kabuğu bana yeni kabuğun adını soruyor. Teşekkürler!
S4M

1
Sorun yok S4M. Eshell için bir ipucu ekledim; Kabuk hakkında sorduğunuz gibi, onu yararlı bulup bulmayacağınızı bilmiyorum, ancak aynı soruyu soran eshell kullanıcıları bunu yararlı bulabilir.
Matt Curtis

Teşekkürler Matt. Cu burada ne anlama geliyor / ne yapıyor?
Tim

4
C-ukomutu çalıştırır universal-argument. Bir sonraki komuta bir argüman enjekte etmenin bir yolu. C-h k C-u( C-h kÇalışır describe-key, çok kullanışlı!)
Matt Curtis

1
Bunu her zaman kullanıyorum. Bir evcil hayvanım var, yine de, Ibuffer'da, *shell*<2> 3038 Shell (shell<1> run) ~/ve siz çıkmaya çalıştığınızda, adı shell <2> olsa bile, emacs kabuğa kabuk <1> olarak atıfta bulunan bir satırla son bulduğumdur . Elbette, önerilen varsayılan ad parametresini düzenleyebilirim, ancak bunu yapmam.
burun

35

İle kabuğunuzun tamponunu yeniden adlandırabilirsiniz M-x rename-buffer. Sonra ikinci bir mermi fırlatabileceksiniz.


2
Matt Curtis'in çözümünü tercih ederim. Bir kabuğu yeni bir adla çalıştırmak, mevcut olanı yeniden adlandırmak ve ardından yeni bir tane çalıştırmaktan daha kolay görünüyor.
S4M


5

Kabuklarınız için ekran benzeri bir arayüz kullanmak da yararlı olabilir. Kendi başıma yazdım, ancak EmacsScreen gibi başkaları da var .


5

Dört yıldan fazla bir süre sonra, bazı insanların hala bu konuya bazen baktığını görüyorum, bu yüzden bir kabuğu yüklemek ve adını sormak için yazdığım hızlı bir işlevi yayınlayacağım. Bu şekilde, bir kabuğu dosyaları sıralamak için adanmışsa "sıralı dosyalar" ve kovan sorguları çalıştırmak için ayrılmışsa başka bir "kovan" olarak adlandırabilirsiniz. Şimdi bunu her gün kullanıyorum (emacs 24'te):

(defun create-shell ()
    "creates a shell with a given name"
    (interactive);; "Prompt\n shell name:")
    (let ((shell-name (read-string "shell name: " nil)))
    (shell (concat "*" shell-name "*"))))

4

Bu, kullandığınız arabellekte otomatik olarak yeni bir kabuk örneği oluşturacaktır; MS'e veya bunun gibi bir şeye bağlayın ve anlık neşe:

(defun new-shell ()
  (interactive)

  (let (
        (currentbuf (get-buffer-window (current-buffer)))
        (newbuf     (generate-new-buffer-name "*shell*"))
       )

   (generate-new-buffer newbuf)
   (set-window-dedicated-p currentbuf nil)
   (set-window-buffer currentbuf newbuf)
   (shell newbuf)
  )
)

Phils'e, sonuç daha da berbat parantezler olsa da, let kullanarak bir yeniden yazma önerdiği için çok teşekkürler ...: \


1
letYerel kullanım için tasarlanmışsa değişkenleri bağlamanız gerekir . Olduğu gibi şimdi küresel değerlere sahip currentbufve newbuf.
phils

new-shell işlevi, create-shell işlevi ile nasıl karşılaştırılır?
S4M

1
@ S4M bu esas olarak bir tercih meselesi, tembelim ve kabuğumu hemen aktif olan pencerede ve ön tampon adı yazmak zorunda kalmadan istiyorum.
bjsdaiyu

@phils bahşiş için teşekkürler, lisp'e hiç aşina değilim, bu yüzden yerel ödevi kullanarak yeniden çalışacağım. :-)
bjsdaiyu

hmm, sanırım işlevimi alıp shell_n gibi bir varsayılan ad ekleyebilirsiniz , burada n n'inci kabuk açıkken, Cu create-shell kabuk için bir isim isteyecektir.
S4M

0

Bu, işlevi her çalıştırdığınızda yeni bir kabuk açar ve gerekirse otomatik olarak yeniden adlandırır. Eklenen artı, dosyaları uzaktan düzenliyorsanız (dired / tramp ...), bu, uzak ana bilgisayarda bir kabuk açacak ve uzak ana bilgisayar adıyla otomatik olarak yeniden adlandıracaktır:

(defun ggshell (&optional buffer)
(interactive)
(let* (
       (tramp-path (when (tramp-tramp-file-p default-directory)
             (tramp-dissect-file-name default-directory)))
       (host (tramp-file-name-real-host tramp-path))
       (user (if (tramp-file-name-user tramp-path)
         (format "%s@" (tramp-file-name-user tramp-path)) ""))
       (new-buffer-nameA (format "*shell:%s*" host))
       (new-buffer-nameB (generate-new-buffer-name new-buffer-nameA))
       (currentbuf (get-buffer-window (current-buffer)))
       )
  (generate-new-buffer new-buffer-nameB)
  (set-window-dedicated-p currentbuf nil)
  (set-window-buffer currentbuf new-buffer-nameB)
  (shell new-buffer-nameB)
  ))
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.