2017년 emacs 설정

2017. 1. 20. 03:48

Ubuntu 16.04를 설치하면서 새로이 emacs를 설치하고 설정하게 되어 과정들을 한 글에 요약해서 정리하는 것이 목적인 글입니다.(기존의 글들의 내용을 정리하는 것)

설치는

sudo apt-get install emacs로 합니다.

한글은 GUI의 옵션탭에서 설정하면 쉽게 입력이 가능합니다.


터미널에서 emacs를 실행시켜준 후 C-f로 ~/.emacs 파일을 실행하여 편집해야 합니다.


1) 창 크기와 시작 위치 설정

;;frame size
(add-to-list 'default-frame-alist '(height . 80))
(add-to-list 'default-frame-alist '(width . 82))
(set-frame-position (selected-frame) 1921 0)

듀얼모니터를 사용중이라 프레임의 위치가 1921, 0이 된 것입니다. 창의 왼쪽 상단의 위치를 픽셀단위로 지정하는 것입니다.


윈도우의 경우에는 1921대신 0, 높이는 66


2) 글꼴 설정

;;emacs windows
(custom-set-faces
 ;; custom-set-faces 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.
 '(default ((t (:family "Ubuntu Mono" :foundry "unknown" :slant normal :weight normal :height 130 :width normal)))))

Ubuntu Mono 글꼴의 13pt(아마도)를 기본글꼴로 설정합니다.


윈도우의 경우에는

;;emacs windows

(custom-set-faces

 ;; custom-set-faces 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.

 '(default ((t (:family "VeraGothic" :foundry "unknown" :slant normal :weight normal :height 98 :width normal)))))


3) MELPA 설정

최근의 emacs package들은 대개 MELPA라는 시스템을 통해서 관리되고 있는 것 같습니다.

http://melpa.org/#/getting-started

를 참조하여 MELPA를 설정하면 됩니다.

windows의 경우 https대신에 http를 사용하고 X-x package-refresh-contents를 한 번 해 주어야 합니다


이후에

X-x package-install <package name>

를 이용하거나

X-x package-list-packages

로 리스트를 켜서 설치하고 싶은 패키지를 i로 마크하고 x를 눌러 설치하면 됩니다.(u는 언마크, d는 삭제용마크, U는 업그레이드가능한 패키지 모두 마크)


4) 테마 설정

MELPA에 등록된 zenburn을 설치한 후 .emacs 파일에

(load-theme 'zenburn t)

를 추가해주면 됩니다. 주의할 것은 (package-initialize)뒤에 해당 명령어가 와야 합니다.


5)paredit 설치

MELPA로 설치 후

1. (require 'paredit)을 추가해주고

2. (mapc (lambda (mode)
    (let ((hook (intern (concat (symbol-name mode)
                    "-mode-hook"))))
      (add-hook hook (lambda () (paredit-mode +1)))))
      '(emacs-lisp inferior-lisp slime lisp-interaction scheme))

도 추가해 줍니다.  2번은 lisp관련 모드를 실행시에 자동으로 paredit mode를 켜준다는 의미 입니다.


6)rainbow-delimiters 설치

MELPA로 설치 후

1. (require 'rainbow-delimiters)를 추가

2. (add-hook 'prog-mode-hook 'rainbow-delimiters-mode) 추가


7)유용한 UI 세팅

;;UI settings
(show-paren-mode 1) ;;show paren mode
(setq show-paren-delay 0)
(setq inhibit-startup-screen t) ;;skip startup screen and specify default mode
(setq initial-major-mode 'python-mode)
(setq initial-scratch-message "")
(display-time) ;;show time on status bar
(transient-mark-mode t) ;; show selected area
(global-linum-mode t) ;; show line numbers
(setq-default indent-tabs-mode nil)
(setq-default tab-width 2)
(require 'cl-lib)
(defadvice save-buffers-kill-emacs (around no-query-kill-emacs activate)
  "Prevent annoying \"Active processes exist\" query when you quit Emacs."
  (cl-letf (((symbol-function #'process-list) (lambda ())))
    ad-do-it))


8)단축키 설정

(global-set-key [C-kanji] 'set-mark-command) ;;윈도우 특정

(global-set-key [f3] 'compile)
(global-set-key [f4] 'gdb)
 
(global-set-key [f5] 'comment-region)
(global-set-key [f6] 'uncomment-region)
 
(global-set-key [f7] 'python-indent-shift-left)
(global-set-key [f8] 'python-indent-shift-right)
;;(global-set-key [f7] 'previous-buffer)
;;(global-set-key [f8] 'next-buffer)

(global-set-key [f12] 'shell)


9)company mode 설치

이전에는 auto-complete을 사용하였으나 company mode가 좀 더 편리하다는 결과를 발견. auto complete을 하려면 다른 el파일들(popup이나 fuzzy)도 받아야 해서 불편했기에 바꾸기로 결정

MELPA에서 company를 설치하고

;;company mode
(add-hook 'after-init-hook '(global-company-mode '(not inferior-python-mode)))
(setq company-dabbrev-downcase 0)
(setq company-idle-delay 0)
(setq company-minimum-prefix-length 1)
(with-eval-after-load 'company
  (dolist (key '("<return>" "RET"))
    ;; Here we are using an advanced feature of define-key that lets
    ;; us pass an "extended menu item" instead of an interactive
    ;; function. Doing this allows RET to regain its usual
    ;; functionality when the user has not explicitly interacted with
    ;; Company.
    (define-key company-active-map (kbd key)
      `(menu-item nil company-complete
                  :filter ,(lambda (cmd)
                             (when (company-explicit-action-p)
                               cmd)))))
  (define-key company-active-map (kbd "M-n") nil)
  (define-key company-active-map (kbd "M-p") nil)
  (define-key company-active-map (kbd "C-n") 'company-select-next)
  (define-key company-active-map (kbd "C-p") 'company-select-previous)
  (define-key company-active-map (kbd "TAB") 'company-complete-selection)
  (define-key company-active-map (kbd "<tab>") 'company-complete-selection)
;;  (define-key company-active-map (kbd "TAB") 'company-complete-common-or-cycle)
;;  (define-key company-active-map (kbd "<tab>") 'company-complete-common-or-cycle)
;;  (define-key company-active-map (kbd "S-TAB") 'company-select-previous)
;;  (define-key company-active-map (kbd "<backtab>") 'company-select-previous)
  )

추가 (윈도우에서는 idle delay를 0.001과같이 해준다)


10)괄호 자동 완성

(add-hook 'prog-mode-hook 'electric-pair-mode)



emacs/General