유용한 .emacs 설정

폰트 변경 방법

  1. M-x를 누른 후, set-default-font를 입력한다.
  2. tab을 두번 누르면, 폰트 리스트가 뜬다. (여기서 선택을 할 경우, 해당 폰트가 적용되면서 어떻게 표시되는지 확인할 수는 있지만 설정이 저장되지는 않는다)
  3. 원하는 폰트에 대한 스트링을 기억해둔다.
  4. .emacs 파일에 아래와 같은 형식으로 따옴표 안에 기억했던 폰트에 대한 스트링을 넣어 추가한다.
    (set-default-font
    "-outline-Ubuntu Mono-normal-normal-normal-mono-*-*-*-*-c-*-iso10646-1")
    

아스키 코드로 입력 방법 / 개행 문자 입력 방법

  1. 아스키 코드로 입력하기 : C-q <8진수 숫자>
  2. (검색 등에서) 개행 문자 입력하기 : C-j 혹은 C-q C-j
    • replace-string 명령 파라미터 입력시 C-j를 사용하면 바로 입력이 종료되기 때문에 중간에 개행문자가 끼어있는 파라미터 입력시는 C-q C-j를 사용해야 한다.
<테스트 환경>
- OS : Windows 7
- Emacs 버전 : Emacs 24.3 윈도우
,

SBCL 소스를 커맨드 프롬프트에서 스크립트처럼 실행 시에, 특수 변수 *posix-argv*를 사용하여 실행 파라미터(인자)를 리스트의 형태로 가져올 수 있다.


아래와 같이 example.lisp을 작성한다.

(print *posix-argv*)


실행 파라미터를 주어 실행해보면, 

sbcl --script example.lisp enter your argument


("sbcl" "enter" "your" "argument")


첫번째 요소로 SBCL 실행 파일명을 가지며, 나머지에 실행 파라미터가 포함된 리스트가 출력되는 것을 볼 수 있다.




<테스트 환경>

OS : Windows 7

SBCL 버전 : 1.2.7


,

