2016-04-16

EMACS 에디터 설정 파일 공유

EMACS 에디터 설정 파일 공유

EMACS 에디터는 각종 기능이 ELISP 로 구성된 확장 가능한 에디터다.

EMACS를 잘 모른다면 기본적인 EMACS에 대한 설명을 위키 등에서 읽어보는 것이 좋다. 

나는 에디터를 좀 더 뜯어 고쳐서 사용하고 싶었고, 확장 기능이 더 많고, 원하는 기능을 쉽게 구현 할 수 있는 EMACS에 끌려 VIM을 사용 하다가 EMACS를 즐겨 사용하고 있다.

사용 용도는 코딩을 위한 것은 아니며, 물론 LISP는 전혀 공부 한 적도 없다.

단지 개인적인 기록을 위한 용도로 사용하고 있는데, 텍스트 파일 편집을 주로 하며, Syntax, 자동 완성기능, 코드 탐색 기능은 사용하지 않는다. EMACS의 유명한 MODE 중 하나 인 ORG 도 사용하지 않는다. (강력한 텍스트 기반 일정,목차,메모, 정리 MODE)

코딩 작업을 위해 사용되는 여러가지 기능을 활용하지는 않지만, 편리하게 사용하기 위해 설정 파일 작업을 시작했고, 오랜 시간 필요한 기능들을 추기하기 위해 인터넷을 뒤져 설정 파일을 만들었다.

EMACS는 VIM과 동일하게 설정 파일을 통해 자신이 원하는대로 편집 환경을 만들 수 있는데 많이 쓰이는 VIM 은 설정 파일이 EMACS에 비해 비교적 단순하게 기능을 활성화 할 수 있지만 상대적으로 EMACS는 설정 파일이 복잡하다.

설정파일도 ELISP 소스이기 때문이다. 그래서 함수형 언어인 LISP 문법을 모르는 상태에서 단순한 기능 한 가지를 구현하려면, 많은 시간이 필요 했다. 하지만 VIM에서 제공하지 않는 기능을 추가하는 재미에 어느 덧 시간이 흐르고 나니 버릇처럼 손에 익어 굉장히 편리해졌고, 설정파일이 크기도 제법 늘어났다.

EMACS를 접하고 나서 LISP 언어에 대해서도 조금 알게 되었는데, 다른 프로그래밍 언어과 차별화 된 몇 가지 특징을 알고 프로그래밍에 대해 문외한 나도 LISP언어에 관심이 생겼다.

EMACS는 간단하게 리눅스 서버에 로그인만해도 쓸 수 있는 vi 와달리 상대적으로 사용자가 적어서 설정파일에 대한 정보가 적다.

하지만 설정파일 자체가 스크립트 짜는 것 같은 소스이다 보니, 구글에서 검색한 여러 영어 커뮤니티 사이트를 뒤져가며 기능과 방법에 대한 사용자들의 팁과 소스들을 알게 되었다.

물론 EMACS 레퍼런스 메뉴얼 자체를 끈기 있게 읽다보면 훨씬 빠른 접근이 가능할 것이다.

몇 가지 쓸만한 설정은 공유하는게 좋을 것 같아서 글로 남긴다.

EMACS는 VIM과 마찬가지로 온갖 OS에서 작동하기 때문에 각 OS마다 설정파일의 위치와 설정 기능도 조금씩 차이가 난다. (윈도우,리눅스 설정파일의 위치가 다르다)

그리고 EMACS의 버전에 따라 어떤 기능은 작동 되지 않을 수도 있다.

나는 EMACS를 DOS, VT100 터미널, 윈도우, 리눅스(터미널, X윈도우, SSH)까지 접속 해서 사용 하기도 한다.

그래서 모든 편집기 환경에 대한 설정을 동일하게 유지하기 위해 고민을 많이 했는데,

공통적으로 사용될 수 있는 단축키 조합 중 펑션 키 조합은 F1 ~ F4 만 사용하기로 했다.  VT100 터미널에서는 F1 ~ F4 까지만 인식되기 때문이다. 키 조합은 자신이 원하는대로 바꿀 수 있다.어떤 기능은 함수로 정의 하여 단축키로 추가하기도 했다.

;GUI 환경에서 시작 시 창 화면 최대화 하기
(add-to-list 'default-frame-alist '(fullscreen . maximized))

