2011-06-30 10 views
118

私はWindows 7でEmacs 23.3.1を使用しています。私はemacsからM-xシェルを使用してシェルを実行できることを知っています。私は同じ時間に複数のシェルウィンドウを持ちたいと思いますが、M-xシェルを2回入力するだけで同じシェルウィンドウが開きます。Emacsで複数のシェルを実行する方法

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

答えて

163

C-UM-Xシェルはそれを行います。

それは、新しいシェルの名前のために*shell*<2>ようになりますデフォルトのためだけのヒットのリターンを(プロンプトが表示されますあなたがESHELL使用する場合

はまた、別のトリックをESHELLで動作します

。。: Mxが ESHELLあなたは数値接頭引数を使用する場合、それはそのESHELLバッファに行くことができます、(むしろ新しいESHELLを開始するよりも)*eshell*に戻りますと同じように。例えば、C-3のMxESHELL*eshell*<3>に移動します。悲しいことに、あなたがshellを使うなら(eshellではなく)、このトリックはうまくいかないようです(少なくとも私のEmacs 24.0.50.1では少なくともです)。

+1

これは正常です。 C-u M-xシェルは、新しいシェルの名前を私に尋ねます。ありがとう! – S4M

+1

S4Mに問題はありません。私はeshellのためのヒントを追加しました。あなたがシェルについて尋ねたように、私はあなたがそれが有用であるかどうかわかりませんが、同じ質問をしているeshellユーザはそれが役に立つと思うかもしれません。 –

+2

ここで何かを学んだ、ありがとう! – Giann

26

シェルのバッファの名前をM-x rename-bufferと変更できます。その後、2番目のシェルを起動することができます。

+2

私はマットで行くことを好みますカーティスの解。新しい名前でシェルを実行すると、現在の名前の名前を変更して新しい名前を実行するよりも簡単です。 – S4M

7

MultiTermを見ると、Emacsの複数の端末をもっと簡単に管理できます。

+0

シェルモードとタームモードは全く異なる2つのことに注意してください。 – darkfeline

5

シェルに画面のようなインターフェイスを使用すると便利かもしれません。私は自分自身を書いたが、そこに他の人がいる、例えばEmacsScreenのようなものがある。

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) 
) 
) 
結果は...もっとひどい括弧であっても、聞かせて使用して書き換えを推奨するPHILSへ

感謝:\

+1

ローカルでの使用を意図している場合は、 'let'-bind変数を使用する必要があります。現在のところ、 'currentbuf'と' newbuf'のグローバルな値を持っています。 – phils

+0

new-shell関数とcreate-shell関数を比較するにはどうすればよいですか? – S4M

+1

@ S4Mそれは主に嗜好の問題です。私は怠惰で、現在アクティブなウィンドウで即座に自分のシェルを望んでおり、バッファネームを前に入力する必要はありません。 – bjsdaiyu

4

より後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 "*")))) 
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 "%[email protected]" (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) 
)) 
関連する問題