- Learn about Wiki
- Lectures
- Study
- Tips
<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")