Comment exécuter plusieurs shells sur Emacs

J'utilise Emacs 23.3.1 sur windows 7. Je sais que je peux exécuter shell à partir d'emacs en utilisant M-x shell. Je voudrais avoir plusieurs fenêtres shell en même temps, mais taper M-x shell une deuxième fois m'ouvre la même fenêtre shell.

Existe-t-il un moyen d'avoir différentes fenêtres shell?

124
demandé sur Chris Martin 2011-06-30 13:53:17

7 réponses

C-u M-x shell va le faire.

Il demandera un nom pour le nouveau shell, il suffit de frapper return pour la valeur par défaut (qui sera quelque chose comme *shell*<2>.

Fonctionne Également avec eshell.

Une Autre astuce, si vous utilisez eshell: tout comme M-x eshell vous ramène à *eshell* (plutôt que de commencer une nouvelle eshell), si vous utilisez un préfixe numérique argument qu'il vous faudra pour que eshell tampon. Par exemple, C-3M-xeshell vous amène à *eshell*<3>. Malheureusement, si vous utilisez shell (plutôt que eshell), cette astuce ne semble pas fonctionner (dans mon Emacs 24.0.50.1 au moins.)

180
répondu Matt Curtis 2011-06-30 10:42:33

, Vous pouvez renommer le tampon de votre coquille avec M-x renommer tampon-. Ensuite, vous serez en mesure de lancer une deuxième coque.

26
répondu Giann 2011-06-30 10:55:31

Regardez MultiTerm , cela facilite beaucoup la gestion de plusieurs terminaux dans Emacs.

7
répondu Victor Deryagin 2011-06-30 11:02:00

Il peut également être utile d'utiliser une interface de type écran pour vos shells. J'ai écrit le mien, mais il y en a d'autres, comme EmacsScreen.

5
répondu Trey Jackson 2011-06-30 14:13:30

Cela génèrera automatiquement une nouvelle instance shell dans n'importe quel tampon que vous utilisez; liez-la à M - s ou à quelque chose comme ça et instant joy:

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

Un grand merci à phils pour avoir recommandé une réécriture en utilisant let, même si le résultat est encore plus terrible parenthèses...:\

4
répondu bjsdaiyu 2013-05-29 20:13:01

Après plus de quatre ans, je vois que certaines personnes regardent encore ce problème parfois, donc je vais publier une fonction rapide que j'ai écrite pour charger un shell et demander son nom. De cette façon, vous pouvez nommer un shell "sort-files" s'il est dédié au tri des fichiers et un autre "hive" s'il est dédié à l'exécution des requêtes hive. Je l'utilise tous les jours maintenant (sur 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
répondu S4M 2016-04-06 12:16:10

Cela ouvrira un nouveau shell chaque fois que vous invoquez la fonction et la renommera automatiquement si nécessaire. Le plus ajouté est si vous éditez des fichiers à distance (dired/tramp...), cela ouvrira un shell sur l'hôte distant et le renommera automatiquement avec le nom d'hôte distant:

(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)
  ))
0
répondu DenverCoder9 2017-07-26 22:51:11