web-dev-qa-db-fra.com

Comment exécuter plusieurs shells sur Emacs

J'utilise Emacs 23.3.1 sur Windows 7. Je sais que je peux utiliser Shell à partir d’emacs avec M-x Shell. Je voudrais avoir plusieurs fenêtres Shell en même temps, mais taper M-x Shell une seconde fois ne m'ouvre que la même fenêtre Shell.

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

132
S4M

C-uM-xShell le fera.

Il vous demandera un nom pour le nouveau shell, il vous suffit d'appuyer sur la touche retour pour obtenir le nom par défaut (ce qui ressemblera à *Shell*<2>.

Fonctionne également avec eshell.

Une autre astuce, si vous utilisez eshell: M-x eshell vous ramène à *eshell* (plutôt que de commencer un nouvel eshell), si vous utilisez un argument de préfixe numérique, cela vous mènera à ce tampon eshell. Par exemple, C-3M-xeshell vous mènera à *eshell*<3>. Malheureusement, si vous utilisez Shell (plutôt que eshell), cette astuce ne semble pas fonctionner (au moins dans mon Emacs 24.0.50.1.)

196
Matt Curtis

Vous pouvez renommer le tampon de votre shell avec M-x rename-buffer. Ensuite, vous pourrez lancer un deuxième shell.

29
Giann

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

7
Victor Deryagin

Il pourrait également être utile d’utiliser une interface semblable à un écran pour vos coques. J'ai écrit le mien, mais il en existe d'autres, comme EmacsScreen .

5
Trey Jackson

Après plus de quatre ans, je constate que certaines personnes examinent encore parfois ce problème. Je vais donc publier une fonction rapide que j'ai écrite pour charger un shell et lui demander son nom. De cette façon, vous pouvez nommer un "fichier de tri" dans le shell s'il est dédié au tri des fichiers et un autre "Hive" s'il est dédié à l'exécution de requêtes Hive. J'utilise cela 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
S4M

Cela générera automatiquement une nouvelle instance du shell dans le tampon que vous utiliserez; liez-le à M-S ou à quelque chose comme ça et à une joie instantané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)
  )
)

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

4
bjsdaiyu

Cela ouvrira un nouveau Shell chaque fois que vous appelez la fonction et le renommerez automatiquement si nécessaire. Le plus ajouté est que 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
DenverCoder9