[Emacs] shell/eshell/terminal-mode?

Emacs는 버퍼 내에서 쉘 구동이 가능한 모드 몇 가지를 가지고 있다. 아래 3가지 커맨드를 입력해 보면 셋 다 비슷한 화면이 나오는 것을 확인할 수 있다.
  • M-x shell
  • M-x eshell
  • M-x term

shell-mode

shell은 일반적인 쉘 커맨드를 사용할 수 있는 모드이긴 하다. 하지만 emacs 키맵을 동시에 사용할 수 있다. 예를 들어 C-p를 이용해 커서를 상단으로 이동시킬 수 있고, 이전에 입력했던 커맨드로 커서를 이동해서 엔터를 누르면 똑같은 커맨드를 입력할 수 있다.

대신 emacs 키맵이 우선적으로 적용되는 만큼, 이 단축키와 겹치는 쉘의 단축키는 이용할 수 없다. 특정 유틸리티의 실행을 중지시키기 위한 Ctrl-C 키도 emacs가 잡아버리기 때문에 Ctrl-C 키를 입력하기 위해서는 emacs의 방식인 C-q C-c RET를 입력해야 한다.

추가) C-c C-c를 눌러도 쉘에 ^C 가 전달된다.

eshell-mode

shell-mode와 비슷하기는 한데 emacs의 자체 쉘로 기동을 하게 된다. 따라서 bash 등으로 기동할 때 와는 달리 쉘 환경 설정 파일을 읽지 않기 때문에 기존의 쉘 환경과 다를 수 있다.

특이하게도 eshell-mode 상에서는 elisp 커맨드를 입력할 수 있다. 일종의 elisp idle interpreter 역활을 겸하게 되는 것이다. (다만 Elisp Interpreter는 M-x ielm를 쓰는게 더 좋긴 하다)

이 외에도 elisp으로 구현된 특별한 쉘인 만큼 emacs와 어울리는 다양한 기능이 있을 것으로 생각되긴 하지만... 개인적으로 잘 쓰지 않아서 더 이상은 모르겠다...;;

참고) eshell의 PATH 환경 변수가 일반 쉘의 환경변수와 틀릴 수 있다. (당연히 eshell은 bash나 sh가 아니니까 -_-) 이 경우 다음과 같은 형식으로 PATH 환경을 만들어 줄 수도 있다.
(setq eshell-path-env "PATH...")
기타 eshell관련 .el 스크립트 소스를 분석해 보는 것이 eshell 설정의 지름길인 것 같다.

term-mode

term-mode는 거의 완벽하게 터미널 환경을 구현한다. 실행할 때도 실행시킬 쉘을 선택할 수 있고 따라서 쉘 환경을 그대로 따라가게 된다. emacs 키맵도 바인딩을 해제시켜서 실제 쉘 단축키를 거의 그대로 이용할 수 있다.
터미널 환경을 에뮬레이션 하는 만큼 ncurses 환경이나 심지어 약간 느리긴 하지만 위 스크린샷 처럼 vim 까지 기동시켜서 사용이 가능할 정도이다. 하지만 그래서 C-x k 등의 emacs 커맨드를 단축키로 입력하기에는 굉장히 곤란한 모드이다. Ctrl-D를 누르거나 exit등을 이용해서 쉘을 종료시켜야지 emacs 키맵이 먹기 시작한다.

다만 Emacs의 특징으로 인해 ESC키가 Meta로 동작하기 때문에 Vim을 써 먹기는 좀 곤란하기는 하다.

정리

일반적인 단순한 커맨드를 위해서는 shell-mode가 차라리 편하다. eshell-mode의 경우는 특정 디렉토리에서 elisp 커맨드를 입력해야 할 경우가 아니라면 거의 쓸 일이 없을지도 모르겠다. term-mode는 원격 호스트에 접속해서 vim을 쓸 때 가장 편한 환경이지만 그래서 별로 쓸 일이 없는 것 같다.

shell-mode나 eshell-mode는 쉘 자체를 Emacs에서 구현한 것 같지만, term-mode는 말 그대로 터미널 환경을 에뮬레이션하기 때문에 가장 터미널 다운 터미널로 사용이 가능하다는 점이 특징적이다.

(추가) python-shell 이란 쉘도 있다. 이름에서 유추 가능할 수 있겠지만 그냥 파이썬 인터프리터가 버퍼에 뜬다. 파이썬 프로그래머들은 iPython이라는 모드를 더 선호하는 것 같지만 따로 설치해야 되는 모드라서 귀찮다;;

댓글

이 블로그의 인기 게시물

소수점 제거 함수 삼총사 ceil(), floor(), round()

버전(Version)을 제대로 이해하기