이맥스
이맥스(Emacs)는 확장성이 높으며 사용자가 상당히 많은 부분을 커스터마이즈할 수 있는 문서 편집기이다. 특히 유닉스 또는 리눅스 환경에서 개발하는 프로그래머들이 많이 쓴다. 이맥스는 단순한 편집기를 넘어서는 텍스트 처리를 위한 포괄적인 통합환경 또는 응용 프로그램 실행 환경이라고 할 수 있다. 이맥스는 40년이 넘은 오랜 역사를 갖고 있고, 바탕부터 새로 작성되기도 하면서 많은 변종을 낳기도 했다. 그렇게 오늘날까지 많은 개발자들이 이맥스를 활용하고 있다. 현재의 GNU 이맥스의 개발은 유닉스 환경을 주된 대상으로 하고 있지만, 마이크로소프트 윈도 등 다양한 환경에서도 이용할 수 있다.
이맥스는 처음에 리처드 스톨만이 TECO의 매크로로서 개발했다. 이맥스는 Editor MACroS의 약자이다.
나중에 제임스 고슬링이 고슬링 이맥스로 개선하였고, 이 때에 리스프(Mocklisp 이라 부른다) 언어에 의한 환경설정 기능 및 에디터 자신의 기능을 확장할 수 있는 기능이 포함되었다.
현재 주로 사용되는 것은 자유 소프트웨어 재단의 리처드 스톨만이 완전히 새로 다시 작성한 GNU 이맥스라 불리는 이맥스다. GNU 이맥스도 이맥스 리스프(elisp) 라고 하는 리스프에 기반을 두는 환경 설정 언어를 가지고 있다.
이맥스 계열의 편집기들을 복수형으로 Emacsen이라 부른다. Emacsen이 확실한 정의가 있는 것은 아니지만, GNU 이맥스를 중심으로 한 주된 변형에는 다음과 같은 것들이 있다: NEmacs, Epoch, Nepoch, Mule, FSF 이맥스 (GNU 이맥스), XEmacs, Lucid Emacs, Meadow, NTEmacs.
이맥스를 다루려면 , , 알파벳 키 등을 조합한 키 바인딩(key binding)을 입력해야 한다. 흔히 말하는 단축키(shortcut) 라는 용어를 이맥스에서는 키 바인딩이라고 칭한다(흔한 용어 대신 이맥스에서만 쓰는 용어들이 많은데, 그 이유는 그 흔한 용어들보다 더 오래 전에 이맥스에서 쓰이는 용어가 만들어졌기 때문이다). 예를 들어 커서의 위치를 한 줄 아래로 옮기려면 n 을 누른다. 이것을 이맥스 문서에서는 C-n 으로 기술한다. 그리고 커서를 한 줄 위로 옮기려면 C-p 를 누른다. 물론 , 방향키를 눌러서 커서를 아래 위로 옮기는 것도 가능한데, 두 손 모두 키보드위에 올려져 있을 경우에는 을 조합한 키바인딩을 사용하는 방법이 커서를 이리저리 움직이는 것을 더 빠르게 할 수 있다.
대부분의 키보드들은 왼쪽 키가 누르기 상당히 불편한 위치에 있다. 이맥스 키바인딩에서 가장 핵심적인 키인데 반해 위치가 상당히 나쁘기 때문에 이맥스를 처음 쓰는 사람에게는 이맥스의 조작방법이 불편하게 여겨지곤 한다. 그러나 이맥스를 자신의 주요한 에디터로 활용하는 사람들은 키와 키의 기능을 서로 바꿔서 쓰거나, 의 기능을 없애고 키로서 동작하게 바꿔서 쓴다. 리눅스 사용자가 키보드 기능을 이렇게 바꾸려면 setxkbmap 이나 xmodmap 등의 명령어를 써서 키보드 설정을 소프트웨어적으로 바꾸는 게 일반적이다. 그리고 리얼포스 같은 프로그래밍용 키보드는 바닥에 딥스위치를 제공하기 때문에 키보드단에서 하드웨어적으로 설정할 수도 있다.
키바인딩은 사용자가 얼마든지 커스터마이즈할 수 있다. 키바인딩이 존재하지 않는 명령어에 키바인딩을 매핑하거나 기본 키바인딩이 마음에 들지 않으면 다른 조합으로 바꾸는 거나, 키바인딩을 지우는 것도 물론 가능하다. 그리고 이맥스의 메이저/마이너 모드에 따라서 같은 키조합이더라도 의미가 달라지는 경우도 있다.
C-h b 를 누르면 현재 쓸 수 있는 모든 키바인딩 목록이 나온다. 또는 C-h m 을 누르면 현재 사용중인 메이저/마이너 모드의 목록과 거기서 쓸 수 있는 키바인딩 목록이 각 키바인딩이 호출하는 명령과 함께 나온다. 그리고 원하는 명령을 호출하기 위한 키조합 중에서 일부만 아는 상황에서는 ? 를 누르는게 도움이 된다. 예를 들어서, C-c C-r r 을 누르면 elpy-refactor 커맨드를 호출할 수 있는데, C-c 까지만 기억이 난다면, C-c ? 를 누르면 그다음에 나올 수 있는 키바인딩 목록이 나온다.
이맥스는 원래 텍스트 단말기에서 쓰도록 설계하여 만들었지만 적어도 GNU 이맥스 버전 18은 X 윈도 시스템 응용 프로그램으로 컴파일할 수 있다. 그러나, 실제의 작동은 xterm 같은 터미널 에뮬레이터 안에서 작동하는 것이었다.
Epoch은 GNU 이맥스 버전 18을 기반으로 하여 마우스를 사용하는 X 윈도 시스템의 다중 윈도 기능에 대응시킨 것이다. Lucid Emacs는 이맥스 버전 19를 기본으로 해 고도의 GUI에 대응시킨 것으로서 Lucid 사가 개발하였다. GNU 이맥스도 서서히 GUI에 대응해 갔지만, 그 개발 속도가 너무나도 느리다는 불만을 가진 팀이 Lucid Emacs를 기본으로 하여 XEmacs 프로젝트를 시작하였다. (덧붙여, 유래가 분명치 않은 라이선스의 GNU 이맥스의 코드가 존재하고 있던 것도 둘이 분리된 이유의 하나이다) XEmacs와 구분하기 위해 원래의 GNU 이맥스를 FSF 이맥스라고 부르기도 한다. 이것은 XEmacs도 GPL을 따르므로 GNU 이맥스로 부를 수 있기 때문이다.
이맥스 버전 21, XEmacs 는 그래픽 기능이 강화되었고, 버퍼 안에 다양한 크기나 스타일의 글꼴을 함께 쓸 수 있다.
이맥스의 핵심은 elisp 언어 인터프리터이며 이맥스는 그 위에 지어진 텍스트 에디터 애플리케이션으로 볼 수 있다. 이맥스가 구동하는 것을 이렇게 떠올려 볼 수 있다. elisp 인터프리터 프로세스가 뜨고 그것의 메모리 상에 이맥스가 구현한 elisp 함수들과 변수들이 정의되기 시작한다. 그리고 사용자 인터페이스 화면과 커서를 표시한다.
elisp 인터프리터는 REPL (Read Eval Print Loop) 을 제공한다. 따라서 사용자는 현재 인터프리터의 메모리상에 있는 심볼들을 평가할 수 있으며 값을 덮어쓰거나 함수를 재정의할 수도 있다. 즉 이맥스를 얼마든지 뜯어 고칠 수 있는 수많은 상태값들의 집합체라고 볼 수 있으며, 이런 이유로 현재 내 컴퓨터에 구동중인 이맥스는 세상에서 유일한 나만의 이맥스가 될 수 있다.
elisp는 lisp 의 변종으로서 완전한 프로그래밍 언어이다. 이맥스 기능의 대부분은 elisp로 쓰여 있다. 다시 말해, 이맥스의 구조는 이맥스 리스프의 실행 기능(과 기본적인 편집 기능)을 갖고 있는 이맥스 리스프 인터프리터를 중심으로, 리스프로 쓰여진 많은 코드에 의하고 실현되고 있다. 이를테면, 이맥스는 많은 프로그래밍 언어에 맞는 편집 상태가 있어, 자동으로 들여쓰기를 하고, 예약어나 주석을 다른 색으로 보여 주거나, 적당히 입력을 보완해 주는 기능이 있고, 이러한 기능은 전부 이맥스 리스프로 쓰여 있다.
elisp 은 완전한 프로그래밍 언어이기 때문에 이맥스의 기능은 편집 기능에 그치지 않고 TCP/IP 통신이나 외부 프로세스의 시동, 파일 입출력 등의 기능을 구현하는 것이 가능하다. 따라서 에디터에 포함된 기능이라고 할 수 없을 만큼 막강한 기능도 많이 이맥스 리스프로 기술되어 있다. 이맥스 매니아들은 이맥스를 자신이 일상적으로 하는 모든 업무의 통합적인 툴로 사용하기도 한다. 예를 들어, 메일 클라이언트로서 mu4e, Wanderlust, Gnus, 웹 브라우저로서 Emacs W3, irc 클라이언트로서 erc, 자바 통합 개발 환경으로서 JDEE, 파이썬 개발환경으로서 elpy 등의 패키지(혹은 라이브러리)를 사용한다.
인터페이스가 통합되어 있는 만큼, 초보자가 처음 사용하기 힘들다는 점이다. 다양한 모드들을 동일한 인터페이스로 통합한 것은 기존 사용자에게는 큰 장점일 수 있지만 처음 사용자에게는 낯설다. 예를 들어, 이맥스 메일러에서 검색은 일반 텍스트 문서에서 검색하는 것과 비슷한 방식과 단축키를 이용하지만, 초보자에게는 아웃룩 익스프레스와 같은 메일 클라이언트의 “대문자 소문자 구별”, “날짜 범위 지정” 등의 설정 예정표를 사용한 검색보다 어렵다. 또한, 이맥스의 설정 항목은 GUI로 설정할 수 있는 항목도 있고 M-x customize와 같은 설정표도 제공하고 있지만, 설정표가 편집기 안으로 들어가 버리는 인터페이스는 기존 사용자에게는 장점이지만 초보자들에게 익숙하지 않을 수 있다. 이맥스의 설정은 일반적인 GUI 응용 프로그램들의 설정표와 비교하면 직관적이지 않아 어렵고, 심지어는 설정 파일을 직접 편집하지 않으면 설정할 수 없는 항목도 많다. 게다가 이 설정 파일은 이맥스 리스프 코드 그 자체인 것이다. 설정을 위해서 프로그래밍 언어인 이맥스 리스프를 습득하지 않으면 안되는 상황은 에디터만을 사용하고 싶은 사용자에게 성가신 일이다. 또한, 과거의 이맥스는 화살표 키를 사용하지 않아서 초보자에게 당황스러운 점이 많았다. 그렇지만 화살표 키를 기본으로 사용할 수 있게 되고, Vi처럼 모드가 구분되지 않아서 메모장과 비슷하게 사용할 수 있다는 점에서 이제는 큰 문제가 되지 않을 수도 있다.