;파일 편집 위치 기억
(require 'saveplace)
(setq-default save-place t)
(setq save-place-file     "~/_places.sav")

;최근 파일 접근
(require 'recentf)
(recentf-mode 1)
(setq recentf-max-menu-items 20) ; 최근 파일 목록 수

;GUI 환경에서 줄 간격 조절
(setq-default line-spacing 15)

;파일이 수정되었을 때 자동으로 다시 읽어들이도록 하는 설정
(global-auto-revert-mode t)

;linum 모드는 줄번호 표기 기능이다.

;linum 모드 끄기. defun는 함수를 만드는 기능이다 no-linum이란 함수를 정의한 이유는
;linum 모드 필요 없는 경우에 add-hook을 통해 특정상황에 linum 모드를 끄기 위해서다.
(defun no-linum ()
(interactive)
(linum-mode 0)
)

;linum 모드 켜기
(defun my-linum-mode ()
 (linum-mode)
 (setq linum-format "%4d ") ; 줄 번호 자릿수 설정 기능이다.
 (set-face-foreground 'linum "gray") ; 이 기능은 줄 번호 표시 색깔 설정이다.
)

; 계산기 자릿수 분리기호 삽입 calc EMACS 기본 계산기 모드에서 자릿수 분리기호 삽입
(setq calc-group-digits t)

;text mode 줄 번호 켜기 add-hook을 통해 특정 상황에 기능을 호출 한다.
(add-hook 'text-mode-hook 'my-linum-mode)

;status bar에 시간 표시기능.
(display-time)

;시작 화면 메세지 끄기
(setq inhibit-startup-message t)
(setq initial-scratch-message "")

;시작 모드를 text모드로 시작하기. 보통은 LISP Interaction 상태.
(setq initial-major-mode 'text-mode)

;블럭 선택부분 색상 반전시키기
(setq-default transient-mark-mode t)

;status bar에 줄 번호, 칼럼 번호 표시
(setq line-number-mode t)
(setq column-number-mode t)

;백업파일 만들지 않기,
(setq make-backup-files nil)

;자동 저장 기능 끄기
(setq auto-save-default nil)

;하단 스크롤시에 빈 줄 추가 하지 않기.
;보통은 스크롤이 맨 끝까지 가면 자동으로 빈 줄이 추가 된다.
(setq next-line-add-newlines nil)

;하단 스크롤시 1줄씩만 스크롤 되도록 하기.
(setq scroll-step 1)

;페이지 넘길 때 3줄은 포함.
(setq next-screen-context-lines 3)

;찾기 기능에서 하이라이트 설정
(setq search-highlight t)

;상단 메뉴 숨기기
(menu-bar-mode 0)

;도구 모음 숨기기
(tool-bar-mode 0)

; word wrap 강제 줄바꿈 auto-fill-mode 이기능은 특정 칼럼 이상 넘어가면
; 자동으로 강제 줄바꿈 해주는 기능인데, 대량의 텍스트 문서를 워드프로세서로 편집 할 경우
;강제줄바꿈 기능이 오히려 편집의 불편함을 주기 때문에 지금은 사용하지 않는다.
; (setq-default auto-fill-function 'do-auto-fill)

;줄 바꿈 칼럼수 설정.
(setq-default fill-column 75)

;visual-fill-column-mode 라고 하는 soft wrap 기능이 구현된 elisp 소스가 있어서,
;이 것을 추가해서 사용하고 있다. 위 에서 처럼 칼럼수를 설정하고 이 기능을 사용하면 soft wrap이 된다.

;잘라내기, 붙여넣기, CTRL+C, V를 활성화 시켜준다. 윈도우 처럼 사용가능하다.
(cua-mode)

;grep 기능 옵션 설정 리눅스 에서는 grep을 쓰고 윈도우 환경에서는 find를 쓴다.
;뒤에 붙여주는 인자도 수정 할 수 있다. 보통 텍스트 파일을 검색하므로 txt를 붙여 주었다.
(setq grep-command "grep -n \"\" *.txt")
(setq grep-command "find \"\" *.txt")

;날짜 삽입하기. 편집 할 때
(defun today ()
   "Insert Date YYYY-MM-DD"
   (interactive)
   (insert (format-time-string "%Y-%m-%d")))

;날짜 삽입 단축키 (편집 시)
(global-set-key "\M-\pd" 'today)

;날짜 삽입하기. (파일 저장 시)
(defun today1 ()
   "Insert Date YYMMDD00" 
   (interactive)
   (insert (format-time-string "%y%m%d00")))

;날짜 삽입 단축키 (파일명 저장 시)
; 파일 저장 할 때 이 기능을 이용하면 원하는 파일명을 간편하게 만들어준다.
;난 파일명을 날짜로 만드는 경우가 많아 자동으로 입력되도록 했다. 원리는 간단하다.
(global-set-key "\C-\cd" 'today1)

;새로운 버퍼 열기
(defun new-empty-buffer ()
   "Open a New empty buffer."
    (interactive)
    (let ((buf (generate-new-buffer "New empty")))
    (switch-to-buffer buf)
    (funcall (and initial-major-mode))
    (setq buffer-offer-save t)))

;새로운 버퍼 열기 단축키 지정
(global-set-key "\M-\p7" 'new-empty-buffer)

;Dired모드에서 디렉토리 우선 정렬로 보기 (기본은 지원 안함)
(defun sof/dired-sort ()
    "Dired sort hook to list directories first."
    (save-excursion
     (let (buffer-read-only)
       (forward-line 2)
       (sort-regexp-fields t "^.*$" "[ ]*." (point) (point-max))))
      (and (featurep 'xemacs)
           (fboundp 'dired-insert-set-properties)
           (dired-insert-set-properties (point-min) (point-max)))
           (set-buffer-modified-p nil))
(add-hook 'dired-after-readin-hook 'sof/dired-sort)

; 단축키 지정

;최근 작업 파일 목록 열기
(global-set-key "\M-\p1" 'recentf-open-files)

;블럭 지정 (Mark) 보통 상태에서는 SHIFT로 쉽게 블럭을 지정 할 수 있고 편집이 되지만,
;VT100 터미널에서 작업을 할 경우 별도의 키를 작동시켜야 블럭이 지정된다.
(global-set-key [f1] 'set-mark-command)

;EMACS 종료 (C-x c 와 같다. 그러나 손가락 피로도를 줄이기 위해서)
(global-set-key [f2] 'kill-emacs)

;현재 버퍼 끄기.(현재 작업 중인 버퍼만 죽인다)
(global-set-key [f3] 'kill-this-buffer)

;파일 탐색기 Dired 모드 켜기
(global-set-key [f4] 'dired)

;북 마크 열기
(global-set-key "\M-\p5" 'bookmark-bmenu-list)

;북 마크에 저장 하기
(global-set-key "\M-\p%" 'bookmark-set)

;버퍼 목록 열기
(global-set-key "\M-\pl" 'electric-buffer-list)

;버퍼 메뉴 열기
(global-set-key "\M-\pp" 'buffer-menu)

;grep 실행
(global-set-key "\M-\pg" 'grep)

;줄번호 이동
(global-set-key "\C-xg" 'goto-line)

;커서에 위치한 문자열을 파일명으로 인식하여 열기. index 파일을 별도로 두면 꽤 쓸만한 기능.
(global-set-key "\M-1" 'find-file-at-point)

;가로 분할 화면 위로 크기 조절
(global-set-key "\M-\p[" 'shrink-window)

;가로 분할 화면 아래로 크기 조절
(global-set-key "\M-\p]" 'enlarge-window)

;세로 화면 사이즈 좌측으로 크기 조절
(global-set-key "\M-\p;" 'shrink-window-horizontally)

;세로 화면 사이즈 우측으로 크기 조절
(global-set-key "\M-\p'" 'enlarge-window-horizontally)

;yes, no키  y,n으로 설정
(fset 'yes-or-no-p 'y-or-n-p)

;키보드 세벌식으로 설정 후 토글 스위치 shift+spacebar 두벌식 사용자는 필요 없다.
(setq default-korean-keyboard "3")

;wombat 테마 켜기 (개인 취향으로 고른 것 뿐이다)
(custom-set-variables
'(custom-enabled-themes (quote (wombat))))

;폰트 설정 돋움체 (개인 취향으로 고른 것 뿐이다. 리눅스에는 나눔고딕 또는 Noto Sans CJK를 추천한다)
(custom-set-faces
 '(default ((t (:family #("돋움체" 0 2 (charset cp949)) :foundry "outline" :slant normal :weight normal :height 181 :width normal)))))

EMACS 에디터 설정 파일 공유