Slime

SLIME(Superior Lisp Interaction Mode for Emacs)

  • 역사
    • Eric Marsden : SLIM을 만듬(2003. 중반쯤)
    • Luke Gorrie, Helmut Eller : 이를 확장시킴.
    • SLIME ( Extension of SLIM )
    • Superior Lisp Interaction Mode for Emacs
  • 기능
    • Slime-mode
    • SLDB : debugger 인터페이스
    • REPL기능 강화
    • 자동완성기능 제공
    • Inspector기능

slime역활

  • 에디터상의 코딩환경을 만들어 주고, Lisp 구현체와 데이터를 주고받을 수 있는 서버 제공
  • 에디터 >> 에디터 확장 -> Swank >> Lisp 구현체

분류단축키내용함수
평가
C-M-x현재 폼 평가slime-eval-defun
C-c C-l파일 로드slime-load-file
C-c ~REPL 네임스페이스 설정slime-sync-package-and-default-directory
이동
M-.정의로 이동slime-edit-definition
M-,되돌아가기slime-pop-find-definition-stack
C-c C-zREPL로 이동slime-repl
기타
C-M-i자동완성
M-*
C-c C-d C-ddescribe symbol
C-c M-oREPL 깨끗이하기
C-cmmacro expand
C-cdddescribe symbol
C-cd hhyperspec
디버깅
aAbort
qQuit
ncontiNue

설정

(use-package slime
  :ensure t
  :init
  (setq inferior-lisp-program (executable-find "sbcl"))
  (setq slime-contribs '(slime-asdf
                         slime-fancy
                         slime-indentation
                         slime-sbcl-exts
                         slime-scratch))
  (setq slime-complete-symbol-function 'slime-fuzzy-complete-symbol)
  (setq slime-net-coding-system 'utf-8-unix)
  (define-key slime-mode-map (kbd "C-c M-n") 'slime-sync-package-and-default-directory)
  ;; slime-lisp-implementations
  ;; common-lisp-hyperspec-root
  ;; common-lisp-hyperspec-symbol-table
  ;; common-lisp-hyperspec-issuex-table
  )

아래는 eros를 이용해서 오버레이로 띄울 수 있는 코드이다.

(progn
  ;; `overlay'
  ;; ref: https://www.reddit.com/r/emacs/comments/bi4xk1/evaluation_overlays_in_slime_for_common_lisp/
  (require 'cl-lib)
  (require 'eros)
  (defun custom:slime-eval-last-expression-eros ()
    (interactive)
    (let* ((region (slime-region-for-defun-at-point))
           (form (apply #'buffer-substring-no-properties region))
           (pos-end (list (- (cadr region) 1)))
           (expr (slime-eval `(swank:eval-and-grab-output ,form))))
      (cl-destructuring-bind (output value) expr
        (let ((val (concat output value)))
          (eros--make-result-overlay value
            :where pos-end
            :duration eros-eval-result-duration)
          (message value)))))
  ;; (keymap-set slime-mode-map "C-M-x" 'slime-eval-defun)
  (keymap-set slime-mode-map "C-M-x" 'custom:slime-eval-last-expression-eros))