Emacs에서 여러 쉘을 실행하는 방법


147

Windows 7에서 Emacs 23.3.1을 사용하고 있습니다. Mx 쉘을 사용하여 emacs에서 쉘을 실행할 수 있다는 것을 알고 있습니다. 동시에 여러 개의 셸 창을 갖고 싶지만 Mx 셸을 두 번 입력하면 동일한 셸 창이 열립니다.

다른 쉘 윈도우를 가질 수있는 방법이 있습니까?

답변:


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

1
문제 없음 S4M. 나는 eshell을위한 팁을 추가했다; 쉘에 대해 물었을 때 그것이 유용한 지 모르겠지만 같은 질문을 가진 eshell 사용자가 유용하다고 생각할 수도 있습니다.
매트 커티스

고마워, 매트 Cu는 여기서 무엇을 의미합니까?
Tim

4
C-u명령을 실행합니다 universal-argument. 다음 명령에 인수를 삽입하는 방법입니다. 그것에 대해 더 자세히 읽을 수 있습니다. C-h k C-u( C-h krun describe-key, very handy!)
Matt Curtis 1

그런 다음 C-h f eshell( C-h fruns describe-function)은 함수 eshell가 선택적 인수를 취하는 것을 보여줍니다 . Quote : 숫자 접두사 arg (에서와 같이 C-u 42 M-x eshell RET)는 해당 숫자의 세션으로 전환하여 필요한 경우 만듭니다. 숫자가 아닌 접두사 arg는 새 세션을 만드는 것을 의미합니다.
매트 커티스

34

쉘 버퍼의 이름을로 바꿀 수 있습니다 M-x rename-buffer. 그런 다음 두 번째 쉘을 시작할 수 있습니다.


2
Matt Curtis의 솔루션을 선호합니다. 새로운 이름으로 쉘을 실행하면 현재 이름을 바꾸고 새로운 것을 실행하는 것보다 쉬운 것 같습니다.
S4M 2016 년



5

4 년이 지난 후에도 일부 사람들이 여전히이 문제를보고 있다는 것을 알게되었으므로 쉘을로드하고 이름을 묻는 빠른 기능을 게시 할 것입니다. 그렇게하면 파일 정렬 전용 쉘인 "sort-files"와 하이브 쿼리 실행 전용 인 다른 "하이브"의 이름을 지정할 수 있습니다. 나는 매일 그것을 사용합니다 (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을 사용하여 다시 쓰기를 권장하는 필 덕분에 많은 감사를드립니다 ... : \


1
let변수를 로컬로 사용하려면 변수 를 바인딩 해야 합니다. 현재 currentbuf및에 대한 전역 값이 있습니다 newbuf.
phils

새로운 쉘 기능과 쉘 작성 기능을 어떻게 비교합니까?
S4M

1
@ S4M 그것은 주로 환경 설정의 문제이며, 게으 르며 현재 활성 창에서 버퍼 이름을 미리 입력하지 않고 즉시 쉘을 원합니다.
bjsdaiyu

@phils 팁 주셔서 감사합니다, 나는 lisp에 전혀 익숙하지 않으므로 현지 과제를 사용하여 다시 작업 할 것입니다. :-)
bjsdaiyu

흠, 내 함수를 취하고 shell_n 과 같은 기본 이름을 추가 할 수 있다고 생각합니다 . 여기서 n은 n 번째 셸이 열려 있고 Cu create-shell은 셸의 이름을 묻습니다 .
S4M

0

함수를 호출 할 때마다 새 쉘이 열리고 필요한 경우 자동으로 이름이 바뀝니다. 추가 된 것은 원격으로 파일을 편집하는 경우 (dird / 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.