1. UTF-8 한글 표시 설정


  1. .emacs 파일에 다음의 내용을 추가한다.
    (set-language-environment "Korean")
    (prefer-coding-system 'utf-8)
    
  1. 하지만 이렇게만 할 경우, 버퍼의 내용은 제대로 표시되지만, 한글로 된 파일명을 가진 파일을 읽을 때, 파일명이 같은 형식으로 표시되거나, 새로 한글로 된 파일명을 입력하여 저장할 때, 제대로 저장이 되지 않는 등의 문제가 있다. 파일명을 위한 인코딩 설정을 위해 .emacs 파일에 아래의 내용을 추가한다.
    (set-file-name-coding-system 'cp949-dos)
    


2. Shift-Space 키에 의한 한영 변환 기능을 제거


윈도우 환경 Emacs에서는 Shift-Space, 한영키 둘 다에 의해 한영 변환을 지원하지만, 가끔씩 상태가 꼬여서 불편한 사태가 발생하게 된다.


.emacs 파일에 다음 내용을 추가하면 Shift-Space 키에 의한 한영 변환 기능을 제거할 수 있다.


  • [추가] 하지만 이렇게 하더라도 C-s를 눌러서 들어가는 Search buffer로 들어가면 Shift-Space에 의한 변환이 동작한다. 그러므로 상태바에 한2 이런 표시가 보이면 Search buffer로 냉큼 들어가서 Shift-Space를 누르면 원래대로 돌아온다
(global-unset-key (kbd "S-SPC"))


혹은 Shift-Space 키를 다른 기능으로 설정할 수도 있다.

(global-set-key (kbd "S-SPC") 'other-window) ; 다른 창으로 이동 기능으로 설정


키에 설정된 기능을 확인하려면, M-x를 누르고 describe-key를 입력 후 해당 키를 누르거나, M-x를 누르고 describe-bindings를 눌러 전체 설정 내역을 확인할 수 있다.



참고 사이트

<테스트 환경>
- OS : Windows 10
- Emacs 버전 : Emacs 24.5.1 윈도우용
,

SBCL에서 디렉토리 내의 파일/디렉토리 리스트를 가져오는 방법입니다. (sb-posix, sb-grovel을 사용한 방법)


1. 디렉토리 리스트 가져오기


(require :sb-posix)
(require :sb-grovel)

(defun is-directory (pathname) ; 주어진 경로가 디렉토리인지 체크한다
  (ignore-errors
    (sb-posix:s-isdir (sb-posix:stat-mode (sb-posix:lstat pathname)))
    )
  )

(defun get-directory-contents (pathname) ; 주어진 경로 내의 모든 디렉토리/파일 리스트를 얻는다
  (let ((dir (sb-posix:opendir pathname)))
    (prog1
      (loop for dirent = (sb-posix:readdir dir)
           until (sb-grovel::foreign-nullp dirent)
           unless (or (equal (sb-posix:dirent-name dirent) ".")
                      (equal (sb-posix:dirent-name dirent) ".."))
           collect (concatenate 'string pathname "/"
                                (sb-posix:dirent-name dirent)))
      (sb-posix:closedir dir))
    )
  )

(defun get-dirs (dir) ; 주어진 경로 내의 모든 디렉토리 리스트를 얻는다 (get-directory-contents의 결과 중 디렉토리가 아닌 항목을 제거한다)
  (remove-if-not #'is-directory (get-directory-contents dir))
  )


(defparameter dir-list nil)

(setq dir-list (get-dirs ".")) ; 현재 디렉토리 내의 디렉토리를 가져와 DIR-LIST에 저장한다


(dolist (dir dir-list) ; DIR-LIST의 내용을 출력한다
  (print dir)
  )




2. 파일 리스트 가져오기


(require :sb-posix)
(require :sb-grovel)

(defun is-directory (pathname) ; 주어진 경로가 디렉토리인지 체크한다
  (ignore-errors
    (sb-posix:s-isdir (sb-posix:stat-mode (sb-posix:lstat pathname)))
    )
  )

(defun get-directory-contents (pathname) ; 주어진 경로 내의 모든 디렉토리/파일 리스트를 얻는다
  (let ((dir (sb-posix:opendir pathname)))
    (prog1
      (loop for dirent = (sb-posix:readdir dir)
           until (sb-grovel::foreign-nullp dirent)
           unless (or (equal (sb-posix:dirent-name dirent) ".")
                      (equal (sb-posix:dirent-name dirent) ".."))
           collect (concatenate 'string pathname "/"
                                (sb-posix:dirent-name dirent)))
      (sb-posix:closedir dir))
    )
  )

(defun get-dirs (dir) ; 주어진 경로 내의 모든 디렉토리 리스트를 얻는다 (get-directory-contents의 결과 중 디렉토리가 아닌 항목을 제거한다)
  (remove-if-not #'is-directory (get-directory-contents dir))
  )

(defun get-files (dir) ; 주어진 경로 내의 모든 파일 리스트를 얻는다 (get-directory-contents의 결과 중 디렉토리인 항목을 제거한다)
  (remove-if #'is-directory (get-directory-contents dir))
  )

(defparameter file-list nil)

(setq file-list (get-files ".")) ; 현재 디렉토리 내의 파일 리스트를 가져와 FILE-LIST에 저장한다


(dolist (file-item file-list) ; FILE-LIST의 내용을 출력한다
  (print file-item)
  )




<테스트 환경>

OS : Windows 7

Emacs 버전 : Emacs 24.3 윈도우용

SBCL 버전 : 1.2.7

Slime 버전 : 2.21


,

파일에 저장된 SBCL 소스를 커맨드 프롬프트에서 스크립트처럼 실행할 수도 있다.


sbcl.exe --script <filename>



아래와 같이 배치파일로 저장해두어도 된다.


runcl.bat :

sbcl.exe --script %1



<테스트 환경>

OS : Windows 7

SBCL 버전 : 1.2.7


,