Emacs 는 하나하나 자신에게 맞도록 configuration 잡아주는 것이 매우 중요합니다.
본격적인 사용하기 이전에 주요 configuration 에 대해서 적어보겠습니다.

[#1] Caps Lock key 를 control key 로 변경하기

Emacs 에서는 control key 사용이 매우 많기 때문에 흔히 capslock key 를 control key 로 변경하여 많이 사용합니다.
아래 reshout 님 블로그에 capslock key 를 control key 로 변경/복원하는 registry file 을 실행하면 됩니다. :)



[#2] Font 설정 (Monaco)

Mac font 인데, windows 용으로 TTF 로 변환된 것이 있습니다.
Programming font 로서 많이 애용되는 것중의 하나 입니다. 개인적으로는 강추! 입니다. :)

아래 .emacs 에서는 monaco font 를 기본으로 사용하도록 설정하고 있습니다.


[#3] .emacs

저 역시 초보자로서 web 에서 .emacs 내용 하나하나 적용하면서 사용하고 있어서 아래 내용을 모두 아는 것은 아닙니다. T_T;
소개와 backup 의 의미로서 추가 el file 설치를 제외하고, 기본적인 .emacs 내용 올려봅니다.

;; ----------------------------------------------------------------------------
;; .emacs      ---------------------------------------------------------- BEGIN
;; ----------------------------------------------------------------------------
 
;; ----------------------------------------------------------------------------
;; Default Emacs Setting
;; ----------------------------------------------------------------------------
(custom-set-variables
  ;; custom-set-variables was added by Custom.
  ;; If you edit it by hand, you could mess it up, so be careful.
  ;; Your init file should contain only one such instance.
  ;; If there is more than one, they won't work right.
 '(column-number-mode t)
 '(display-battery-mode t)
 '(display-time-mode t)
 '(fast-lock-mode nil t (fast-lock))
 '(file-name-shadow-mode (quote on))
 '(font-lock-mode t t (font-lock))
 '(global-font-lock-mode (quote on))
 '(global-hl-line-mode (quote on))
 '(hi-lock-mode (quote on) t)
 '(highlight-current-line-whole-line t)
 '(ibuffer (quote on) t)
 '(iswitchb-mode (quote on))
 '(next-line-add-newlines t)
 '(nil nil t)
 '(paren-mode (quote sexp) nil (paren))
 '(query-user-mail-address nil)
 '(show-paren-mode t)
 '(show-paren-style (quote expression))
 '(size-indication-mode t)
 '(tab-width 4)
 '(text-mode-hook (quote (turn-on-auto-fill text-mode-hook-identify)))
 '(transient-mark-mode t)
 '(uniquify-buffer-name-style (quote forward) nil (uniquify)))

;; ----------------------------------------------------------------------------
;; Path
;; ----------------------------------------------------------------------------
(setq load-path (cons (expand-file-name "~") load-path))
(setq load-path (cons (expand-file-name "~/.emacs.d") load-path))

;; ----------------------------------------------------------------------------
;; Backup File
;; ----------------------------------------------------------------------------
(setq make-backup-files nil)

;; ----------------------------------------------------------------------------
;; Size setting
;; ----------------------------------------------------------------------------
(setq load-path (cons (expand-file-name "~") load-path))

;; 한글 저장은 어떻게 되는 것인가? 
;;
;; 버퍼에 쩍힌 영역에 따라 다르게 저장된다.  현재 default는 CP949로
;; 저장되며, 만약 확장영역의 한글이 적히면 utf-8로 저장할 것인지
;; 물어본다.
(setq inhibit-startup-message t)
(setq byte-compile-verbose      nil
      byte-compile-warnings     nil)

(if (eq window-system 'w32)
    (progn
      ;; http://oldpie.yoonkn.com/cgi-bin/moin.cgi/EmacsFontSet
      ;; http://oldpie.yoonkn.com/cgi-bin/moin.cgi/dreamstorm/emacs
      ;; http://www.emacswiki.org/cgi-bin/wiki/FontSets
      ;; by hosung 2008-05-20
      ;; http://www.gnu.org/software/emacs/windows/faq5.html#windows-font
      ;; M-x set-default-font <RET> <TAB>하면 폰트리스트가 나온다.
      ;; 폰트크기 18은 맨 첫줄을 따라 가는 것 같다. ksc5601에서 작게 해도 한글이 작아지지는 않는다.
      ;; ksc5601에서 c는 실제 p로 나오는데 어떤 것을 해도 상관 없다.
      ;; 맨끝의 0을 *로 하면 정상적으로 폰트가 출력되지 않는다.
      ;;
      ;; 이와 같이 ksc5601로 하면 확장문자에 대하여 네모박스로 출력되는 문제가 있다.
      (setq initial-frame-alist '((top . 10) (left . 100)))
      (setq default-frame-alist
        (append
         '(
           (font . "-*-Monaco-normal-r-*-*-12-102-120-120-c-*-iso8859-1")
           (width . 140)
           (height . 47)
           )
         default-frame-alist))))

;; ----------------------------------------------------------------------------
;; Mode
;; ----------------------------------------------------------------------------
(setq auto-mode-alist (cons '("\\.html$" . html-helper-mode)  auto-mode-alist))
(setq auto-mode-alist (cons '("\\.htm$"  . html-helper-mode)  auto-mode-alist))
(setq auto-mode-alist (cons '("\\.c$"    . c-mode)            auto-mode-alist))
(setq auto-mode-alist (cons '("\\.a$"    . c-mode)            auto-mode-alist))
(setq auto-mode-alist (cons '("\\.h$"    . c-mode)            auto-mode-alist))
(setq auto-mode-alist (cons '("\\.cpp$"  . c++-mode)          auto-mode-alist))
(setq auto-mode-alist (cons '("\\.scl$"  . c-mode)            auto-mode-alist))
(setq auto-mode-alist (cons '("\\.el$"   . emacs-lisp-mode)   auto-mode-alist))
(setq auto-mode-alist (cons '("\\.bat$"  . shell-script-mode) auto-mode-alist))
(setq auto-mode-alist (cons '("\\.mak$"  . shell-script-mode) auto-mode-alist))
(setq auto-mode-alist (cons '("\\.gmk$"  . shell-script-mode) auto-mode-alist))
(setq auto-mode-alist (cons '("\\.min$"  . shell-script-mode) auto-mode-alist))

;; ----------------------------------------------------------------------------
;; Indentation Setting
;; ----------------------------------------------------------------------------
;C 들여쓰기 기본 스타일 설정
(setq c-default-style "k&r")
; (setq c-default-style "cc-mode")
; (setq c-default-style "gnu")
; (setq c-default-style "bsd")
; (setq c-default-style "stroustrup")
; (setq c-default-style "whitemsith")
; 엔터 입력시 자동 들여쓰기 다른 방법

(load "cc-mode")
(define-key c++-mode-map "\r" 'reindent-then-newline-and-indent)
(define-key c-mode-map "\r" 'reindent-then-newline-and-indent)
(define-key java-mode-map "\r" 'reindent-then-newline-and-indent)

; 엔터 입력시 자동 들여쓰기 다른 방법
;(require 'cc-mode)
;(define-key c-mode-base-map (kbd "RET") 'newline-and-indent)
; { , ; 입력시 자동 줄 추가
(add-hook 'c-mode-common-hook '(lambda () (c-toggle-auto-state 1)))

;; ----------------------------------------------------------------------------
;; Tab settingemacs
;; ----------------------------------------------------------------------------
;emacs tab 설정
(setq c-basic-offset 4
      tab-width 4
      indent-tabs-mode t)
;(add-hook 'c-mode-common-hook '(lambda () (c-toggle-auto-state 1)))

;; ------------------------------------------------------------------------------
;; Copy Word & Line & Paragraph
;; ------------------------------------------------------------------------------
(defun copy-line (&optional arg)
  "Save current line into Kill-Ring without mark the line "
  (interactive "P")
  (let ((beg (line-beginning-position))
        (end (line-end-position)))
    (copy-region-as-kill beg end))
  )
(global-set-key (kbd "C-c l")         (quote copy-line))
(defun copy-paragraph (&optional arg)
  "Copy paragraphes at point"
  (interactive "P")
  (let ((beg (progn (backward-paragraph 1) (point)))
        (end (progn (forward-paragraph arg) (point))))
    (copy-region-as-kill beg end))
  )
(global-set-key (kbd "C-c p")         (quote copy-paragraph))

;; ------------------------------------------------------------------------------
;; Dynamic Abbreviation Mode
;; ------------------------------------------------------------------------------
(global-set-key (kbd "C-<tab>") 'dabbrev-expand)
(define-key minibuffer-local-map (kbd "C-<tab>") 'dabbrev-expand)

;; ------------------------------------------------------------------------------
;; Moving Lines
;; ------------------------------------------------------------------------------
(local-set-key [(meta up)] 'move-line-up)
(local-set-key [(meta down)] 'move-line-down)
(defun move-line (&optional n)
  "Move current line N (1) lines up/down leaving point in place."
  (interactive "p")
  (when (null n)
    (setq n 1))
  (let ((col (current-column)))
    (beginning-of-line)
    (next-line 1)
    (transpose-lines n)
    (previous-line 1)
    (forward-char col)))
(defun move-line-up (n)
  "Moves current line N (1) lines up leaving point in place."
  (interactive "p")
  (move-line (if (null n) -1 (- n))))
(defun move-line-down (n)
  "Moves current line N (1) lines down leaving point in place."
  (interactive "p")
  (move-line (if (null n) 1 n)))

;; ------------------------------------------------------------------------------
;; Open new line
;; ------------------------------------------------------------------------------
(local-set-key [(control o)] 'vi-open-next-line)
(defun vi-open-next-line (arg)
  "Move to the next line (like vi) and then opens a line."
  (interactive "p")
  (end-of-line)
  (open-line arg)
  (next-line 1)
  (indent-according-to-mode))

;; ------------------------------------------------------------------------------
;; Moving around
;; ------------------------------------------------------------------------------
(local-set-key [(control s)] 'isearch-forward-regexp)
(local-set-key [(control r)] 'isearch-backward-regexp)
;; Always end searches at the beginning of the matching expression.
(add-hook 'isearch-mode-end-hook 'custom-goto-match-beginning)
(defun custom-goto-match-beginning ()
  "Use with isearch hook to end search at first char of match."
  (when isearch-forward (goto-char isearch-other-end)))

;; ------------------------------------------------------------------------------
;; Global key binding
;; ------------------------------------------------------------------------------
(global-set-key "\C-l" 'goto-line)      ; [Ctrl]-[L]

;; ------------------------------------------------------------------------------
;; imenu
;; ------------------------------------------------------------------------------
(add-hook 'c-mode-hook 'imenu-add-menubar-index)
(add-hook 'emacs-lisp-mode-hook 'imenu-add-menubar-index)
 
;; ------------------------------------------------------------------------------
;; Visible BELL
;; ------------------------------------------------------------------------------
(setq visible-bell t)

;; ----------------------------------------------------------------------------
;; YES ==> Y , NO ==> n
;; ----------------------------------------------------------------------------
(fset 'yes-or-no-p 'y-or-n-p)

;; ----------------------------------------------------------------------------
;; Add occur to isearch
;; ----------------------------------------------------------------------------
(define-key isearch-mode-map (kbd "C-o")
  (lambda ()
    (interactive)
    (let ((case-fold-search isearch-case-fold-search))
      (occur (if isearch-regexp isearch-string
               (regexp-quote isearch-string))))))

;; ----------------------------------------------------------------------------
;; Indent or Expand
;; ----------------------------------------------------------------------------
(defun indent-or-expand (arg)
  "Either indent according to mode, or expand the word preceding
point."
  (interactive "*P")
  (if (and
       (or (bobp) (= ?w (char-syntax (char-before))))
       (or (eobp) (not (= ?w (char-syntax (char-after))))))
      (dabbrev-expand arg)
    (indent-according-to-mode)))
(defun my-tab-fix ()
  (local-set-key [tab] 'indent-or-expand))
(add-hook 'c-mode-hook          'my-tab-fix)
(add-hook 'sh-mode-hook         'my-tab-fix)
(add-hook 'emacs-lisp-mode-hook 'my-tab-fix)
;; more mode hooks, yada yada, etc ...

;; ----------------------------------------------------------------------------
;; ido-mode
;; ----------------------------------------------------------------------------
(define-key minibuffer-local-map [tab] 'minibuffer-complete)
(ido-mode t)
(setq ido-enable-flex-matching t) ; fuzzy matching is a must have
 
;; This tab override shouldn't be necessary given ido's default
;; configuration, but minibuffer-complete otherwise dominates the
;; tab binding because of my custom tab-completion-everywhere
;; configuration.
(add-hook 'ido-setup-hook
          (lambda ()
            (define-key ido-completion-map [tab] 'ido-complete)))

;; ----------------------------------------------------------------------------
;; .emacs      ------------------------------------------------------------ END
;; ----------------------------------------------------------------------------

[#4] 초기 설정 완료 인증샷

자신의 home directory 에 위의 .emacs 저장한 다음에 Emacs-Llisp > Byte-cmpile This File menu 로
.emacs lisp file (.el) comile 하여 .elc 로  만듭니다.



이후 다시 emacs 를 실행시키면 다음과 같은 기본적인 설정이 완료된 emacs 를 이용하실 수 있게 됩니다.



[#5] Emacs 관련 link

처음 emacs 를 사용하시면 기본적인 커서 움직임 하나부터 key binding 이 다르고 해서 
이렇게 불편한 것을 왜 쓰는지부터... 적용하시기 어려울 것입니다.

이에 참고하시라고 몇 가지 link 함께 걸어봅니다.
처음에는 조금 불편하시겠지만 그 많은 geek 들이 열광하는 이유가 무엇인지 직접 한 번 느껴봅시다. :)
저작자 표시 비영리 변경 금지
신고
Posted by tkhwang

카테고리

분류 전체보기 (61)
소프트웨어 (30)
잡담 (17)
BOOK (7)
펜,잉크,노트,문구 (6)
Blog (1)
Bookmark (0)

달력

«   2017/09   »
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

티스토리 툴바