Emacsで複数のシェルを実行する方法


147

私はWindows 7でEmacs 23.3.1を使用しています。Mxシェルを使用してemacsからシェルを実行できることを知っています。同時に複数のシェルウィンドウを作成したいのですが、もう一度Mx shellと入力すると、同じシェルウィンドウが開きます。

異なるシェルウィンドウを使用する方法はありますか?

回答:


210

C-u M-x shell それを行います。

新しいシェルの名前の入力を求められます。デフォルトのreturnキーを押すだけです(これは次のようになります) *shell*<2>

eshellでも動作します。

eshellを使用する場合の別のトリック:(新しいeshellを開始するのではなく)M-x eshell戻るのと同じように*eshell*、数値のプレフィックス引数を使用すると、そのeshellバッファーに移動します。たとえば、C-3M-xeshellに移動します*eshell*<3>。悲しいことに、(eshellではなく)シェルを使用する場合、このトリックは機能しないようです(少なくとも、私のEmacs 24.0.50.1では)。


1
はい、これは機能します。Cu Mxシェルが新しいシェルの名前を尋ねます。ありがとう!
S4M、2011年

1
問題ありませんS4M。eshellのヒントを追加しました。あなたがシェルについて尋ねたように、あなたがそれが役立つかどうかはわかりませんが、同じ質問を持つeshellユーザーはそれが役立つかもしれません。
Matt Curtis

ありがとう、マット。ここでCuはどういう意味ですか?
Tim

4
C-uコマンドを実行しuniversal-argumentます。これは、次のコマンドに引数を注入する方法です。あなたはそれについてもっと読むことができますC-h k C-uC-h krun describe-key、非常に便利です!)
Matt Curtis

次にC-h f eshellC-h fruns describe-function)は、関数eshellがオプションの引数を取ることを示しています。引用:数値のプレフィックス引数(などC-u 42 M-x eshell RET)は、その番号のセッションに切り替え、必要に応じて作成します。非数値のプレフィックスargは、新しいセッションを作成することを意味します。
Matt Curtis、

34

シェルのバッファの名前をで変更できますM-x rename-buffer。次に、2番目のシェルを起動できます。


2
私はマット・カーティスの解決策を好む。新しい名前でシェルを実行することは、現在の名前を変更してから新しいシェルを実行するよりも簡単に思えます。
S4M 2011年



5

4年以上経過した後も、この問題をまだ検討している人がいるので、シェルをロードしてその名前を尋ねるように書いた関数を公開します。これにより、ファイルのソート専用のシェルには「sort-files」、ハイブクエリの実行専用のシェルには「hive」という名前を付けることができます。私はそれを毎日使用しています(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

これにより、たまたま使用しているバッファに新しいシェルインスタンスが自動生成されます。それをMSまたはそのようなものにバインドし、即座に喜びます:

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

結果がさらにひどい括弧であるにもかかわらず、letを使用した書き換えを推奨してくれたphilsに感謝します...:\


1
letローカルでの使用を目的としている場合は、変数をバインドする必要があります。現在、currentbufおよびのグローバル値がありnewbufます。
phils 2013年

new-shell関数は、create-shell関数とどのように比較されますか?
S4M 2013年

1
@ S4Mそれは主に好みの問題です、私は怠惰で、現在アクティブなウィンドウで、前にバッファー名を入力しなくてもシェルをすぐに欲しいです。
bjsdaiyu 2013年

@phils先端に感謝します、私はlispにまったく精通していないので、ローカル割り当てを使用してそれを作り直します。:-)
bjsdaiyu 2013年

うーん、私の関数を使用してshell_nのようなデフォルト名を追加できると思います。ここで、nはn番目のシェルオープンで、Cu create-shellはシェルの名前を要求します。
S4M 2013年

0

これにより、関数を呼び出すたびに新しいシェルが開き、必要に応じて自動的に名前が変更されます。追加されたプラスは、ファイルをリモートで編集している場合(dired / tramp ...)、これによりリモートホストでシェルが開き、リモートホスト名で自動的に名前が変更されます。

(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)
  ))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.