Tuesday, December 12, 2006

Emacs

네이버

[펌] Emacs | 3D-technique 2006/01/20 07:38

http://blog.naver.com/zabel/140021108604


MS 윈도우즈와 달리 유닉스 계열의 운영체제에서 텍스트 편집기는 상당히 중요한
애플리케이션으로 자리 잡고 있다.
리눅스에서의 대부분의 작업은, 상황에 따라 틀려지겠지만 어떠한 파일을 열어
편집하고 명령을 실행하는 일일 것이다.
물론, 요즘은 X 윈도우 시스템의 보급으로 마우스만으로도 어느정도는 작업이
가능해 졌지만, 역시 X 윈도우 한 쪽에서는 편집기가 실행되어 메일 작성,
텍스트 문서 편집, 프로그래밍, HTML 문서 코딩, 프로그램 셋팅등 작업의
대부분은 텍스트 편집기 앞에서 하게 된다.

리눅스에서의 텍스트 편집기의 위치는 이렇듯 중요하기 대문에 정말로 많은
편집기들이 존재하고 있다.
그 중에서 지금까지도 가장 많은 사용자가 사용하는 편집기로는 vi계열과
emacs계열이 있다.
vi의 경우에는 오랜 기간 유닉스와 함께 한 편집기로서 모든 유닉스에
기본적으로 존재하지만 emacs의 경우에는 그렇지가 않다.
해외에서는 VI가 워낙 오래되고 직관적이지 않은 사용자 인터페이스때문에
요즘은 vi보다는 emacs를 선호하는 경향이 있으나 우리나라의 경우에는 아직까지
VI를 더 선호한다.

편집기는 위에서도 말했듯이 유닉스 시스템에 있어서 매우 중요한
어플리케이션이며 개인에 강력한 습관을 형성시키는 경향이 있어 VI 계열과
emacs계열 모두를 잘 다루기는 힘들다.
그렇기때문에 사용자들은 편집기 선택에 있어 맹목적인 선택을 하는 경향이
있으며 이러한 결과로 VI진영과 Emacs 진영으로 나뉘기도 한다.

*이맥스 특징
VI와 비교해서 가장 특징이라면 명령 모드, 입력 모드같은 특별한 모드가 없다는
것이다.
이맥스를 실행하고 바로 글들을 입력할 수가 있다.

이맥스는 솔직히 단순한 편집기로만 보기에는 너무도 많은 기능이 있으며,
그래서 작업에 필요한 도구를 따로 구해서 설치하거나 따로 배울 필요가 없다.
컴파일, 디버깅, 이메일 작성, 뉴스그룹 구독, 시스템 관리등 모든 작업이
이맥스내에서 해결이 가능하다.

이맥스는 Emacs LISP(이맥스에서 사용하는 LISP는 본래 LISP과 약간은
다르다.)라는 자신의 고유 언어로 많은 부분이 만들어 졌기 때문에 무한의
확장성을 제공하며 기능의 수정 역시 용이하다.
만약 사용자가 LISP언어를 잘 안다면 사용자 자신이 이맥스의 기능을 수정하고
확장 할 수가 있다.

Emacs를 단순 편집기로만 사용한다면 그것은 스타크래프트를 하기위해 팬3 1G
듀얼 컴퓨터를 구입하는 것과 같다.
그럴 바에는 다른 단순한 편집기를 사용하는 것이 더 좋다.
이맥스의 어려운 명령들을 힘들게 외울 필요는 없지 않은가..?

Emacs의 가장 큰 장점으로는 모든 환경의 통합을 들수 있다.
Emacs는 자신의 버퍼 안에서 프로그램들을 수행시킬 수 있는 능력을 가지고
있기 때문에 Emacs을 떠나지 않고서도 telnet, ftp, gopher, 웹 서핑, 이메일,
뉴스 그룹등 리눅스상의 거의 모든 작업을 처리 할 수가 있다.

이메일 작업을 위해서 C-x m 명령을 실행시키면 메일을 작성할 수 있는 새로운
버퍼가 생기며 M-x rmail 을 실행시키면 메일을 읽을 수 있는 새로운 버퍼가
생긴다.

뉴스 리더로는 gnus라는 Emacs LISP 패키지가 있다.
M-x gnus 명령을 실행 해 보라.(한글 환경을 위해서 gnus 5.8 이상을 설치하기
바란다.)

Emacs의 통합 환경은 특히 프로그래밍에서 위력을 발휘한다.
그렇기때문에 Emacs는 프로그래머에게 가장 사랑을 받는 편집기이기도 하다.
C 모드에서 소스 편집을 마치고 M-x comile 명령을 내려 보라 자동으로 Emacs는
make -k 라는 명령으로 현재 버퍼에 있는 소스를 컴파일 한다.
만약 컴파일 도중 에러가 발행하면 에러 메시지를 다른 버퍼 창에서 보여주며
에러가 난 위치에서 C-c C-c라고 눌러주면 커서를 에러가 발생한 소스의 해당
줄로 이동 시킨다.
거기다 GNU 디버거 gdb에 대한 인터페이스도 있어 에러 문장을 선택하면
자동으로 파일이 열리면서 디버깅할 기회를 제공한다.

그리고 또 다른 재미있는 모드로는 쉘 모드가 있다.
M-x Shell 이라고 해보자.
새로운 버퍼에 한텀과 같은, 여러분의 명령을 기다리는 쉘 프롬프트가 뜬다.
단순한 한 가지 쉘 명령은 M-! 으로도 실행을 할 수가 있다.
만약 vi에서와 마찬가지로 표준 입출력 리다이렉션을 하여 실행을 시키고자
한다면 M-| 을 실행해 보라.

참고
----------------------------------------------------------------------
Emacs에서 실행되는 쉘 모드는 비로그인 쉘로 .bashrc 설정 파일을 참조 한다.
만약 Emacs 쉘 모드에서만 실행 시키고 싶은 명령이나 환경 변수가 있다면 홈
디렉토리 .emacs_bash 파일에 .bashrc 처럼 넣어 주면 된다.
----------------------------------------------------------------------

이외에도 Emacs안에서 웹 서핑을 가능하게 해주는 w3라는 Emacs LISP 패키지도
있다.
비록 느린 속도때문에 잘 사용하지는 않지만 html-helper-mode에서 웹 코딩을
하면서 이맥스에서 바로 결과를 확인할 때 사용할 수 있다.

위에서도 말했지만 이러한 모든 기능은 Emacs 바이너리에 어떤 변화를 주는 것이
아니라 GNU elisp 언어로 짜여진 하나의 새로운 기능이 동적으로 추가되는 것에
불과하다.
어떠한 새로운 기능이라도 플러그-인 식으로 Emacs에 통합되어 질 수 있다.

Emacs의 이러한 무한의 확장 능력이 오히려 초보자를 더 어렵게 만드는 요소가
되기도 한다.
하지만 처음의 어려움을 극복한다면 Emacs는 작업을 더욱 편리하게 만들어 줄
것이다.

*한글화
emacs20부터는 기본적으로 leim과 붙어서 나오기 때문에 기본적으로 한글을
지원한다 그러나 설치만 한다고 한글 입력이 자동적으로 되는건 아니다.
물론 'Mule - Set Language Environment -Korean' 을 선택하여 한국어 모드로
전환하고 사용할수는 있지만 한영 전환도 'C-]' 사용해야 하는 등 불편함이
많다.
따라서 어느정도는 자신의 emacs설정 파일에 한국어 설정을 기록해야 한다.

