2012년 5월 15일 화요일

dot emacs

출처 : http://sylphong.egloos.com/2006579

현재 사용중인 .emacs입니다. 백업도 해둘겸 겸사겸사 올립니다.

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

먼저 유저경로를 추가하는 부분으로 시작합니다.

(when window-system
  (set-face-font 'default "jin3")
  (set-fontset-font "fontset-default" 'hangul '("jin3" . "unicode-bmp"))
  (set-fontset-font "fontset-default" 'kana '("Haansoft Dotum" . "unicode-bmp"))
  (set-fontset-font "fontset-default" 'han '("Haansoft Dotum" . "unicode-bmp"))
  (set-fontset-font "fontset-default" 'cjk-misc '("Haansoft Dotum" . "unicode-bmp"))
  (set-frame-size (selected-frame) 140 50))

emacs를 xwindow에서 사용할때만 글꼴 설정과 창크기를 조정합니다. 글꼴은 각 언어별로 다르게 적용해놨습니다. emacs snapshot xft버전에서만 저방식의 폰트 설정이 가능합니다.

;; syntax highlighting
(global-font-lock-mode t)

;; highlight line
(global-hl-line-mode t)

;; highlight marked region
(transient-mark-mode t)

;; match parenthesis
(show-paren-mode t)

;; no new line at end
(setq next-line-add-newlines nil)

;; no backup file
(setq make-backup-files nil)

;; uncompress files
(auto-compression-mode t)

;; del키 또는 backspace키를 눌렀을때 선택한 영역을 삭제
(delete-selection-mode nil)

;; 창 제목을 바꿈
(setq frame-title-format (list "GNU Emacs " emacs-version "@" system-name " - " '(buffer-file-name "%f" "%b")))
(setq icon-title-format frame-title-format)

(which-function-mode t)

;; column number
(column-number-mode t)

;; 툴바숨김
(tool-bar-mode nil)

;; tab설정
(setq default-tab-width 4)
(setq-default c-basic-offset 4
              indent-tabs-mode nil)

하이라이팅,탭등 기타 잡다한것을 설정합니다.

(global-set-key [(ctrl f4)] 'kill-this-buffer)
(global-set-key [(meta g)] 'goto-line)
(global-set-key [f1]  (lambda () (interactive) (manual-entry (current-word))))
(global-set-key [f5] 'replace-string)
(global-set-key [(ctrl f5)] 'query-replace)
(global-set-key [f6] 'replace-regexp)
(global-set-key [(ctrl f6)] 'query-replace-regexp)
(global-set-key [f7] 'compile)
(global-set-key [(ctrl f7)] 'kill-compilation)
(global-set-key [f8] 'next-error)
(global-set-key [(ctrl f8)] 'previous-error)
(global-set-key [(f11)] 'shell)

제가 사용하는 키바인딩입니다.

(ido-mode 'buffer)
(global-set-key [(ctrl tab)] 'ido-switch-buffer)
(global-set-key [(ctrl shift tab)] 'ido-switch-buffer)
(add-hook
 'ido-setup-hook
 (lambda ()
   (define-key ido-buffer-completion-map [(ctrl tab)] 'ido-next-match)
   (define-key ido-buffer-completion-map [(ctrl shift tab)] 'ido-prev-match)))

버퍼 전환을 편하게 하고자 ido-mode를 사용합니다. ctrl tab으로 다음 버퍼, ctrl shift tab으로 이전 버퍼로 전환이 가능합니다.

;; SLIME 설정
(setq common-lisp-hyperspec-symbol-table nil)
(require 'slime)
(setq inferior-lisp-program "/usr/bin/sbcl"
      lisp-indent-function 'common-lisp-indent-function
      slime-complete-symbol-function 'slime-fuzzy-complete-symbol
      slime-startup-animation nil)
;; UTF-8 인코딩을 기본으로 사용
(setq slime-net-coding-system 'utf-8-unix)
(setq common-lisp-hyperspec-root
      "/usr/share/doc/hyperspec/")
(add-hook
 'inferior-lisp-mode-hook
 (lambda ()
   (inferior-slime-mode t)))
(slime-setup)

(add-hook
 'lisp-mode-hook
 (lambda ()
   (define-key lisp-mode-map [f1] 'info-lookup-symbol)))

(eval-after-load "slime"
  '(progn
    (add-to-list 'load-path "/usr/share/emacs/site-lisp/slime/contrib")
    (slime-setup '(slime-fancy slime-asdf slime-banner))
    (setq slime-complete-symbol*-fancy t)
    (setq slime-complete-symbol-function 'slime-fuzzy-complete-symbol)))

(require 'info-look)
(info-lookup-add-help
 :mode 'lisp-mode
 :regexp "[^][()'\" \t\n]+"
 :ignore-case t
 :doc-spec '(("(ansicl)Symbol Index" nil nil nil)))

;; scheme 설정
(setq scheme-program-name "mzscheme")
(add-hook
 'scheme-mode-hook
 (lambda ()
   (define-key scheme-mode-map [f1] 'info-lookup-symbol)))

(add-hook
 'inferior-scheme-mode-hook
 (lambda ()
   (define-key inferior-scheme-mode-map [f1] 'info-lookup-symbol)))

common lisp과 scheme을 사용하기 때문에 slime과 scheme환경을 설정해두었습니다.

;; LaTeX 환경설정
(setq TeX-command-list
      (list (list "TeX" "tex \\nonstopmode\\input %t" 'TeX-run-TeX nil t)
            (list "LaTeX" "%l --interaction=nonstopmode %t" 'TeX-run-LaTeX nil t)
            (list "LaTeX PDF" "pdflatex --interaction=nonstopmode %t" 'TeX-run-LaTeX nil t)
            (list "LaTeX DVIPDFMx" "dvipdfmx %d" 'TeX-run-command t nil)
            (list "View" "%v" 'TeX-run-discard t nil)
            (list "View PS" "gsview32 %f" 'TeX-run-command t nil)
            (list "View PDF" "evince %s.pdf" 'TeX-run-command t nil)
            (list "DVIPS" "dvips %d -o %f" 'TeX-run-command t nil)
            (list "Print" "dvips %d -o %f " 'TeX-run-command t nil)
            (list "File" "dvips %d -o %f " 'TeX-run-command t nil)
            (list "BibTeX" "bibtex %s" 'TeX-run-BibTeX nil nil)
            (list "Index" "makeindex %s" 'TeX-run-command nil t)
            (list "Check" "lacheck %s" 'TeX-run-compile nil t)
            (list "Other" "" 'TeX-run-command t t)))
(setq TeX-auto-save t
      TeX-parse-self t)
;; LaTeX 컴파일 단축키
(add-hook
 'LaTeX-mode-hook
  (lambda ()
    (define-key LaTeX-mode-map [f7] 'do-PDFLaTeX)))
(setq LaTeX-verbatim-environments '("verbatim" "verbatim*" "Verbatim"))
(defun do-PDFLaTeX ()
  "PDFLaTeX the curent file."
  (interactive)
  (TeX-command "LaTeX PDF" 'TeX-master-file))

그리고 latex을 사용하기 때문에 설정을 해두었는데 저많은 커맨드 중에 pdflatex밖에 사용안합니다. 헷갈리지 않게 컴파일과 동일한 f7로 바인딩 해두었습니다.

(add-hook
 'c-mode-common-hook
 (lambda ()
   (unless (file-exists-p "Makefile")
     (set (make-local-variable 'compile-command)
          (let ((file (file-name-nondirectory buffer-file-name)))
            (format "%s -o %s %s %s %s"
                    (or (getenv "CC") "gcc")
                    (file-name-sans-extension file)
                    (or (getenv "CPPFLAGS") "")
                    (or (getenv "CFLAGS") "-Wall -g")
                    file))))))

(add-hook
 'c++-mode-hook
 (lambda ()
   (unless (file-exists-p "Makefile")
     (set (make-local-variable 'compile-command)
          (let ((file (file-name-nondirectory buffer-file-name)))
            (format "%s -o %s %s %s %s"
                    (or (getenv "CC") "g++")
                    (file-name-sans-extension file)
                    (or (getenv "CPPFLAGS") "")
                    (or (getenv "CFLAGS") "-Wall -g")
                    file))))))

(add-hook
 'java-mode-hook
 (lambda ()
   (unless (file-exists-p "Makefile")
     (set (make-local-variable 'compile-command)
          (let ((file (file-name-nondirectory buffer-file-name)))
            (format "%s %s %s"
                    (or (getenv "JAVAC") "javac")
                    (or (getenv "JAVACFLAGS") "")
                    file))))))

컴파일을 편하게 하고자 컴파일 커맨드를 설정했습니다. Makefile이 있다면 make를 호출하고 없다면 gcc, g++, javac등을 호출하여 컴파일 합니다.

(add-hook 'haskell-mode-hook 'turn-on-haskell-ghci)
(autoload 'run-ghci "haskell-ghci"
  "Go to the *ghci* buffer" t nil)
(set-variable 'haskell-program-name "ghci")
(add-hook
 'haskell-mode-hook
 (lambda ()
   (unless (file-exists-p "Makefile")
     (set (make-local-variable 'compile-command)
          (let ((file (file-name-nondirectory buffer-file-name)))
            (format "%s -o %s %s %s"
                    (or (getenv "GHC") "ghc")
                    (file-name-sans-extension file)
                    (or (getenv "GHCFLAGS") "")
                    file))))))

haskell을 가끔 쓰기때문에 haskell환경과 컴파일 커맨드를 설정했습니다.

(when (locate-library "erc")
  (eval-after-load "erc"
    '(progn
       (setq erc-default-coding-system '(cp949 . undecided))
       (setq erc-server "irc.hanirc.org:6667"))))

챗팅을 하고자 erc를 설정했는데 리눅스에서는 xchat을 쓰기때문에 잘안씁니다. 가끔 윈도 환경에서 emacs를 사용할때 유용하게 사용합니다.

(load "~/.emacs.d/nxml/autostart.el")
(add-to-list 'auto-mode-alist '("\\.ctp\\'" . nxhtml-mumamo))

웹프로그래밍을 할땐 nXhtml을 쓰면 편합니다. 링크된 홈페이지에서 nXhtml을 받아서 .emacs.d에 압축을 푼후 로드하면 적용됩니다. CakePHP를 쓰기때문에 ctp확장자를 등록했습니다.

(setq ecb-tip-of-the-day nil)
(setq ecb-layout-name "left11")
(setq ecb-windows-width 0.25)
(custom-set-variables
 '(ecb-fix-window-size (quote width))
 '(ecb-layout-window-sizes nil)
 '(ecb-options-version "2.32"))

잘안쓰는 ECB에 대한 설정이 있네요. 개인적으로 layout은 left11을 선호하는데 테스트해보면서 맘에 드는걸로 고르시면 될겁니다.

(when (require 'tabbar nil t)
  (setq tabbar-buffer-groups-function
        (lambda (b) (list "All Buffers")))
  (setq tabbar-buffer-list-function
        (lambda ()
          (remove-if
           (lambda(buffer)
             (find (aref (buffer-name buffer) 0) " *")) (buffer-list))))
  (tabbar-mode))

(set-face-attribute
 'tabbar-default-face nil
 :background "gray60")
(set-face-attribute
 'tabbar-unselected-face nil
 :background "gray85"
 :foreground "gray30"
 :box nil)
(set-face-attribute
 'tabbar-selected-face nil
 :background "#f2f2f6"
 :foreground "black"
 :box nil)
(set-face-attribute
 'tabbar-button-face nil
 :box '(:line-width 1 :color "gray72" :style released-button))
(set-face-attribute
 'tabbar-separator-face nil
 :height 0.7)

(global-set-key [(ctrl shift tab)] 'tabbar-backward)
(global-set-key [(ctrl tab)] 'tabbar-forward)

이전에는 tabbar모드를 즐겨 사용했었는데 ido-mode를 사용하면서 사용안하게 되더군요. 사용하실려면 먼저 tabbar.el을 .emacs.d에 복사하셔야 됩니다. ido-mode와 마찬가지로 ctrl tab, ctrl shift tab으로 버퍼 전환이 가능하도록 설정해서 사용했습니다.

댓글 없음:

댓글 쓰기