User Tools

Site Tools


tips:nrepl.el:nrepl-sp.el

<markdown> # nrepl-sp.el * 왜? - lighttable 비스무리하게, 소스코드 상에서 expression의 평가 결과를 확인하고 싶었습니다.

* 키 설정 - `Ctrl + Enter`: expression을 평가한다. - 출력 결과를 되돌리고 싶으시면, emacs에서 제공하는 undo기능을 이용하면됩니다.

* 코드도 그리 길지 않아 간략하게 설명하자면, - 현재 커서가 포함된 expression의 영역을 구한다. - expression 영역끝으로 커서를 보낸 후, - expression의 내용과 핸들러를 nrepl-send-string으로 보낸다. - 그러면, nrepl이 expression을 평가한 후 핸들러를 통해 평가 결과를 돌려준다.

## 소스코드 </markdown>

;; # nrepl-sp.el
;; * Author: netpyoung
;; * Lisence: Same as Emacs
 
(require 'nrepl)
 
(defun nrepl-sp:format (prefix str)
  ;; (xx:format "@" "1\n2\n") => "@1\n@2\n"
  (let* ((str (replace-regexp-in-string "\^M" "" str))
         (str (split-string str "\n" t))
         (line-prefix (concat "\n" prefix)))
    (concat prefix (mapconcat 'identity  str line-prefix) "\n")))
 
 
(defun nrepl-sp:print-handler (buffer)
  ;; buffer value-handler stdout-handler stderr-handler &optional done-handler
  (nrepl-make-response-handler
   buffer
   (lambda (buffer value)
     (with-current-buffer buffer (insert (nrepl-sp:format ";=> " value))))
   (lambda (buffer out)
     (with-current-buffer buffer (insert (nrepl-sp:format ";>> " out))))
   (lambda (buffer err)
     (let ((err (first (split-string err "  "))))
       (with-current-buffer buffer (insert (nrepl-sp:format ";-> " err)))))
   '()))
 
 
(defun nrepl-sp:eval-last-exp ()
  (interactive)
  (let* ((region (nrepl-region-for-expression-at-point))
         (expr (buffer-substring (first region) (second region))))
    (goto-char (second region))
    (nrepl-send-string expr
                       (nrepl-sp:print-handler (current-buffer)) nrepl-buffer-ns)))
 
 
;; [== key setting ==]
(define-key nrepl-interaction-mode-map [(control return)] 'nrepl-sp:eval-last-exp)

<markdown> ## 참고. </markdown>

nrepl-region-for-expression-at-point: "point가 가리키는, defun의 시작과 끝 지점을 반환한다"
nrepl-send-string: "input받은 것을 보내고, 응답 핸들러 callback을 등록한다."
nrepl-make-response-handler: "response-handler를 만든다.."

insert: 현재 버퍼에서 가리키른 커서로부터 문자열을 입력한다.

goto-char: 지정한 위치로 커서를 움직인다.

(concat "a" "bc") ;=> "abc"

(split-string "1 2 3 " " ") ;=> ("1" "2" "3" "")
(split-string "1 2 3 " " " t) ;=> ("1" "2" "3")
tips/nrepl.el/nrepl-sp.el.txt · Last modified: 2019/02/04 14:26 (external edit)