/etc/emacs/site-start.el
----------------------------------------------------------------------
(require 'cl)
(when enable-multibyte-characters
(set-language-environment "Korean")

(setq-default file-name-coding-system 'euc-kr)
(setq default-korean-keyboard "")
(setq input-method-verbose-flag nil
input-method-highlight-flag nil)

(prefer-coding-system 'euc-kr)
(set-default-coding-systems 'euc-kr)
;;(setq default-process-coding-system '(euc-kr . euc-kr))
(when window-system
(global-set-key "C-\" 'http://blogimg.hanmail.net/blog/p_img/blank01.gif?))
(add-hook 'quail-inactivate-hook 'delete-quail-completions)
(defun delete-quail-completions ()
(when (get-buffer "*Quail Completions*")
(kill-buffer "*Quail Completions*")))

(unless window-system
(menu-bar-mode -1)
(set-keyboard-coding-system 'euc-kr)
(set-terminal-coding-system 'euc-kr)
(define-key encoded-kbd-mode-map [27] nil))

(set-selection-coding-system 'ctext) ;;netscape에서 emacs로 copy & paste를 가능하게 함

;; Hangul Mail setting
(setq-default sendmail-coding-system 'euc-kr)

;; turn off C-h during input
(eval-after-load "quail"
'(progn
(define-key quail-translation-keymap "C-h" 'quail-delete-last-char)
(define-key quail-translation-keymap (kbd "C-SPC") 'set-mark-command)
(define-key quail-translation-keymap "C-?" 'quail-translation-help)))
(define-key global-map (kbd "C-x RET s") 'decode-coding-region))

;; eof
----------------------------------------------------------------------
위에 파일은 모든 유저의 이맥스에 공통적으로 적용이 된다.
물론 위의 설정을 개인 홈디렉토리의 .emacs(.emacs.el)파일에 저장해도 되지만
모든 유저의 공통적인 사항은 위의 파일에 넣어 두는게 더 효율적일것이라
생각한다.

*기초 규칙
이맥스의 명령들은 거의 대부분 와 <메타>키와의 조합으로 이루어져 있다.
명령을 표시할때 은 C로 <메타>는 M으로 표시 한다.

C-f : 과 를 같이 누르라는 것을 의미한다.

M-f : <메타>와 를 같이 누르라는 것을 의미한다.

<메타>키는 일반 PC 키보드에서 보통 또는 키로 바인딩되어 있다.
키는 한 가지 중요한 측면에서 키와 서로 다르다.
를 메타키로 이용해서 명령어를 입력한다면 명령어 앞에서 키를
눌렀다 놓아야 한다.
키를 메타키로 이용한다면 명령어를 입력하는 동안 키를 계속 누르고
있을 수가 있다.
특히 이맥스 버젼 19이하의 버젼에서는 두 번 누르거나 오래 누르고 있으면
계속해서 에러를 발생시킬 수가 있다.

참고
----------------------------------------------------------------------
가끔 미니 버퍼에서 명령을 입력을 할때 오타로 인해서 이맥스가 이상하게
작동하거나 오류를 내는 경우가 있다.
이럴때는 당황하지 말고 무조건 C-g를 누르기 바란다.
일종의 quit 명령으로 미니 버퍼상에서 명령 취소라고 기억하면 될것이다.
편집 상태에서의 취소 명령은 따로 있다.
----------------------------------------------------------------------

*온라인 도움말
이맥스는 기능도 많은 만큼 온라인 도움말 역시 방대하다.
도움말로 들어가기 위해서는 C-h 또는 Help 메뉴의 옵션을 선택한다.
만약 이맥스를 처음 시작한다면 C-h t 를 입력해보자.
이맥스의 튜토리얼(tutorial)을 보여줄 것이다.
이는 이맥스를 처음 사용하는 사람에게 상당히 많은 도움이 된다.

도움말에서 자세한 정보를 찾기 위해
----------------------------------------------------------------------
C-h c : 키 입력에 대해 실행되는 명령은(describe-key-briefly)
C-h k : 키 입력에 의해 실행되는 명령과 그것이 하는 일은(describe-key)
C-h l : 최근에 입력한 100개의 글자는(view-lossage)
C-h w : 명령을 위한 키바인딩은(where-is)
C-h f : 함수에 대해(describe-function)
C-h v : 변수의 의미과, 설정되 값에 대해(describe-variable)
C-h m : 현재 버퍼가 사용하는 모드에 대해(describe-mode)
C-h b : 이 버퍼에 연결되어 있는 키바인딩에 대해(describe-bindings)
C-h s : 이 버퍼를 위한 구문표는(describe-syntax)
----------------------------------------------------------------------

도움말에서 일반적인 정보를 찾기 위해
----------------------------------------------------------------------
C-h t : 이맥스 튜토리얼을 실행(help-with-tutorial)
C-h i : Info 문서 리더를 시작(info)
C-h C-f : Info 문서 리더를 시작하고, 인자로 입력한 명령의 노드로 이동한다.
(Info-goto-emacs-command-node)
C-h C-k : Info 문서 리더를 시작하고, 이자로 입력한 키입력에 바인딩된 명령 노드로 이동한다.
(Info-goto-emacs-key-command-node)
C-h n : 이전 버전에서 바뀐 점에 대한 새로운 소식을 보여 준다.(view-emacs-news)
C-h F : 이맥스 FAQ 파일을 보여준다.(view-emacs-FAQ)
C-h p : 시스템에서 사용 가능한 이맥스 LISP패키지 정보를 얻을 수 있도록 메뉴를 띄운다.
(finder-by-keyword)
C-h C-c : 이맥스 GPL을 보여준다.(describe-copying)
C-h C-d : FSF로부터 이맥스의 주문에 관한 정보를 보여준다(describe-distribution)
C-h C-p : GNU 프로젝트에 관한 정보를 보여준다(describe-project)
C-h C-w : 이맥스에 대한 (비)보증을 보여준다(describe-no-warranty)
----------------------------------------------------------------------

*시작하기
쉘 프롬프트에서 emacs라고 입력해 보자.

# emacs

참고
----------------------------------------------------------------------
emacs 20.x이하 버젼에서 XIM부분이 깨져 있어서 이맥스가 한글 입력기와
연동하지 못하도록 환경 변수 LANG, LC_ALL을 C로 설정하여야 한다.
만약 패키지로 설치 하지 않고 직접 컴파일 해서 설치 한다면 XIM을 disable하고
컴파일하여 사용하면 된다.

bash $ LANG=C LC_ALL=C emacs
csh % env LANG=C LC_ALL=C emacs

참고로 지금 개발 중인 emacs 21에서는 한글 입력기 지원이 된다.
이를 위해서 설정 파일에 아래 부분을 추가 해주면 된다.
(set-keyboard-coding-system 'quote euc-kr)
----------------------------------------------------------------------

콘솔에서 실행 시키면 텍스트 프로그램으로 실행되며 X 윈도우의 터미널에서
실행하면 X 윈도우 프로그램으로 실행된다.
X 윈도우 프로그램으로 사용하면 마우스를 사용할 수 있으며 프레임을 사용할
수도 있다.

Emacs의 맨 마지막 줄(미니 버퍼라고 부른다)에는 현재 편집 중인 파일명과 편집
모드를 보여준다.
편집 모드는 이맥스의 강력한 기능에 하나로 편집하는 파일의 종류에 따라
이맥스가 지능적으로 대처하도록 한다.
일반 텍스트 파일, C 소스 파일, Tex 소스 파일, HTML 파일등에 대한 각각의
모드가 존재하며 각 모드에서는 같은 키라 하더라도 그 기능이 약간씩 틀려진다.
일반적으로 각 모드는 파일 확장자를 보고 결정된다.

현재 편집 모드에 대한 도움말은 + m 로 확인 할 수 있으며 이맥스
자체에 대한 간단한 온라인 도움말은 + t 로 볼수 있다.

어떤 프로그램이던지 처음 배울때는 끝내는 방법부터 제대로 알아야 이도 저도
아닐때는 바로 종료를 할 수가 있을 것이다.
무심코 실행한 이맥스를 끝내는 방법을 몰라서 당황했던 기억은 저만의 기억은
아닐것이다.
X에서 실행 했다면 그 나마 메뉴가 있어서 괜찮지만 콘솔의 경우에서는 메뉴도
없어 한동안 이리저리 헤매다가 결국에는 C-z으로 서스펜드한 다음, kill 명령을
사용하게 된다.
이맥스를 종료하는 명령은 C-x C-c, 즉 +, +라고 해주면
언제든지 Emacs를 종료 할 수 있다.

*상태 표시 줄(mode line)
미니 버퍼 바로 윗줄을 상태 표시줄이라고 한다.
이 상태 표시줄에는 현재 편집하고 있는 파일에 여러가지 정보를 보여준다.
기본은 대충 아래와 같이 표시될 것이다.

-KK-:**-F1 fhs-2.2.txt (Fundamental)--L305-- 8%-----------

8%라고 나온 숫자는 파일에서 커서가 위치하는 곳이 전체 파일의 8%되는 위치에
있음을 가리킨다.
만약 파일의 제일 처음에 위치하게 되면 -Top_ 이라고 나오면 파일 맨 마지막
부분에 위치하게 되면 -Bot- 라고 나온다.

앞쪽에 있는 두개의 아스테리스크 문자(*)는 이 파일이 수정되었다는 것을
의미한다.
파일을 제일 처음 열었을때는 그냥 마이너스 문자(-)만이 있을 것이다.

괄호안에 있는 문자열은(Fundamental) 현재 어떤 모드를 사용하고 있는지를
보여준다.
주 모드(Major Mode)라고 하는 것은 한 번에 하나씩만 존재할 수 있는데,
Fundamental 모드, LISP 모드, Text 모드, C 모드 등 여러가지가 있을 수 있으며
사용자가 직접 Lisp 언어를 사용하여 새로운 모드를 만들수도 있다.
주 모드가 다르면 같은 명령이라도 다른 방식으로 작동한다.
예를 들어, 각 프로그래밍 언어의 주석 스타일이 다르므로 Emacs의 주석 명령은
각각의 언어에 맞도록 다른 식으로 작동할 것이다.
M-x <모드 이름> 명령으로 모드를 바꿀 수 있다.

C-h m이라고 입력하면 현재 모드에 대한 자세한 설명이 나온다.

모드가 바뀐다고 심각하게 바뀌는 것은 없다.
단지, 각 특성에 맞는 자그마한 변화들이 일어나는 것이므로 걱정할 필요는
없다.

주 모드가 있다는 말은 당연히 부 모드가 있다는 것을 의미한다.
주 모드는 아주 자잘한 부 모드를 가지며, 그 부 모드는 아주 많을 수 있다.
주 모드는 한 번에 하나씩만 선택되어지지만, 부 모드는 같은 주 모드 안에서
여러개를 선택할 수 있다.
예를 들어, 영어 문자을 입력할 때 Auto Fill 모드라고 하는 유용한 모드가
있는데, 행에 문자열이 많을 때 자동으로 단어와 단어 사이를 나눠주는 기능을
한다.
M-x auto-fill-mode 명령으로 들어갈 수 있다.
이것은 토글명령으로 ON/OFF를 반복한다.

*기본적인 편집 명령
이맥스의 모든 명령에는 명령의 이름이 있다.
이맥스에서 명령의 실행은 보통 그 명령의 이름에 바인딩된 키 조합(보통은
와 조합으로 사용한다)을 사용한다.
예를 들어 "C-x C-f"는 파일을 여는 명령으로 이 키 조합에 바인딩된 명령의
이름은 "find-file"이다.
보통은 이렇게 바인딩된 키 조합으로 명령을 실행하지만, 명령의
이름(find-file)으로도 명령을 실행할 수가 있다.
"M-x <명령 이름>"으로 명령의 이름을 사용하여 명령을 실행한다.
즉, "C-x C-f"와 "M-x find-file"은 같은 명령을 실행하게 된다.
대부분의 이맥스 명령들은 키 조합에 바인딩 되어 있지만 몇몇은 그렇지
않은 것들도 있다.
이럴때 "M-x <명령 이름>"을 사용하여 명령을 실행해야 한다.

당연히 사용자가 자신만의 키 조합을 만들어서 사용할 수도 있다.

참고
----------------------------------------------------------------------
앞으로 이맥스의 여러 명령을 설명하면서 강조하고 싶은것은 과
<메타>키의 차이이다.
같은 키에 대하여 C-, M- 차이에 따라 뭔가 일관성이 있음을 발견하기 바란다.
이것을 발견하지 못한다면 그 많은 키에 질려서 Emacs를 포기하고 말 것이다.
----------------------------------------------------------------------

**특수 문자 입력
이맥스는 VI와 달리 입력모드, 명령모드가 따로 있지 않기 때문에 그냥 문자를
입력하면 된다.
그러나 입력하려는 문자가 ^M(캐리지 리턴)같은 특수 문자라면 일반적인
방식으로는 입력이 불가능하다.
이럴때는 "C-q" 키바인딩을 이용하여 특수 문자를 입력 할 수가 있다.
^M의 경우에는 "C-q C-m"을 눌러 입력할 수가 있다.

**커서의 이동
커서 이동은 키보드의 화살표와 Page Up, Page Down, Home, End 키로도 이동이
가능하다.
그러나 가끔은 원격 호스트에서 이맥스를 사용할때 키맵핑의 문제로 이런 키들이
100% 작동하리란 보장도 없으며 문서 편집의 효율성을 위해서도 기본적인 커서
이동 명령은 숙지하여 습관화 하는것이 좋다.

참고
----------------------------------------------------------------------
Emacs의 키배치는 vi 키배치에 비해 약간은 비효율적인게 사실이다.
VI의 경우 적은 손가락의 움직임으로 대부분의 문서 편집이 가능하나 이맥스의
경우에는 그렇지가 않다.
우선 모든 명령이 키와 <메타>키 조합를 사용하기 때문에 손가락이 짧거나
손목, 손가락 관절이 약한 사람들에게는 상당히 불편한 키 조합을 보여준다.
'해피 해킹 키보드'같은 특수한 제품을 쓰지 않는한 일반 키보드에서 Emacs
키조합은 상당한 숙련을 요구한다.
그러나 이맥스의 키조합은 일반 쉘이나 유닉스 프로그램에서도 적용이 되기
때문에 이맥스 명령을 숙지한다면 다른 유닉스 프로그램에서 상당히 편리하다.
----------------------------------------------------------------------

커서 이동 명령
----------------------------------------------------------------------
.C-f : 커서를 한 글자 앞으로 이동(forward-char)
.C-b : 커서를 한 글자 뒤로 이동(backward-char)
.M-f : 커서를 한 단어 앞으로 이동(forward-word)
.M-b : 커서를 한 단어 뒤로 이동(backward-word)
.C-n : 커서를 다음 줄로 이동(next-line)
.C-p : 커서를 윗 줄로 이동(previos-line)
.C-a : 커서를 행의 처음으로 이동(beginning-of-line)
.C-e : 커서를 행의 마지막으로 이동(end-of-line)
.M-a : 커서를 문장의 처음으로 이동(backward-sentence)
.M-e : 커서를 문장의 끝으로 이동(forward-sentence)
.M-< : 커서를 파일의 제일 처음으로 이동(beginning-of-buffer)
.M-> : 커서를 파일의 제일 마지막으로 이동(end-of-buffer)
.M-[ : 커서를 현재 문단의 처음으로 이동(backward-paragraph)
.M-] : 커서를 현재 문단의 마지막으로 이동(forward-paragraph)
.C-v : 한 화면씩 전진(scroll-up)
.M-v : 한 화면씩 후진(scroll-down)
.M-x goto-line : 사용자가 지정한 라인으로 커서를 이동
.M-x goto-char : 사용자가 지정한 문자로 이동
----------------------------------------------------------------------

M-<
M-v
M-[
M-a C-p
C-a M-b C-b C-f M-f C-e
C-n M-e
M-]
C-v
M->

위 표를 보고 커서 이동 명령을 이해하는데 편리할 것이다.

**편집 요령
C-t : 커서가 있는 좌측의 두문자를 바꾼다.(transpose-chars)
M-t : 커서가 있는 좌측의 두단어를 바꾼다.(transpose-words)
C-x C-t : 두라인을 바꾼다.(transpose-lines)
M-x transpose-sentences : 두 문장을 바꾼다.
M-x transpose-paragraphs : 두 문단을 바꾼다.

M-c : 단어의 첫글자를 대문자로 한다. 한글에선 무반응.(capitalize-word)
M-u : 단어의 모든 문자를 대문자로 한다.(upcase-word)
M-l : 단어를 소문자로 바꿉니다.(downcase-word)

M-- M-c : 전에 있는(previous) 단어의 첫문자를 대문자로
바꾼다.(Negative-Argument ; Capitalize-Word)
M-- M-U : 전에 있는 단어를 대문자로 바꾼다.(Negative-Argument ; Upcase-Word)
M-- M-L : 전에 있는 단어를 소문자로 바꾼다.(Negative-Argument ; Downcase-Word)

**텍스트 삭제

지우기 명령
----------------------------------------------------------------------
. : 방금 입력한 글자를 지운다(delete-backware-char)
.C-d : 커서의 다음 글자를 지운다. 텍스트가 딸려오게 된다.(delete-char)
.M- : 커서 앞에 있는 단어를 지운다.(backward-kill-word)
.M-d : 커서 다음의 단어를 지운다(kill-word)
.C-k : 현재 커서 위치로부터 줄 끝까지 삭제한다.(kill-line)
.M-k : 현재 커서 위치로부터 문장의 끝까지 삭제한다.(kill-sentence)
----------------------------------------------------------------------

한 줄 전체를 지우기 위해서는 그 줄 처음으로 이동하여 'c-k'를 두번 누른다.
C-a C-k C-k

두 줄을 붙이기(VI에서 'j' 명령)는 커서를 그 줄의 맨 뒤로 이동하여 'C-k'를
한번 누른다
C-e C-k

**영역 삭제, 복사
문서를 편집하다 보면 문서의 특정 부분을 복사하거나 삭제할 경우가 생긴다.
이맥스에서는 이를 영역이라고 부르며, 이때 영역의 시작을 mark라고 하고
영역의 끝을 point라고 한다.
C-space 로 mark를 설정하고 원하는 곳으로 커서를 움직여 point를 설정한다.
X 윈도에서는 선택된 영역부분이 컬러로 표시되도록 이맥스 설정 파일에서
설정을 할 수가 있으나 콘솔에서는 그것이 불가능하다.
이럴때는 C-x C-x 명령으로 mark와 point를 바꾸어서 영역 부분을 확인 할 수가
있다.

영역 명령
----------------------------------------------------------------------
C-@ 또는 C-space : 마크를 시작한다. 즉, 영역의 처음을 나타낸다.(set-mark-command)
M-h : 커서가 위치한 구문을 영역을 만든다.(mark-paragraph)
C-x C-p : 한 페이지를 영역으로 만든다. 디폴트 페이지 구분은 ^L. (mark-page)
C-x h : 버퍼 전체를 영역으로 만든다.(mark-whole-buffer)
C-w : 선택된 영역을 삭제한다.
M-w : 선택된 영역을 복사한다.
C-x C-x : 마크와 포인터를 교체 시킨다.
마크를 어디에서 부터 시작했는지 알고자 할때 이명령을 사용하면 마크 처음
부분으로 커서가 이동. 콘솔에서 이맥스를 사용할때 유용하다.(exchange-point-and-mark)
----------------------------------------------------------------------

영역에서 삭제되거나 복사된 문자들은 모두 버퍼에 저장된다.

선택 영역에서 일반 치환 작업, 정규식 치환 작업을 할 수 있다.

**사각 편집 (Rectangle edting)
이동 삭제를 위한 영역을 정의 하면 이것은 언제나 화면 전체를 아용한다.
영역을 이용하는 편집은 이맥스에서 하는 대부분의 작업에 적합하지만, 표등을
편집하는 경우에는 적합하지가 않다.
대신 사각 영역을 이용해서 정의한 부분을 삭제, 복사, 이동하는 편리한 방법이
있다.
사각 영역은 특정한 사각 여역을 편집하는 명령을 통해 정의 , 사용하는
사각형의 영역을 의미한다.
사각 영역의 편집은 수직 방향의 내용을 이동하거나 지우고자 할 때 유용하다.
표의 한 열을 이동하거나, 코드 뒤에 주석을 붙이거나, 지울 때 유용하다.

----------------------------------------------------------------------
C-x r k : 사각 영역을 지우고, 그것을 저장(kill-rectangle)
C-x r d : 사각 영역을 지우지만 버퍼에 저장하지는 않음(delete-rectangle)
C-x r y : 마지막으로 지워서 버퍼에 저장했던 사각 영역을 삽입(yank-rectangle)
C-x r c : 사작 영역으로 표시된 부분을 빈 영역으로 만들고, 저장하지 않는다.(clear-rectangle)
C-x r o : 표시된 부분에 빈 사각 영역을 삽입한다.(open-rectangle)
----------------------------------------------------------------------

**빈 줄(blank lines)
----------------------------------------------------------------------
C-o : 현재 커서가 있는 줄 아래 빈 줄을 삽입(open-line)
C-j : 현재 커서 아래 빈줄을 삽입하는 것은 C-o 와 동일하나 커서를 삽입된
빈줄에 위치 시킨다.(newline-and-indent)
C-x C-o : 커서가 있는 줄 바로 아래에 빈 줄들을 삭제.(delete-blank-lines)
----------------------------------------------------------------------

**커서 위치
----------------------------------------------------------------------
.M-x what-page : 포인트가 있는 페이지 번호와 그 페이지의 몇번째 줄에 있는
준다.
.M-x what-line : 전체 버퍼에서 포인트가 몇번째 라인에 있는지를 알려 준다.
.M-x line-number-mode : 현재 버퍼에서 커서가 몇번째 라인에 위치해 있는지를
모드라인에 표시한다. 이 명령은 토글 명령이다.
.M-= : 버퍼에서 선택된 영역의 라인 수와 문자의 수를 알려준다.
.C-x = : 현재 커서의 위치에 있는 문자의 코드값, 커서의 위치, 커서가 있는 컬럼의 위치를 알려준다
----------------------------------------------------------------------

참고
----------------------------------------------------------------------
이맥스에서 페이지 구분은 page-delimiter 변수에 저장된 문자로 하게 된다.
page-delimiter 변수가 정의 되어 있으면 페이지 이동 명령을 사용하여 페이지
단위로 이동할 수가 있다.
이 변수가 설정되어 있지 않으면 전체 버퍼를 하나의 페이지로 인식한다.
.C-x ] : 한 페이지 앞으로 이동(forward-page)
.C-x [ : 한 페이지 뒤로 이동(backward-page)
page-delimiter변수는 아래와 같이 설정할 수가 있다.

M-x set-variable page-delimiter <변수값>

영구적으로 설정하기 위해서는 이맥스 설정 파일인 ~/.emacs 파일에 아래 내용을
추가한다.

(setq page-delimiter "변수값")

디폴트 page-delimiter 변수 값은 ^L (C-q C-l)이다
----------------------------------------------------------------------

**텍스트 되살리기(붙이기)
위에 삭제, 복사 명령으로 한 문자 이상(C-d 명령으로 지운 문자는 버퍼에
저장되지 않는다)을 지웠다면 이맥스는 그 내용을 버퍼에 저장한다.
이렇게 버퍼에 저장된 문자들은 C-y 명령으로 버퍼에서 불러와 현재 커서 위치에
붙여넣을 수가 있다.

C-y (yank)명령은 바로 전에 버퍼에 저장된 것만을 불러 온다.
그 전에 버퍼에 저장된 문자를 불러 올려면 C-y 명령후 계속해서 M-y를 누르므로
전에 버퍼에 저장된 내용을 불러 올수가 있다.

**명령 반복
Emacs의 모든 명령들을 여러 번 반복할 수도 있다.
C-u 를 누른후 반복할 숫자를 써주고, 그리고 반복할 명령을 쳐주면 된다.
만약 <메타>키가 있으면 C-u를 칠 필요없이 숫자를 치는 동안 <메타>키를 누르고
있으면 된다.
그러나 <메타>를 사용할 경우 몇몇 터미널에서는 작동이 안될 수 있다.
이럴 경우에는 C-u 명령을 사용하면 된다.

C-u 8 -

이 명령은 "-"를 8번, 즉 "-" 문자를 8번 입력하라는 뜻이다.

C-u 를 아무 인자 없이 사용하면 기본적으로 4번 반복을 의미한다.
C-u C-n 하면 아래로 4줄 이동한다.
C-u 를 반복하여 사용하면 4의 승수로 반복 횟수가 올라간다.
C-u C-u 은 4X4, 16번의 반복을 의미하고, C-u C-u C-u 는 4X4X4, 64번 반복을
C의미한다.

하지만, C-v, M-v의 경우는 예외로, C-u 8 C-v를 치면 8화면이 지나가는 것이
아니라, 단지 8줄만 지나가도록 되어 있다.

**실행 취소(UNDO)
위에서 C-g는 미니 버퍼상에서의 취소 명령이라고 이야기 했다.
텍스트 편집 상태에서는 C-x u (advertised-undo)명령으로 편집 취소를 할 수가
있다.
반복해서 C-x u 명령을 사용하면 문서를 완전히 처음(모드라인에 **가 없어질
때까지)으로 돌릴 수가 있다.
C-_ 명령 역시 동일한 명령이다.
편집 상태 취소 명령은 C-u 명령과 같이 사용하여 반복할 수 있다.

C-u 5 C-x u

위 명령은 취소 명령을 3번 반복한다.
커서 이동은 편집 취소 명령에 대상이 되지 않는다.

**문장 정렬
문장을 쓸때 특히 제목을 쓴다든지 타이틀을 붙일때 유용하게 사용할 수 있다.

M-s : 커서가 있는줄을 중심에 오게 한다.(center-line)
M-S : 구문을 화면의 중심에 위치 시킨다.(center-paragraph)
M-x center-region : 범위를 설정하여서 중심 잡기를 한다.

**이맥스 파일 명령
이맥스에서 파일에 대한 명령은 모두 C-x 로 시작한다.
보통 C-x는 파일, 버퍼에 관련된 명령에 사용되는 접두 명령 정도로 생각하면
된다.
여기서 모든 명령을 다룰수는 없고 몇가지만 설명을 하겠다.

C-x C-f : 파일을 여는 명령이다. 위 명령을 내리면 미니 버퍼에 "find file"
이라는 프롬프트가 나온다.
여기서 편집하기를 원하는 파일이름을 경로명과 같이 입력한다.
그 파일이 존재 하지 않으면, 그 파일 이름으로 새로운 편집 버퍼를 할당한다.
bash와 이맥스가 모두 GNU 프로젝트에서 나온 프로그램임을 알고 있다면 bash의
명령행 자동 완성 기능이 find file 프롬프트에서도 동작하리라 예상 할 수
있을것이다.

C-x C-v : C-x C-f 명령으로 읽어들인 파일이 원하는 파일이 아닐 경우 파일을
교체하라는 명령.
이맥스는 복수개의 버퍼에서 복수개의 파일을 편집할 수가 있다.
이럴 경우 버퍼가 너무 많아 지면 버퍼 관리가 곤란해 질수 있다.
이럴경우 필요 없는 파일을 C-x C-v 명령으로 다른 파일로 교체하여 불필요한
버퍼 생성을 막을 수가 있다.(find-altenate-file)

C-x i : 현제의 버퍼의 커서 위치에 다른 파일을 읽어 들인다.(insert-file)

C-x C-s : 현재 편집중인 문서를 저장한다.
일반 워드 프로세서의 저장에 해당한다.

C-x C-w : 현재 편집중인 문서를 새로운 파일에 다른 이름으로 저장한다.
일반 워드 프로세서의 Save as 명령과 동일하다.

만약 위의 명령을 실행 할려다 마지막 를 치기전에 생각이 바뀌었다면..?
위에서 언급한 C-g 명령을 기억하기 바란다.

**이맥스 버퍼 명령
파일을 편집하는 각각의 객체들을 이맥스에서는 버퍼라고 부른다.
종종 버퍼를 파일로 오인하는 경우도 있는데, 근본적으로 다른 개념이다.
간단하게, 버퍼는 파일을 편집을 하기위해 실제 파일을 불러 들이는 임시적인
작업 공간으로 보면 된다.
버퍼는 여러가지 다른 기능도 있으나, 기본적으로 편집 작업을 위한 파일의
복사본이다.
이맥스에서 실제적으로 편집을 하는건 하드에 있는 실제 파일이 아니라 버퍼
영역에 불러온 파일이다.
이맥스에서 버퍼를 저장하라고 명령을 내기 전까지는 하드디스크의 실제 파일은
변하지 않는다.
버퍼라는 개념은 왠만한 편집기에는 다 있는 개념으로 vi에도 버퍼라는 개념이
존재한다.
하지만 Emacs가 훨씬 발전 형태의 버퍼를 제공한다.
다수의 버퍼는 다수의 윈도우(프레임)에 열어서 각각의 버퍼사이를 이동해 가며
편집을 할 수가 있다.

이미 파일을 편집하고 있는 상태에서 C-x C-f 명령으로 새로운 파일을 연다면
첫번째 파일은 그대로 남아 있는 채로 새로운 버퍼가 생성되면서 파일이 열린다.
여러 파일이 열려 있는 상태에서 C-x C-f 명령으로 이미 열려있는 파일을
지정하면 그 화면으로 스위치 된다.
여기서 C-x C-f 가 find-file 이라는 의미가 분명해진다.

----------------------------------------------------------------------
C-x C-b : 현재 열려있는 모든 버퍼를 새로운 창에서 리스트한다.
각 버퍼의 이름은 보통 현재 편집중인 파일의 이름을 가지고 있다.(list-buffers)
하지만 아떤 버퍼들은 파일과 관련 없는 이름을 가지고 있는 경우도 있다.
예를 들어 *Buffer List* 라는 이름의 버퍼는 아무 파일도 가지고 있지 않다.
그것은 단지 C-x C-b 명령으로 버퍼 리스트를 보여주는 임시적인 버퍼일 뿐이기
때문이다.

C-x b : 버퍼 메뉴를 통하지 않고 버퍼명을 통해서 버퍼사이를 전환한다.
아무런 인수를 주지 않는다면 바로 전에 열었던 버퍼로 이동한다.
인수로 버퍼 리스트에 존재하지 않는 이름을 주게 되면 새로운 버퍼를
생성하면서 커서를 새로 생성된 버퍼로 옮긴다.(switch-to-buffer)

C-x k : 현재 편집 중인 버퍼를 삭제.
자동 저장 파일은 삭제되지 않기 때문에 다시 편집을 시도 하려면 M-x
recover-file <버퍼명(파일명)>을 입력하면 된다.(kill-buffer)

M-x kill-some-buffers : 미니 버퍼에 차레대로 버퍼명을 물으면서 삭제할지를
물어본다.

M-x rename-buffer : 파일명이 같은경우 버퍼또한 같은 명을 가지게 된다
버퍼명은 패스는 기억을 안하므로 버펴명은 같을 수 있다.
파일 명이 같을 경우 버퍼명은 읽어 들인 순서로 file[1], file[2]의 형태를
취한다.
이걸 피하고 싶은 경우 이명령을 이용해 버퍼명을 바꿀수 있다.

C-x s : 버퍼를 파일로 저장.(save-some-buffer)
----------------------------------------------------------------------

버퍼 메뉴 리스트(C-x C-b)에서 키명령.
dired 모드에서의 키조작과 흡사하다.
버퍼 메뉴 리스트는 새로운 창에서 나타나는데 C-x o 명령으로 윈도우 사이를
이동 할 수가 있다.
----------------------------------------------------------------------
C-n : 리스트의 아레로, 즉 다음 버퍼로 이동.(space도 같은 명령)
C-p : 리스트의 위로 이동.
d : 삭제할 버퍼를 표시. D 마크를 붙인다. x 를 누르면 지운다.
k : 버퍼를 지우도록 D 마크를 붙인다. x 를 누르면 지운니다.
s : 버퍼를 저장하도록 S 마크 표시. x 를 누르면 저장.
u : 마크를 지운다.
x : 마크가 행해진 버퍼에 대해 마크의 내용을 실행 한다.
DEL : 바로전에 한 마크를 지운다(취소한다).

C-x C-q : 버퍼를 ReadOnly모드로 토글.

1 : 커서가 있는 버퍼를 화면 전체 편집 모드로 들어간다.
2 : 커서가 있는 버퍼를 2번 째의 윈도우에 로드. 버퍼 메뉴가 2번째위
윈도우에 행 해졌으면 그 윈도우에 버퍼를 로드 한다.

f : 버퍼 리스트 윈도우에 버퍼를 로드.
o : 다른 윈도우에 버퍼를 로드.
m : 버퍼명의 좌즉에 * 마크를 붙인다.
q(buffer list quit)를 행하면 그 윈도우에 마크된 버퍼가 로드.

q : 버퍼리스트를 빠져 나간다.

-버퍼 메뉴에 쓰이는 기호를 알아 보자
. 현재 보여지고 있는 윈도우(displayed)
* 버퍼가 수정된 경우.
% 읽기 전용 버퍼(ReadOnly), C-x C-q 로 만들 수 있다.
D 지우기 위해 마크한 버퍼
> m 으로 인해 찍힌 버퍼, marked for display
S 저장하기 위한 버퍼

----------------------------------------------------------------------

여러개의 파일을 여러개의 버퍼에서 편집할 경우 C-x C-s 명령으로 사용자가
각각의 버퍼에 있는 파일들을 직접 저장하지 않는다면 이맥스는 각 버퍼에서
편집중인 파일들을 자동으로 저장하지 않는다.
이미 열려져 있는 파일을 저장하기 위해서는 C-x C-f 또는 C-x C-b 명령으로
파일을 찾아가 사용자가 직접 파일을 저장하여야 한다.
모든 버퍼에 파일들을 일괄적으로 저장하기 위해서는 아래 명령을 사용할 수가
있다.

C-x s

모드느 버퍼를 순회하면서 파일들을 저장할 것인지를 사용자에게 물어본다

**이맥스 윈도우 관련 명령

----------------------------------------------------------------------
C-x 2 : 화면 중앙을 갈라 두개의 윈도우를 만든다.(split-window-horizontally)
C-x 3 : 화면의 수직으로 윈도우를 가른다.(split-window-vertically)
C-x o : 윈도우가 여러개 열려있을 경우 시계 방향으로 차례대로 이동.(other-window)
C-x 0 : 현재 커서가 있는 윈도우를 지운다다.(delete-window)
C-x 1 : 다른 윈도우를 지웁니다.(delete-other-window)

M-x delete-windows-on : 윈도우를 모두 지운다. 커서가 있는 윈도우도 `y'를
입력하면 지운다.

C-^ : 커서가 있는 윈도우를 크게 한다.(enlarge-window)
C-x > : 윈도우를 오른쪽으로 스크롤 한다.
C-x < : 윈도우를 왼쪽으로 스크롤 한다.
M-x shrink-window : 커서가 있는 윈도우를 작제 한다.
C-} : 수평으로 윈도우를 키운다.(enlarge-window-horizontally)
C-{ : 수평으로 윈도우를 줄인다.(shrink-window-horizontally)

M-C-v : 다른 윈도우를 스크롤 합니다. 다음 내용을 보려(scroll-other-window)
C-x 4 f : 다른 윈도우에 파일을 연다.(fine-file-other-window)
C-x 4 b : 다른 윈도우에서 다른 버퍼를 선택

M-x compare-window : 두 윈도우 즉, 두 버퍼를 비교한다.
----------------------------------------------------------------------
X 윈도우 시스템에서는 마우스로 창 사이를 전환할 수 있다.

**X 윈도우에서의 이맥스
X 윈도우를 사용한다면 이맥스 윈도우에 국한되지 않고 X 윈도우를 여러개
사용할 수가 있다.
이것을 이맥스 자체 윈도우와 구별하기 위해서 프레임(frame)이라 부른다.

프레임 명령
----------------------------------------------------------------------
C-x 5 2 : 현재 버퍼와 연결된 새로운 프레임을 생성(make-frame)
C-x 5 o : 다른 프레임으로 이동(other-frame)
C-x 5 0 : 현재 프레임을 삭제(delete-frame)
C-x 5 r : 새로운 프레임을 생성하고 파일을 읽기 전용으로 연다.
(find-file-read-only-other-frame)
C-x 5 f : 새 프레임에 편집할 파일을 연다.(find-file-other-frame)
C-x 5 b : 새 프레임을 생성해서 다른 버퍼를 그 안에 띄운다.
(switch-to-buffer-other-frame)
----------------------------------------------------------------------

**북마크 기능
여러개의 파일로 작업하거나 여러날 작업할 경우 각각의 파일에서 작업했던
현재 위치를 기억하기란 참으로 어렵다.
이맥스의 북마크 기능을 이용하면 어느 파일이든지 사용자가 언하는 위치를 쉽게
찾을 수가 있다.
북마크는 홈디렉토리에 .emacs.bmk라는 파일에 저장된다.
북마크를 새로 추가하면 이맥스 종료시 이 파일에 자동적으로 기록된다.
Search 메뉴에서 Bookmarks를 선택하면 필요한 북마크 명령을 볼수가 있다.
북마크 메뉴는 다른 메뉴들과는 달리 상당히 잘 개발 되었으므로 메뉴를
사용하는것도 좋을것이다.

***북마크 설정
편집하던 문서의 커서 위치에서 북마크를 만들려면 C-x r m (bookmark-set)
명령을 사용한다.
북마크의 이름을 물어오는데 사용자가 임의의 이름을 입력할 수가 있다.
문자열 중간에 공란이 들어가도 괜찮다.
디폴트는 파일 이름을 사용한다.

만약 이미 사용된 북마크 이름을 사용하면 이맥스는 이전의 북마크를 옮기는
것으로 간주한다..

***북마크로 이동
설정된 북마크로 이동하기 위해서는 C-x r b (bookmark-jump)를 누른다.
북마크 이름을 입력하거나 몇 글자를 입력하고 탭(Tab)키를 누르면 이름이
완성되거나 선택 가능한 목록이 나열된 윈도우가 나온다.
북마크 이름을 넣고 Enter 키를 누르면 파일이 열리면서 북마크된 곳으로 커서를
위치시킨다.

***북마크 이름 변경 및 삭제
북마크가 많아지면서 북마크 이름을 체계적으로 관리할 필요가 생길때 북마크의
이름을 아래 명령으로 바꿀수가 있다.
M-X bookmark-rename
그러면 Old bookmark name 이라는 표시가 나오며, 이전 북마크 이름을 적은 후에
Enter 키를 누른다.
그러면 New name 이라는 표시가 나오며 새로운 이름을 적운 후에 다시 Enter
키를 누르면 북마크 이름을 변경할 수가 있다.

북마크 삭제는 M-x bookmark-delete 명령으로 할 수가 있다.
삭제하려는 북마크 이름을 입력하면 북마크를 삭제할 수가 있다.

***북마크 목록 리스트
북마크 목록의 경우도 버퍼 목록과 비슷하며 한 글자 명령어로 북마크 목록에
대한 작업을 할 수가 있다.

북마크 목록을 불러 들일려면 C-x r l 명령을 사용한다.

북마크 목록의 키명령
----------------------------------------------------------------------
d : 삭제할 북마크를 표시
r : 북마크 이름을 변경
s : 나열된 북마크를 저장
f : 현재 커서가 위치한 북마크를 화면에 띄운다.
m : 여러 개의 윈도우에 띄우기 위한 북마크를 표시한다.
v : 표시한 북마크를 화면에 띄우거나, 아무것도 표시된 것이 없으면 커서가
위치해 있는 북마크를 화면에 띄운다.
t : 북마크와 관련되 파일의 위치를 표시한다.
w : 북마크와 관련되 파일의 위치를 표시한다.
x : 삭제 표시된 북마크를 삭제한다.
u : 북마크 목록에서 표시한 것을 취소한다.
q : 북마크 목록을 종료
----------------------------------------------------------------------

*탐색과 치환
이맥스 역시 다른 편집기와 마찬가지로 파일 전후로 검색을 할 수 있는 기능을
제공한다.

점진 탐색은 찾고자 하는 문자열의 첫 글자를 입력하자마자 탐색을 시작한다.
초보자들이 사용하기에는 좀 어려운감이 있지만 많은 장점이 있다.

탐색 명령
----------------------------------------------------------------------
C-s : 점진적 탐색.
문자를 입력할 때 마다 탐색을 계속해 파일의 끝을 행해서 나간다.
찾는 단어를 다입력했어도 찾는 단어가 그 것이 아니면 C-s 를 누르면 계속
진된다.(isearch-forward)
C-r : C-s와 방법은 같으나 방향이 파일의 위를 행해 진한다.(isearch-backward)
C-s C-w : 커서가 있는 곳의 단어를 탐색 문자열로 사용해 점진적 탐색을 시작.
C-s C-y : 커서가 있는 곳부터 줄 끝까지의 텍스트를 탐색 문자열로 사용해서 점진적 탐색을 시작.
C-s ESC y : 버퍼의 텍스트를 탐색 문자열로 사용해서 점진적 탐색 시작.
C-s C-s : 이전 탐색을 반복한다.

C-s <찾는 문자열> : 단순 탐색.
간단한 문자열일 경우 이 형식을 이용한다.
계속 진행시에는 C-s 를 누르면 반복된다. 방향은 C-s와 같이 앞을 향합니다.
C-r <찾는 문자열> : 위와 같으나 방향만 반대입니다.

C-s C-w : 아래 방향으로 단어 탐색.(word-search-forward)
C-r C-w : 위로 단어 탐색. (word-search-backward)
여러개의 단어도 가능하다. C-r C-w they are
----------------------------------------------------------------------

치환 명령
----------------------------------------------------------------------
M-x replace-sring <원래 문자> <바꿀 문자> :
커서 위치부터 아래로 모든 일치되는 모든 문자를 바꾼다.

M-% : 질의 치환을 시작.(query-replace)

-Query 치환에 쓰이는 키
Space 또는 y : 치환을 하고 다음 으로 넘어간다.
DEL 또는 n: 치환을 안하고 다음으로 넘어간다.
. : 현재 찾은것을 치환하고 탐색을 중지
, : 치환을 하고 바뀐 결과를 본다.(space 또는 y를 누르면 다시 이동)
! : 남이 있는 문자열들에 대해 질의 없이 치환.
^ : 방금 전에 행한 치환 부분으로 돌아 간다.
ESC 또는 C-g : 질의 치환을 빠져 나간다. Quit
C-r : 재귀적 편집을 시작한다.
C-w : 현재 찾은 것을 지우고 재귀 편집 상태로 들어간다.
ESC C-c : 재귀 편집을 끝내고 질의 치환을 계속한다.
C-] : 재귀적 편집을 빠져나가고, Query replace또한 빠져 나간다.
----------------------------------------------------------------------

참고
----------------------------------------------------------------------
재귀 편집
질의 치환 도중에 수정해야 할 다른 부분이 있는 것을 보게 될 경우가 있다.
이럴 경우 보통은 하던 질의 치환을 모두 마치고 도중에 발견된 부분에 대해
수정을 하거나 아니면 하던 질의 치환을 중지하고 발견된 부분에 대해 수정
작업을 하려 할 것이다.

하지만 이맥스의 경우 재귀 편집을 할 수가 있어 하던 질의 치환을 멈추거나
끝날때까지 기다릴 필요가 없다.
----------------------------------------------------------------------

-정규 표현에 의한 탐색
^ : 라인의 시작과 일치합니다. 라인의 시작점
$ : 라인의 끝을 나타냅니다.
. : 어떤 문자 하나를 나타냅니다. 파일명의 ? 와 같습니다.
.* : 여러개의 문자를 나타냅니다. 문자는 0개나 몇개든 가능합니다.(wildcard를
생각하면 됩니다.)
< : 단어의 처음과 매치합니다.
> : 단어의 끝과 매치합니다.

M-C-s <찾을 정규 표현식> : 정규 표현식 전진 탐색
M-C-r <찾을 정규 표현식> : 정규 표현식 후진 탐색
M-C-S : 정규 표현식의 점진적 전진 탐색
M-C-R : 정규 표현식의 점진적 후진 탐색
C-M-% : 정규 표현식의 질의 치환

참고
----------------------------------------------------------------------
탐색이나 치환 작업을 하다 오타로 인해서 다시 명령을 입력해야 할 경우
처음부터 명령을 다시 입력할 필요없이 "C-x ESC ESC"를 누르면 마지막으로
입력했던 명령이 나타난다.
이것이 원하는 명령이 아니면 M-p를 눌러서 그 이전의 명령을 볼수가 있다.
M-p는 다음 명령을 보여준다.
----------------------------------------------------------------------

*dired 모드
이맥스에서 디렉토리와 파일을 리스트해주는 모드로, C-x d 명령으로 시작한다.
이맥스를 시작할때 디렉토리를 인수로 주면 처음부터 dired 모드로 들어간다.

----------------------------------------------------------------------
Space : 현재 dired 모드에서 파일과 디렉토리들을 이동한다.
C-n, C-p 나 간단히 n, p 로도 이동할 수 있다.

d : 파일 삭제.(dired-flag-file-deletion)
지우고 싶은 파일에 커서를 두고 d를 누르면 좌측에 D가 표시된다.
이때까지는 아직 실제로 파일이 지워진게 아니다.
D로 표시된 파일을 실제로 지우기 위해서는 x 명령을 사용해야 한다.
x 명령을 내리면 d로 선택되어진 파일을 실제로 지울지를 묻는다.
이때 yes를 입력하면 실제로 파일을 지운다.
d 명령으로 복수개의 파일을 선택할 수도 있다.

D : 즉시 삭제 여부를 묻는다.(dired-do-delete)

~ : 파이명의 끝이 ~ 인 파일(백업 파일)을 다 지운다.
이 명령 역시 d 와 마찬가지로 x 를 눌러야 실제로 지워진다.

# : 자동 저장 파일인 #file# 들을 지운다.
이 명령 역시 d, ~ 와 마찬가지로 x 를 눌러야 실제로 지워진다.

u : d, ~, # 명령으로 선택된 파일의 선택을 해제할 때 사용.

m : *로 표시한다(dired-mark)

DEL : 바로전에 찍힌 D 자를 표시를 해제한다.

M-DEL : 모든 파일의 표시를 없앤다.(dired-unmark-all-files)

k : 화면 표시에서 해당 줄을 없앤다(파일이 삭제되는것은 아님)
(dired-do-kill-lines)

o : 다른 윈도우에 파일을 열고 그 윈도우로 이동
(dired-find-file-other-window)

C-o : 다른 윈도우에 파일을 여나 그 윈도우로 이동하지는 않는다.

e : 파일을 편집한다.(dired-find-file)
f : 파일을 편집한다.(dired-advertised-find-file)

v : 파일을 보기만 한다. 즉 readonly로 파일을 연다.
모드라인을 보시면 이 파일의 상태가 readonly라는것을 보여주는 %% 표시를
볼수가 있다.

C-x C-q 토글 명령으로 readonly 상태를 해제시킬수도 있다.

g : 디스크로부터 디렉토리를 다시 읽어 온다.(revert-buffer)

M : 파일의 퍼미션을 수정한다.
미니 버퍼에 Change Mode: 가나오면 8진수 또는 기호로 바뀔 모드를 입력한다.

R : 파일명을 바꾼다. 쉘상에서 mv 명령과 같은 역활을 한다.

C : 파일을 카피 한다. 쉘 상에서 cp 명령과 동일하다.(dired-do-copy)

G : 그룹의 퍼미션을 바꾼다.(dired-do-chgrp)

Z : 파일을 압축 또는 해제한다.(dired-do-compress)

= : 현재 파일을 표시해 둔 다른 파일과 비교한다.(dired-diff)

M-= : 현재 파일을 백업 파일과 비교한다.

! : 선택한 파일에 적용할 쉘 명령어를 입력한다.(dired-do-shell-command)

%d : 정규 표현식과 일치하는 파일에 삭제 표시한다(dired-flag-files-regexp)

%m : 정규 표현식과 일치하는 파일을 표시한다.(dired-mark-files-regexp)

+ : 디렉토리를 만든다(dired-create-directory)

> : 다음 디렉토리로 이동 (dired-next-dirline)

< : 이전 디렉토리로 이동 (dired-prev-dirline)

s : Dired 화면 표시를 날짜나 파일명순으로 재정렬. 토글 며령
(dired-sort-toggle-or-edit)
----------------------------------------------------------------------

*outline-mode
M-x outline-mode 로 시작하는 이 모드에서는 문서 구조의 관계에 따라 텍스트를
선택적으로 숨기거나 보여줄 수 있다.
개요 모드는 매우 간단한 내용을 포함한 평범한 텍스트 파일보다 여러 단계의
제목을 갖는 문서를 작성할 경우 유용하다.
문서의 길이가 길어질수록 전체 구조에 대한 감을 잡기가 어렵다.
이런 겅우 개요 모드의 특정 부분을 숨기거나 표시하는 기능을 사용하면
편리하다.

개요 모드 명령
----------------------------------------------------------------------
C-n C-n : 다음 제목으로 이동(outline-next-visible-heading)
C-c C-p : 이전 제목으로 이동(outline-previous-visible-heading)
C-c C-f : 같은 단계의 다음 제목으로 이동(outline-forward-same-level)
C-c C-b : 같은 단계의 이전 제목으로 이동(outline-backward-same-level)
C-c C-u : 한 단계 위의 제목으로 이동(outline-up-heading)
C-c C-t : 모든 본문을 숨긴다(hide-body)
C-c C-d : 주어진 제목에 관련된 부제목과 본문을 숨긴다(hide-subtree)
C-c C-c : 주어진 제목에 관련된 본문을 숨긴다(hide-entry)
C-c C-l : 주어진 제목의 본문과 부제목의 본문을 숨긴다(hide-leaves)
C-c C-a : 숨겨진 모든 것을 보여준다(show-all)
C-c C-s : 주어진 제목의 부제목과 본문을 보여준다.(show all)
C-c C-e : 주어진 제목의 본문을 보여준다(show-entry)
C-c C-k : 제목의 본문과 부제목의 본문을 보여준다.(show-branches)
C-c C-i : 주어진 제목 다음 단계의 부제목을 보여준다(show-children)
----------------------------------------------------------------------

*Calendar와 diary
달력 이동 명령
----------------------------------------------------------------------
. : 오늘 날짜로 이동(cal음endar-goto-today)
C-f : 다음 날짜로 이동(calendar-forward-day)
C-b : 이전 날짜로 이동(calendar-backward-day)
C-n : 다음주로 이동한다(calendar-forward-week)
C-p : 이전 주로 이동한다(calendar-backward-week)
M-} : 다음 달로 이동(calendar-forward-month)
M-{ : 이전 달로 이동(calendar-backward-month)
C-x ] : 다음 년도로 이동(calendar-forward-year)
C-x [ : 이전 년도로 이동(calendar-backward-year)
C-a : 해당 주의 처음으로 이동(calendar-beginning-of-week)
C-e : 해당 주의 끝으로 이동(calendar-end-of-week)
M-a : 해당 달의 처음으로 이동(calendar-beginning-of-month)
M-e : 해당 달의 끝으로 이동(calendar-end-of-month)
M-< : 해당 년도의 처음으로 이동(calendar-beginning-of-year)
M-> : 해당 년도의 끝으로 이동(calendar-end-of-year)
C-u n : 다음에 이어서 오는 명령을 n회 반복(universal-argument)
g d : 특정한 날짜로 이동(calendar-goto-date)
o : 특정한 달을 화면의 중앙에 위치 시킨다
C-x < : 화면을 한달 앞으로 스크롤한다.(scroll-calendar-left)
C-x > : 화면을 한달 뒤로 스크롤한다.(scroll-calendar-right)
space : 다른 윈도우를 스크롤한다.(scroll-other-window)
----------------------------------------------------------------------

a를 누르면 현재 달려에 나온 기간 내의 공휴일을 화면에 표시한다.
x를 누르면 공휴일이 설정에 따라 다른 폰트나 색깔로 공휴일을 나타낸다.
이것이 가능하지 않으면 오른쪽에 별표시를 한다.
u를 누르면 다시 원래대로 돌아간다.

일지(diary)는 달려과 밀접한 관계가 있으며, 특별한 날짜에 대해 간략한 메로를
적을 수 있다.
일지를 사용하려면 행사나 해야 할 일 등을 포함하는 .diary 파일이 홈
디렉토리에 있어야 한다.
없다면 "> .diary" 쉘명령으로 만들어 주면 된다.

달력과 일지에 대한 명령
----------------------------------------------------------------------
p d : 일년중의 몇번째 날인지 표시(calendar-print-day-of-year)
a : 화면에 표시된 기간중의 공휴일의 내용을 표시한다(list-calendar-holidays)
h : 해당 날짜가 공휴일인지 표시한다(calendar-cursor-holidays)
x : 공휴일을 다른 폰트, 컬러, 별포등으로 표시(mark-calendar-holidays)
u : 공휴일 표시를 없앤다(calendar-unmark)
i w : 현재 요일에 맞추어서 매주 반복되는 내용을 추가
(insert-weekly-diary-entry)
i y : 매년 반복되는 내용을 추가(insert-yearly-diary-entry)
i d : 특정한 날짜를 위한 내용을 추가한다.(insert-diary-entry)
i m : 매달 반복되는 내용을 추가(insert-monthly-diary)
i c : 매 n 번째 날짜마다 반복되는 내용을 추가(insert-cyclic-diary-entry)
i a : 매년 반복되는 내용을 추가(insert-anniversary-diary-entry)
i b : 기간에 해당하는 내용을 추가(insert-block-diary-entry)
m : 일지를 적은 날짜를 다른 폰트, 컬러, 덧셈기호등으로
표시(mark-diary-entries)
d : 해당 날짜의 일지 내용을 표시(view-diary-entries)
s : diary 파일의 내용 전부 표시(show-all-diary-entries)
M-= : 영역내의 날짜수를 세어서 표시(calendar-count-days-region)
M : 화면에 표시된 세 달 동안의 달의 위상을 표시(calendar-phases-of-moon)
S : 경도와 위도를 입력하면 해당 날짜의 일출, 일몰을
표시(calendar-sunrise-sunset)
C-space : 글자 단위가 아닌 날짜 단위로 영역을 표시(calendar-set-mart)
----------------------------------------------------------------------

*쉘 버퍼
이맥스를 실행하는 중에 리눅스 명령을 실행하려면 M-! 를 누르고, 미니 버퍼에
Shell Command 프롬프트가 나오면 실행하고자 하는 명령을 입력한후 Enter 키를
누른다.
만약 결과가 있다면 *Shell command Output*라는 이름의 새로운 윈도우가
생성되면서 결과를 리스트 한다.

*Shell command Output* 역시 버퍼이기 때문에 출력되는 결과는 저장, 편집등
일반 문서 편집에서 할 수있는 어떤것도 할 수가 있다.

C-u M-! 명령으로 쉘 명령을 실행하면 출력 결과를 *Shell command Output*
버퍼가 아닌 현재 편집중인 문서가 있는 버퍼로 결과를 보낼수가 있다.

*쉘 모드
M-x shell 명령으로 시작되는 쉘 모드는 쉘 버퍼 명령과 달리 리눅스 쉘 명령을
대화식으로 사용 할 수 있게 한다.
쉘 모드는 *shell* 버퍼를 만드면서 리눅스 쉘 프롬프트를 버퍼내에 표시한다.
거의 모든 부분이 쉘 모드는 일반 리눅스 쉘 인터페이스와 비슷하다.
단, 명령을 수정할때 이맥스의 편집 기능을 이용할 수 있다는 점이 다르다고 할
수 있다.
명령을 복사하거나, 명령의 결과를 편집중인 파일에 삽입하는 등 작업에 있어서
이맥스의 강력한 편집 기능을 사용할 수 있다.

이맥스 쉘 모드의 가장 큰 장점으로는 쉘 모드에서 명령을 실행하고 그 명령이
끝나기를 기다릴 필요가 없이 바로 다른 버퍼를 계속 편집할 수 있다는 것이다.
그러나 쉘 버퍼 명령(M-!, M-|)은 쉘 명령이 끝날 때까지 기다려야 한다.
쉘 모드에서 실행한 명령이 현재 작업을 방해하지 않으며 쉘 모드 명령의 결과는
쉘 모드 버퍼에 깨끗하게 저장된다.
다른 버퍼에서 쉘 모드 버퍼로 다시 돌아오기 위해서는 M-x shell 명령을 다시
입력하면 된다.
쉘 모드 버퍼 기본 이름은 *shell* 이며 이미 쉘 모드 버퍼가 있는 상태에서
M-x shell 명령을 다시 내리면 새로운 쉘 모드 버퍼가 생기는 것이 아니라 이미
존재하는 쉘 모드 버퍼로 전환된다.
그렇기때문에 여러개의 작업을 동시에 여러개의 쉘 모드에서 하기를 원한다면
M-x rename-uniquely 명령으로 쉘 모드 버퍼의 이름을 바꿔가면서 여러개의
쉘 모드 버퍼를 만들 수가 있다.

이맥스는 쉘 모드가 시작될때 explicit-shell-file-name, ESHELL, SHELL 변수를
차례로 확인하여 쉘 모드에서 시작될 쉘을 알아 낸다.
만약 지금 사용하는 기본 쉘 대신 다른 쉘로 이맥스 쉘 모드를 실행하기를
원한다면 .emacs 파일에 다음을 집어넣는다.

(setq explicit-shell-file-name "<쉘이 있는 완전한 경로명>")

쉘 모드를 시작하면 일반적인 쉘의 시작 파일(.bashrc)에 더해서 이맥스의 쉘
모들를 위한 쉘 초기화 파일(.emacs_bash)을 하나 더 실행한다.

.emacs_bash
----------------------------------------------------------------------
#TERM=emacs
CVSROOT=/var/lib/cvs
alias ll='ls -lFA'

if [ -d ~/bin ] ; then
PATH="~/bin:${PATH}"
fi
----------------------------------------------------------------------

기본적으로 쉘 모드에 입력한 것은 모든것이 화면에 보여진다.
심지어는 다른 계정으로 로그인(su) 하기 위해 패스워드를 입력하는 것조차도 화면에
그대로 나오게 된다.
이는 보안의 관점에서 그리 좋은것이 아니다.
이 문제를 피하기 위해서 패스워드를 입력하기 전에 M-x send-invisible 을
입력하면 이맥스가 화면에 표시하지 않을 문자열을 요구하면 입력하는 글자는
별표(*)가 미니버퍼에 표시된다.
Enter 키를 누르면 입력한 내용이 화면에 나타나지 않고 패스워드로 입력된다.

쉘모드 명령
----------------------------------------------------------------------
C-c C-c : 현재 작업을 중지. 리눅스 쉘의 C-c 와 동일(comint-interrupt-subjob)
C-d : 버퍼의 끝이면 EOF문자를 보내고, 그밖의 곳이면 글자 하나를 지운다.
(comint-delchar-or-maybe-eof)
C-c C-d : EOF문자를 보낸다(comint-send-eof)
C-c C-u : 현재 줄을 지운다. 리눅스 쉘의 C-u와 동일하다.(comint-kill-input)
C-c C-z : 현재 작업을 일시 중지. 리눅스 쉘의 C-z와 동일.
(comint-stop-subjob)
M-p : 이전에 입력했던 명령을 가져온다.반복 사용 가능.
(comint-previous-input)
M-n : 다음 명령을 가져온다. 반복 사용가능
(comint-next-input)
C-c C-o : 이전 명령의 출력을 삭제.(comint-kill-output)
C-c C-r : 출력의 첫 줄이 윈도우의 제일 위에 위치 시킨다.
(comint-show-output)
C-c C-e : 출력의 끝줄이 윈도우의 제일 아래에 위치한다.
(comint-show-maximum-output)
C-c C-p : 이전 명령으로 이동.(comint-previous-prompt)
C-c C-n : 다음 명령으로 이동.(comint-next-prompt)
----------------------------------------------------------------------

*쉘 모드에서 컬러링기능 방지
ls 컬러링 기능을 사용하기 위해서 보통은 .bashrc에서 ls를 알리아스시켜
ls 컬러링기능을 사용한다.
그런데 문제는 이맥스 쉘모드에서 컬러링된 ls를 사용하면 문자들이 깨진다는데
있다.

쉘환경에는 로그인 쉘과 비로그인 쉘이 있다.
로그인 쉘의 경우에는 .bash_profile을 참조하여 쉘환경을 설정하며
비로그인쉘은 .bashrc를 참조하여 쉘환경을 설정한다.
이맥스의 쉘모드는 비로그인 쉘이기때문에 .bashrc를 읽어와서 환경을
설정한다.
그렇기때문에 .bashrc에서 ls를 컬러링기능으로 알리아스시키면 글자들이
깨져나오게 된다.

그렇다면 .bashrc에서 ls를 알리아스하지 않고 다른곳에서 ls를 알리아스시켜 이
설정을 .bash_profile에서 읽어오게 된다면 로그인 쉘에서는 컬러링된 ls를
사용할 수 있고 그 외 이맥스 쉘모드 같은 비로그인 쉘에서는 일반 ls를 사용할
수 있게 된다.

~/profile.d 디렉토리를 만든다.
그리고 로그인 쉘환경에 포함시키고 싶은 설정이 담긴 파일을 만듭니다.

colorls.sh 파일 내용(ls의 컬러링기능 환경설정)
----------------------------------------------------------------------
# color-ls initialization
eval `dircolors`
if echo $SHELL |grep bash 2>&1 >/dev/null; then # aliases are bash only
alias ll='ls -la --color=auto'
alias l.='ls .[a-zA-Z]* --color=auto'
alias ls='ls -CF --color=auto'
alias l='ls -lF --color=auto'
fi
----------------------------------------------------------------------

이제는 이 설정 파일들이 로그인시 구동 할 수 있도록 ~/.bash_profile에
아래 내용을 추가한다.
----------------------------------------------------------------------
for i in ~/profile.d/*.sh; do
if [ -x $i ]; then
. $i
fi
done

unset i
----------------------------------------------------------------------

그리고 emacs 쉘모드에서 따로 알리아스 시켜 사용하고 싶은 설정이나 쉘환경이
있다면 ~/.bashrc에서 설정을 하여도 되지만 emacs에서만 사용하는 것이라면
~/.emacs_bash 파일을 만들어서 이맥스 쉘모드에서 사용할 환경을 설정을
해주는것이 더 좋다.

~/.emacs_bash
----------------------------------------------------------------------
TERM=emacs
PS1='[u@h:W]\$ '
alias ll='ls -la'
----------------------------------------------------------------------

개인이 즐겨 사용하는 쉘함수나 설정을 필요로 하는 기타 변수가 있다면 역시
따로 파일로 만들어 쉘 환경을 설정하여 자신만의 쉘 환경을 쉽게 관리할 수
있으리라 생각한다.

*Lisp 패키지와 설정 파일 바이트 컴파일 하기
요즘이 워낙 컴퓨터의 성능이 좋아져 꼭 그렇다는 할 수 없지만 예전에 이맥스의
단점으로 느린 로딩 속도를 들었다.
특히 이맥스의 경우 Lisp라는 스크립트언어로 무한의 확장성을 제공하기때문에
기본 설정 파일 조차도 이맥스를 조금만 사용하다 보면 상당히 내용이
방대해지기 마련이다.
이러한 이유가 그렇지않아도 느린 이맥스 로딩 속도를 더욱 더디게하는 하나의
요인이 되고 있다.

이런 문제를 해결하기위해 이맥스에서는 바이트 컴파일이라는 방법을 제시하고
있다.
바이트 컴파일이란 Lisp 언어로 이루어진 패키지 코드를 간결하고 기계가 읽기
쉬운 형태의 바이트 코드로 바꿔서 더 효과적으로 Lisp 파일을 로딩하고 실행할
수 있도록 하는것을 말한다.

거기다 이맥스20.4 부터는 기존에 .emacs로만 사용하였던 개인 초기 설정 파일도
.emacs.el로도 사용할 수 있게 하여 다른 패키지처럼 바이트 컴파일을 할 수 있게
되었다.

M-x byte-compile-file [ENTER]를 입력하고 바이트 컴파일 할 파일명을 입력하면
바이트 컴파일 할 수가 있다.
확장자 .el을 생략한 경우에는 자동으로 확장자를 붙여서 사용자에게 확인을
요구하게 된다.
그리고 나면 미니버퍼를 통해서 바이트 컴파일러가 동작하는 것을 볼 수
있다.
컴파일이 끝나면 원래 Lisp 파일명에 c가 붙은 파일명을 만듭니다.
filename.el 은 filename.elc 가 바이트 컴파일된 파일이되며 ~/.emacs.el 은
~/.emacs.elc, ~/.gnus.el 은 ~/.gnus.elc가 바이트 컴파일된 파일이 된다.

이맥스는 Lisp 패키지를 찾을때 filename 이 인자로 주어지면 먼저
filename.elc 가 있는지 찾는다.
이것이 존재하지 않으면 filename.el을 찾는다.
이것도 존재하지 않으면 마지막으로 filename을 찾게 된다.

만약 여러개의 Lisp 파일로 이루어진 디렉토리가 있을때 그 중 일부 파일을
수정한경우 라면 byte-recompile-directory 명령을 이용하여 바이트 컴파일된
이후에 변경된 Lisp 파일만 다시 컴파일할 수 있다.

*이맥스 설정 화일(.emacs, .gnus)
.emacs
----------------------------------------------------------------------
;;; emacs startup script -*- emacs-lisp -*-

(require 'mmm-mode) ;; mmm-mode 패키지 설치시 필요
(require 'generic-x) ;; 일반적인 설정 파일(아파치, 삼바..)들을 위한 모드
(require 'cc-mode) ;; C 프로그래밍 모드를 위해
(require 'font-lock) ;; 각 모드에서 컬러링을 위해서
;;(require 'mailcrypt-init) ;; gnupg를 쉽게 사용하게 해주는 mailcrypt 패키지를 위해
;; 패키지 인스톨스 전체 이맥스에 기본으로 들어가게 하지않으면 필요
(setq load-path (nconc '("~/emacs") load-path)) ;load-path 설정, 개인적인 이맥스 패키지를 넣어두는곳

;;indent with just spaces 들여쓰기 설정, 탭을 4칸으로 설정
(setq-default indent-tabs-mode nil)
(setq tab-stop-list '(4 8 12 16 20 24 28 32 26 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120))
(setq default-tab-width 4)

;; font lock
(global-font-lock-mode t) ;신택스 하이라이트 기능
(setq font-lock-support-mode 'lazy-lock-mode)
(setq lisp-font-lock-keywords 'lisp-font-lock-keywords-2)
(setq font-lock-face-attributes
;; FACE FG BG bold italic underline
'((font-lock-comment-face "green4" nil nil nil nil)
(font-lock-string-face "darkgreen" nil nil nil nil)
(font-lock-emphasized-face "black" nil t nil nil)
(font-lock-other-emphasized-face "red" nil nil nil nil)
(font-lock-other-type-face "darkgreen" nil nil nil nil)
(font-lock-keyword-face "blue4" nil t nil nil)
(font-lock-function-name-face "blueviolet" nil t nil nil)
(font-lock-variable-name-face "steelblue" nil t nil nil)
(font-lock-type-face "darkolivegreen")
(font-lock-constant-face "CadetBlue")))

;;하단 모드라인에 현재 커서의 줄과 칼럼위치 시간 표시(밑에 'mode line hacking'때문에 필요 없음)
;;(setq column-number-mode t)
;;(setq line-number-mode t)
;;(setq display-time-day-and-date t)

;; mode line hacking
(setq-default mode-line-format
'(""
(current-input-method ;input-method표시 선택이 않됐을 경우에는 현재 위치를 퍼센트로 표시
(3 . current-input-method-title)
(-3 . "%p"))
"%Z" ;키보드 코딩 시스템 표시
mode-line-modified
mode-line-buffer-identification
" %[(" mode-name mode-line-process minor-mode-alist "%n" ")%]" ;주모드및 보조 모드, 리커시브 편집표시
(which-func-mode ("" which-func-format))
(" " "L" "%l" "." "C" "%c") ;라인 및 컬럼 표시
global-mode-string ;display-time 표시
" "
default-directory))
(setq-default mode-line-modified '("%1*%1+"))
(setq-default mode-line-frame-identification '("%F"))
(setq-default mode-line-buffer-identification '("%b:<%p>")) ;파일을 열었을 경우 뒤에 현 파일의 위치를 퍼센트로 표시
;;(setq-default mode-line-buffer-identification '("%b:%l.%c<%p>")) ;라인과 컬럼을 같이 표시
;;(setq-default mode-line-buffer-identification '("%b")) ;파일 이름만을 표시

;display-time에 대한 표시설정
(setq display-time-string-forms
'(" " 24-hours ":" minutes
(if mail " " " " ) ;메일이 왔을 경우 표시
(if mail "" year) (if mail "" "/") (if mail "" month) (if mail "" "/") (if mail "" day)))
;; 메일이 없을 경우엔 year/month/day 형식으로 날짜를 표시

(display-time) ;; 위 설정으로 display-time을 표시

;; mode-line color ;; 모드 라인에 컬러를 설정
(when enable-multibyte-characters
(set-face-foreground 'modeline "blue")
(set-face-background 'modeline "khaki"))
(unless enable-multibyte-characters
(set-face-foreground 'modeline "Red")
(set-face-background 'modeline "Yellow"))

;; X 윈도 버젼3 이하에서 imwheel을 이용하여 휠마우스 사용할경우
;;(setq imwheel-scroll-interval 3)
;;(defun imwheel-scroll-down-some-lines ()
;; (interactive)
;; (scroll-down imwheel-scroll-interval))
;;(defun imwheel-scroll-up-some-lines ()
;; (interactive)
;; (scroll-up imwheel-scroll-interval))
;;(global-set-key [?M-C-)] 'imwheel-scroll-up-some-lines)
;;(global-set-key [?M-C-(] 'imwheel-scroll-down-some-lines)

;;Esheet 설정, Xemacs에서 사용
;;(if (equal (substring (version) 0 3) "GNU");;don't execute this in XEmacs!
;; (progn
;; (setq load-path (cons "~/emacs/esheet" load-path));;adjust directory as needed
;; (load "auto-autoloads")))

;;php-mode(로드패스로 지정된 곳에 있는 php.el을 사용) (우디에서는 데비안 패키지로 있음)
;(autoload 'php-mode "php-mode" "PHP editing mode" t)
;(add-to-list 'auto-mode-alist '("\.php$" . php-mode))

;;text-mode
(add-hook 'text-mode-hook
'(lambda ()
(turn-on-font-lock)
(modify-syntax-entry ?" """)
(modify-syntax-entry ?< "(>")
(modify-syntax-entry ?> ")<")))

;;html-helper-mode설정(우디에서는 데비안 패키지로 있음)
;;(setq load-path (cons "/home/pcharley/emacs/html-helper-mode/" load-path)) ;;개인이 다운 받은 패키지 사용시
(autoload 'html-helper-mode "html-helper-mode" "Yay HTML" t)
(setq auto-mode-alist (cons '("\html$" . html-helper-mode) auto-mode-alist))
(setq html-helper-build-new-buffer t)
(setq html-helper-address-string
"P.C.Harley <pcharley@orgio.net>")
(setq tempo-interactive t)
(setq html-helper-do-write-file-hooks t)


;; html-font 에 관한 설정(html-helper 모드에서 색깔 지정)
;; html-helper-mode 2.19.1 베타버젼에서 부터는 html-font 코드가 내장 되었습니다.
;;(add-hook 'html-helper-load-hook
;; '(lambda () (require 'html-font)))
;;(add-hook 'html-helper-mode-hook
;; '(lambda () (font-lock-mode 1)))


;;Programming Mode

;; C mode
(add-hook 'c-mode-common-hook
'(lambda()
(c-set-style "GNU")
(setq c-indent-level 4)
(setq c-continued-statement-offset 4)
(setq c-continued=brace-offset -4)
(setq c-recognize-knr-p nil)
(setq c-auto-newline t)
(setq c-hungry-delete-key t)
(c-set-offset 'inline-open 0)
(turn-on-font-lock)
(define-key c-mode-map [f9] 'compile)
(define-key c++-mode-map [f9] 'compile)))

(add-hook 'c++-mode-common-hook
'(lambda()
(c-set-style "GNU")
(setq c-indent-level 4)
(setq c-continued-statement-offset 4)
(setq c-continued=brace-offset -4)
(setq c-recognize-knr-p nil)
(setq c-auto-newline t)
(setq c-hungry-delete-key t)
(c-set-offset 'inline-open 0)
(turn-on-font-lock)
(define-key c-mode-map [f9] 'compile)
(define-key c++-mode-map [f9] 'compile)))

;;; Java mode
(add-hook 'java-mode-hook
'(lambda()
(turn-on-font-lock)))


;;; CPerl mode
(add-hook 'cperl-mode-hook
'(lambda()
(turn-on-font-lock)
(setq cperl-auto-newline t)
(setq cperl-indent-level 4)
(setq cperl-continued-statement-offset 4)
(setq cperl-brace-offset -4)
(setq cperl-label-offset -4)
(setq cperl-tab-always-indent t)))


;;; python mode
(add-hook 'phthon-mode-hook
'(lambda()
(turn-on-font-lock)
(setq py-indent-offset 4)
(setq py-python-command "python")
(setq py-temp-directory "/tmp")
(setq font-lock-keywords python-font-lock-keywords)))



;;;Emacs lisp mode
(add-hook 'emacs-lisp-mode-hook
'(lambda()
(turn-on-font-lock)))


;;; SQL
(add-hook 'sql-mode
'(lambda()
(turn-on-font-lock)
(setq sql-command "mysql")))

(autoload 'sql-mode "sql-mode" "SQL Editing Mode" t)
(setq auto-mode-alist
(append '(("\.sql\'" . sql-mode)
("\.tbl\'" .sql-mode)
("\.sp\'" . sql-mode)) auto-mode-alist))

;;dired-mode 깨끗하게는 표시되나 몇몇 파일들이 표시 되지 않는다.
;;(add-hook 'dired-load-hook
;; '(lambda ()
;; (load-library "dired-x")
;; (setq dired-omit-files
;; "^RCS$\|^CVS$\|,v$\|^\.?#\|^\.$\|^\.\.$")
;; (push ".cma" dired-omit-extensions)
;; (push ".cmi" dired-omit-extensions)
;; (push ".cmo" dired-omit-extensions)
;; (push ".cmx" dired-omit-extensions)))


;; disable some novice confirmation features.
(fset 'yes-or-no-p 'y-or-n-p) ;; 파일을 지우거나 할때 어떤 경우에는 이맥스가 yes or no로 물어보게 되는데 이를 y or n로 대신한다.
(setq dired-backup-overwrite 'always)
(setq dired-listing-switches "-al") ;dired-mode에서 전달되는 인수, ls -al과 같은 결과를 보여줌
(setq dired-omit-files-p t)
(setq dired-no-confirm
'(byte-compile chgrp chmod chown compress copy delete hardlink load
move print shell symlink uncompress))


;; auto mode alist 파일 확장자를 보고 모드를 불러오기 위한 설정
(setq auto-mode-alist
(nconc '(("\.ml[iylp]?\'" . caml-mode)
("\.sml\'" . sml-mode)
("\.grm\'" . sml-mode)
("\.ML\'" . sml-mode)
("\.html\'" . html-helper-mode)
("\.shtml\'" . html-helper-mode)
("\.thtml\'" . html-helper-mode)
("\.gnus\'" . emacs-lisp-mode)
("\.abbrev_defs\'" . emacs-lisp-mode)
("\el\'" . emacs-lisp-mode)
("\.s?html\'" . sgml-mode)
("\.tex\'" . latex-mode)
("\.ks$\'" . latex-mode)
("\.cl\'" . lisp-mode)
("\.cgi\'" . cperl-mode)
("\.pl\'" . cperl-mode)
("\.py\'" . phthon-mode)
("\.c\'" . c-mode)
("\.C\'" . c-mode)
("\.cc\'" . c++-mode)
("\.cpp\'" . c++-mode)
("\.h\'" . c++-mode)
("\.hh\'" . c++-mode)
("\.idl\'" . c++-mode)
("\.txi\'" . Texinfo-mode)
("\.java\'" . java-mode)
("\.prolog\'" . prolog-mode)
("\.pro\'" . prolog-mode)
("\.txt\'" . text-mode))
auto-mode-alist))


;;calender에서 휴일등을 한국에 맞게 표시
(require 'cal-china)
(defun from-chinese-to-gregorian (date-list)
"date-list is '(m d) or '(m d y) in chinese date"
(let* ((date (if (= (length date-list) 2)
(append '(12 31)
(cdr (cdr (calendar-current-date))))
(append '(12 31) (cdr (cdr date-list)))))
(c-date (calendar-chinese-from-absolute
(calendar-absolute-from-gregorian date)))
(cycle (car c-date))
(year (car (cdr c-date)))
(month (car date-list))
(day (car (cdr date-list))))
(calendar-gregorian-from-absolute (calendar-absolute-from-chinese
(list cycle year month day)))))

(setq korean-new-year-day (from-chinese-to-gregorian '(1 1)))
(setq buddha-day (from-chinese-to-gregorian '(4 8)))
(setq korean-thanksgiving-day (from-chinese-to-gregorian '(8 15)))
(setq other-holidays
'((holiday-fixed 1 1 "New Year's Day")
(holiday-fixed (extract-calendar-month korean-new-year-day)
(extract-calendar-day korean-new-year-day)
"Lunar New Year's Day")
(holiday-fixed 3 1 "Anniversary of the Samil Independence Movement")
(holiday-fixed 4 5 "Arbor Day")
(holiday-fixed 5 5 "Children's Day")
(holiday-fixed (extract-calendar-month buddha-day)
(extract-calendar-day buddha-day)
"Buddha's Day")
(holiday-fixed 6 6 "Memorial Day")
(holiday-fixed 7 7 "Constitution Day")
(holiday-fixed 8 15 "Independence Day of Korea")
(holiday-fixed (extract-calendar-month korean-thanksgiving-day)
(extract-calendar-day korean-thanksgiving-day)
"Korean Thanksgiving Day(Harvest Moon Day)")
(holiday-fixed 10 3 "Anniversary of Dangun's Accession")
(holiday-fixed 12 25 "Christmas Day")))
(setq local-holidays '((holiday-fixed 4 13 "Assemblyman Election Day")))
(setq calendar-holidays (append other-holidays local-holidays))

;; diary & calendar
(setq cal-tex-diary t)
(setq diary-file "~/.diary")
(setq diary-list-include-blanks t)
;;(autoload 'fancy-schedule-display-desk-calendar "cal-desk-calendar")
;;(add-hook 'diary-display-hook 'fancy-schedule-display-desk-calendar t)
(add-hook 'diary-display-hook 'sort-diary-entries)
(add-hook 'initial-calendar-window-hook 'mark-diary-entries)
(add-hook 'initial-calendar-window-hook 'mark-calendar-holidays)
(setq today-visible-calendar-hook 'calendar-mark-today)
(add-hook 'diary-display-hook 'fancy-diary-display)
(add-hook 'list-diary-entries-hook 'include-other-diary-files)
(add-hook 'list-diary-entries-hook 'sort-diary-entries)
(add-hook 'mark-diary-entries-hook 'mark-included-diary-files)


;;mail &message setting 이맥스에서 메일을 보낼때 환경 설정
;;(setq user-mail-address "pcharley@orgio.net") ;이메일 주소
(setq mail-archive-file-name "~/Mail/outgoing") ;발송메일을 저장하는파일명
(setq mail-yank-prefix ">") ;메일 답장할때 원본내용 앞에 삽입할 문자

(setq message-user-organization "Unix Network World")
(setq message-default-headers
(concat "Mime-Version: 1.0n"
"Content-Type: text/plain; charset=euc-krn"
"Content-Transfer-Encoding: 8bitn"
"Reply-to: pcharley@orgio.netn"
"Gcc: nnfolder+archive:mail."
(format-time-string "%Y-%m") "n"
))

;;mailcrypt 패키지 설정

(mc-setversion "gpg") ;;pgp대신 gpg사용을 위해, 디폴트는 pgp
(autoload 'mc-install-write-mode "mailcrypt" nil t)
(autoload 'mc-install-read-mode "mailcrypt" nil t)
(add-hook 'gnus-summary-mode-hook 'mc-install-read-mode)
(add-hook 'message-mode-hook 'mc-install-write-mode)
(add-hook 'news-reply-mode-hook 'mc-install-write-mode)

;; 모든 메세지에 자동으로 sign을 보내기 위해 사인한 메세지를 보낼지 물어봄
(add-hook 'message-send-hook 'my-sign-message)
(defun my-sign-message ()
(if (yes-or-no-p "Sign message? ")
(my-sign-message)))

;;
;;기타 설정
;;

;;(setq-default auto-fill-function 'do-auto-fill) ;auto-fill모드 설정

;;키 바인딩
;;(global-set-key [delete] 'delete-char)
;;(global-set-key [home] 'beginning-of-line)
;;(global-set-key [end] 'end-of-line)
;;(global-set-key [f5] 'delete-other-windows)

;;검색 환경 설정
;;(setq-default case-fold-search nil) ; 대소문자를 구분하여 검색 기본은 t
;;(setq-default case-replace nil) ; 치환 시에 대소문자를 변경하지 않는다 기본은 t

;;새로운 프레임 생성시 크기 설정
(setq initial-frame-alist '((width . 90) (height . 35)))
(setq default-frame-alist '((width . 90) (height . 35)))

(eval-and-compile
(require 'cl)
(require 'backquote)
(defsetf frame-parameter (frame parameter) (new-value)
`(progn
(modify-frame-parameters ,frame (list (cons ,parameter ,new-value)))
,new-value))
(defsetf default-frame-parameter (parameter) (new-value)
`(progn
(setq default-frame-alist
(cons (cons ,parameter ,new-value)
default-frame-alist))
,new-value)))

;;; frame looking change 스크롤바설정...
(setf (frame-parameter nil 'scroll-bar-width) 7)
(setf (default-frame-parameter 'scroll-bar-width) 7)
(setf (frame-parameter nil 'vertical-scroll-bars) 'right)

;;(setq explicit-shell-file-name "/bin/bash") ;쉘명령이나 쉘환경에서 사용되는 쉘지정

;; fill paragraph (문단 구분을 위한 설정)
(setq-default paragraph-start "^[|:> tnc-l]*$")
(setq-default paragraph-separate (default-value 'paragraph-start))
(setq adaptive-fill-regexp (substring (default-value 'paragraph-start) 1 -1))

(setq-default fill-column 75) ;한 줄의 폭을 75 column으로 정함

;;이맥스를 처음 실행시켰을때 디폴트로 text모드로 작동하게 함
;;(setq default-major-mode 'text-mode)
;;(setq initial-major-mode 'text-mode)

(setq scroll-preserve-screen-position nil) ;nil이 아니면 전체 화면을 스크롤해도 화면의 커서 위치는 바뀌지 않음
(setq require-final-newline t) ;저장하는 파일의 끝에 LINEFEED가 없는 경우에 초기값이 nil이면 그것을
;추가하지 않고, t이면 자동으로 추가한다.
;그렇지 않으면 LINEFEED를 추가할 것인지 묻는다.
(setq track-eol nil) ;nil이 아니면 줄의끝에 커서가 위치할 때마다 커서를 위아래로 움직여도
;계속 줄 끝에 위치하도록 한다.
(setq kill-whole-line t)
(setq sentence-end-double-space nil) ;nil이 아니면 마침표 뒤에 빈칸 하나가 오는 경우를 문자의 끝으로 취급하지
;않는다
(setq transient-mark-mode t) ;범위 지정시 이 범위가 컬러로 다른 지역과 구분되게 하기 위해

;컬러 설정(범위지정시 범위가 다른 지역과 구분되게 설정 하였을 경우)
(set-face-foreground 'region "white")
(set-face-background 'region "mediumblue")

(setq next-line-add-newlines nil) ;문서의 가장 끝에서 down 키를 눌러도 newline삽입 방지

;검색및 치환을 할때 찾은 문자열 컬로 강조하여 표시되게 함
(setq search-highlight t)
(setq query-replace-highlight t)

;; make searching more convenient
(setq search-slow-speed (1+ (expt 2 24))) ;터미널속도가 설정값 이하면 느린 스타일의 점진적탐색을 사용
(setq search-slow-window-lines 7) ;느린 스타일의 점진적 탐색을 할 때 사용하는윈도우의 높이, 즉 줄 수를 의미

(setq blink-matching-delay 0.5) ;괄호,중괄호,대괄호를 타자할때 그 상대 괄호로 이동하여 표시할때 딜레이 시간

(setq mouse-yank-at-point t) ;nil이 아니면 click대신에 포인트가 위치한곳에서 yank명령으로 실행

;;(setq scroll-step 1) ;커서를 수직방향으로 이동해서 현재 윈도우를 벗어날 때 이 줄 수만큼 앞뒤로
;이동한다. 0이면 커서가 화면 중앙에 위치하도록 줄 수만큼 스크롤
;;(setq hscroll-step 1) ;커서를 수평방향으로 이동해서 현재 윈도우를 벗어날 때 이 열 수만큼 좌우로
;이동한다.0이면 커서가 화면의 중앙에 위치하도록 충분한 줄 수만큼 스크롤

;;(setq visible-bell t) ;경고음대신 화면에 역상표시
;;(setq ring-bell-function ;역상 표시와 함께 지정한 문자 메시지를 모드라인에 표시
;; '(lambda nil
;; (message "Ops..Something Wrong??")
;; (sit-for 1)))

;; ps print options버전 20부터 생긴 ps print옵션 설정
(setq ps-lpr-command "lpr")
(setq ps-print-header-frame nil)
(setq ps-header-lines 1)
(setq ps-landscape-mode t)
(setq ps-paper-type 'a4)
(setq ps-number-of-columns 2)
(setq ps-print-color-p nil)

;자동저장 기능 설정
(setq auto-save-default nil)
(setq make-backup-files nil)

(setq unibyte-display-via-language-environment t) ;현재 언어 설정에 맞추어 ASCII가 아닌 문자는 적절한 멀티바이트
;문자로 표시한다. 결과적으로 현재 폰트집합에 따라서 표시한다
;;
;;
(setq Info-fontify-maximum-menu-size 131072)
(setq Info-enable-edit t)
(setq ange-ftp-process-verbose nil)
(setq diff-switches "-u")
(setq disabled-command-hook nil)
(setq enable-local-eval t)
(setq enable-recursive-minibuffers t)
(setq kill-read-only-ok t)
(setq gc-cons-threshold 1000000)
(setq max-specpdl-size 3000)
(setq max-lisp-eval-depth 3000)
(put 'if lisp-indent-function 0)
(setq lisp-indent-function 'common-lisp-indent-function)
(setq comment-multi-line t)
(setq dabbrev-upcase-means-case-search t)
(setq url-be-asynchronous nil)
(setq browse-url-new-window-p t)
(setq pc-bindings-mode t)
(setq inhibit-startup-message t)

;;end my own setting
;;; .emacs.el ends here.

----------------------------------------------------------------------

.gnus 5.8이상
----------------------------------------------------------------------
;; quick and dirty hack to make gnus 5.8.x work properly
;; in korean environment
;;
(message "Loading ~/.gnus...")
(require 'cl)
(require 'gnus-sum)
(require 'mm-util)


;; due to the bug in M$ zoftware
(pushnew '(ks_c_5601-1987 . euc-kr) mm-charset-synonym-alist :test #'equal)
(put-charset-property 'korean-ksc5601 'preferred-coding-system 'euc-kr)
(setq gnus-newsgroup-ignored-charsets '(ks_c_5601-1987 iso-8859-1))

(setq gnus-group-posting-charset-alist
'(("^\(no\|fr\|dk\)\.[^,]*\(,[
]*\(no\|fr\|dk\)\.[^,]*\)*$" iso-8859-1 (iso-8859-1))
(message-this-is-mail nil t)
(message-this-is-news nil nil)))
(let ((default-entry
(find ".*" gnus-group-charset-alist :key #'car :test #'string=)))
(when default-entry
(setf (second default-entry) 'euc-kr)))

;; nnfolder에 archive된 한글 mail이 base64 encoding되지 않도록 함
(setq message-default-charset 'euc-kr)

;;뉴스서버및 기사 저장 디렉토리 지정
(setq gnus-select-method '(nntp "news.kornet.net")
;; name of the directory articles will be saved in
gnus-article-save-directory "~/News/"
;; directory variable from which all other Gnus file variables are derived
gnus-directory "~/News/"
;; variable to control where interactive score entries are to go
gnus-home-score-file
;; return the score file of the top-level hierarchy of GROUP
'gnus-hierarchial-home-score-file
;; directory where kill files will be stored
gnus-kill-files-directory (concat gnus-directory "score/")
)

;;메일을 위한 설정
;(setq gnus-secondary-select-methods
; '((nnml "private")))

;;메일을 그룹으로 나누기위한 설정 예
;;This will result in three new nnml mail groups being created:
;;`nnml:junk', `nnml:crazy', and `nnml:other'.
;;All the mail that doesn't fit into the first two groups will be
;;placed in the last group.
;(setq nnmail-split-methods
; '(("junk" "^From:.*Lars Ingebrigtsen")
; ("crazy" "^Subject:.*die\|^Organization:.*flabby")
; ("other" "")))

;;기사에 url이 있으면 netscape를 기본 브라우져로 선택
(setq gnus-button-url 'gnus-netscape-open-url)

;; "^" 명령으로 현재 기사의 부모기사를 찾을때 실패하면 w3를 이용해서 dejanews에서 찾음
;;(setq gnus-refer-article-method
;; '(current
;; (nnweb "refer" (nnweb-type dejanews))))

;; SUPERCITE ; sc.el
;;편지에 답장을 쓸때 본문인용을 할때
(setq gnus-use-sc t)
(add-hook 'mail-citation-hook 'sc-cite-original)
(setq message-cite-function 'sc-cite-original)
(autoload 'sc-cite-original "supercite")
(setq sc-fixup-whitespace-p t)
(setq sc-auto-fill-region-p nil)
(setq sc-preferred-attribution-list (list "sc-lastchoice" "initials"
"emailname" "lastname"))
(setq sc-citation-leader-regexp "^[]>|:}+ ]*[]>|:}+]\(.*>\)?\|^.*>")
; prevent too long citation
(setq sc-cite-region-limit 2000)
; delete unnecessary blank lines
(setq sc-cite-blank-lines-p nil)

;; eof
----------------------------------------------------------------------

*이맥스 모드
이맥스는 조금씩 다르게 동작하는 다양한 종류의 편집 모드를 제공한다.
모드는 이맥스가 현재 작업에 적합한 환경으로 바뀌는 것을 의미한다.
매 줄마다 리턴키를 누를 필요 없이 자동으로 줄바꿈 되거나, 프로그래밍 언어에
따라서 코드의 형식이 맞춰지거나....

이맥스는 보통 파일의 확장자(확장자가 c면 c 모드로, el이면 LISP 모드로, pl
이면 perl 모드로 설정된다.)를 보고 적합한 모드를 설정한다.

주 모드(Major Mode)
----------------------------------------------------------------------
Fundamental mode : 기본으로 설정되는 모드로 특별한 동작은 없다
Text mode : 텍스트 파일을 입력할 때
Mail mode : 메일을 작성한다.
RMAIL mode : 메일을 읽고 정리한다.
View mode : 파일을 보기만 하고 편집하지 않는다.
Shell mode : 이맥스에서 유닉스 명령을 실행하기 위해
Ange-ftp mode : 리모트 호스트에 파일을 보내거나 받는다.
Telnet mode : 원격 시스템에 로그인
Outline mode : 개용를 작성
Indented text mode : 텍스트 모드에서 자동으로 들여쓰기를 한다.
Picture mode : 간단한 선, 그림을 그릴때
nroff mode : norff용 파일을 구성할 때
TeX mode : TeX 파일을 작성할 때
LaTeX mode : LaTeX 파일을 구성할때
C mode : C 프로그램을 작성할 때
FORTRAN mode : FORTRAN 프로그램을 작성할 때
Emacs LISP mode : Emacs LISP 함수를 만들 때
LISP mode : LISP 프로그램을 작성할 때
LISP interaction mode : LISP 표현들을 검토하고 작성할 때
----------------------------------------------------------------------

부 모드(Minor Mode)
----------------------------------------------------------------------
Auto-fill mode : 자동 줄바끔(Word wrap) 기능을 활성화
Overwrite mode : 글자를 삽입하는 대신 수정한다.
Auto-save mode : 파일을 지정된 수만큼 자동 저장한다.
Line number mode : 모드 표시줄에 현재 줄의 번호를 표시한다.
Transient mark mode : 선택한 영역을 밝게 표시한다(X 환경에서만 가능)
Abbrev mode : 약어(줄임말)의 사용을 가능하게 해준다.
----------------------------------------------------------------------

0 Comments:

Post a Comment

<< Home