Cara menjalankan banyak shell di Emacs


147

Saya menggunakan Emacs 23.3.1 di windows 7. Saya tahu saya bisa menjalankan shell dari emacs menggunakan Mx shell. Saya ingin memiliki beberapa jendela shell dalam waktu yang bersamaan, tetapi mengetikkan shell Mx untuk kedua kalinya hanya membuka jendela shell yang sama.

Apakah ada cara untuk memiliki shell windows yang berbeda?

Jawaban:


210

C-u M-x shell akan melakukannya.

Ini akan meminta nama untuk shell baru, tekan saja kembali untuk default (yang akan menjadi sesuatu seperti *shell*<2>.

Juga bekerja dengan eshell.

Trik lain, jika Anda menggunakan eshell: sama seperti M-x eshellmembawa Anda kembali ke *eshell*(daripada memulai eshell baru), jika Anda menggunakan argumen awalan numerik itu akan membawa Anda ke buffer eshell itu. Misalnya, C-3M-xeshellakan membawa Anda ke sana *eshell*<3>. Sedihnya jika Anda menggunakan shell (bukan eshell), trik ini tampaknya tidak berfungsi (setidaknya di Emacs 24.0.50.1 saya.)


1
Oke, ini berhasil. Shell Cu Mx menanyakan nama shell baru itu. Terima kasih!
S4M

1
Tidak ada masalah S4M. Saya menambahkan tip untuk eshell; ketika Anda bertanya tentang shell, saya tidak tahu apakah Anda akan menemukan itu berguna, tetapi eshell pengguna dengan pertanyaan yang sama mungkin menemukan itu berguna.
Matt Curtis

Terima kasih, Matt. Apa yang Cu maksud / lakukan di sini?
Tim

4
C-umenjalankan perintah universal-argument. Ini adalah cara menyuntikkan argumen ke perintah berikutnya. Anda dapat membaca lebih lanjut tentang ini dengan C-h k C-u( C-h kmenjalankan describe-key, sangat berguna!)
Matt Curtis

Kemudian C-h f eshell( C-h fberjalan describe-function) menunjukkan bahwa fungsi tersebut eshellmengambil argumen opsional. Kutipan: Arg awalan numerik (seperti dalam C-u 42 M-x eshell RET) beralih ke sesi dengan nomor itu, membuatnya jika perlu. Arg awalan nonnumerik berarti membuat sesi baru.
Matt Curtis

34

Anda dapat mengganti nama buffer dari shell Anda dengan M-x rename-buffer. Maka Anda akan dapat meluncurkan shell kedua.


2
Saya lebih suka menggunakan solusi Matt Curtis. Bagi saya, menjalankan shell dengan nama baru lebih mudah daripada mengganti nama yang sekarang dan kemudian menjalankan yang baru.
S4M


5

Mungkin juga berguna untuk menggunakan antarmuka seperti layar untuk cangkang Anda. Saya sudah menulis sendiri, tetapi ada orang lain di luar sana, seperti EmacsScreen .


5

Setelah lebih dari empat tahun, saya melihat bahwa beberapa orang masih melihat masalah ini kadang-kadang, jadi saya akan menerbitkan fungsi cepat yang saya tulis untuk memuat shell dan menanyakan namanya. Dengan begitu Anda bisa memberi nama shell "sort-files" jika didedikasikan untuk menyortir file dan yang lain "sarang" jika didedikasikan untuk menjalankan query sarang. Saya menggunakannya setiap hari sekarang (di emacs 24):

(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

Ini akan secara otomatis membuat instance shell baru di buffer apa pun yang kebetulan Anda gunakan; ikat ke MS atau sesuatu seperti itu dan kesenangan instan:

(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)
  )
)

Terima kasih banyak kepada phils untuk merekomendasikan penulisan ulang menggunakan let, walaupun hasilnya bahkan lebih buruk lagi ...: \


1
Anda perlu let-mengikat variabel jika itu dimaksudkan untuk penggunaan lokal. Karena sekarang Anda memiliki nilai global untuk currentbufdan newbuf.
phils

bagaimana fungsi shell-baru dibandingkan dengan fungsi create-shell saya?
S4M

1
@ S4M ini terutama masalah preferensi, saya malas dan ingin shell saya segera, di jendela yang sedang aktif dan tanpa harus mengetik nama pengguna di muka.
bjsdaiyu

@phils terima kasih atas tipnya, saya sama sekali tidak akrab dengan lisp jadi akan mengolahnya menggunakan tugas lokal. :-)
bjsdaiyu

hmm, saya pikir Anda dapat mengambil fungsi saya dan menambahkan nama default yang akan menjadi sesuatu seperti shell_n , di mana n akan menjadi shell ke-n terbuka, sementara Cu create-shell akan meminta nama untuk shell.
S4M

0

Ini akan membuka shell baru setiap kali Anda menjalankan fungsi dan mengganti nama secara otomatis jika diperlukan. Nilai tambah yang ditambahkan adalah jika Anda mengedit file dari jarak jauh (dired / tramp ...), ini akan membuka shell pada host jarak jauh dan mengganti nama secara otomatis dengan nama host jarak jauh:

(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)
  ))
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.