org-babel 결과를 코드 주석으로 출력 할 수 있습니까?


13

블로그, 교과서 등에서는 일부 코드의 결과를 주석으로 표시하는 것이 일반적입니다.

(+ 1 1) ;=> 2

조직 모드의 바벨 기능을 사용하여 이와 같은 결과를 자동으로 표시하는 방법이 있습니까?

특히, 내가 원하는 것은 다음과 같이 헤더를 지정할 수 있다는 것입니다.

#+begin_src scheme <some headers>
(+ 1 1)
(/ 4 (* 2 2))
#+end_src

내가 다음과 같이 변할 것입니다 C-c C-c:

#+begin_src scheme <some headers>
(+ 1 1) ;=> 2
(/ 4 (* 2 2)) ;=> 1
#+end_src

그런 다음 이렇게 변경하면 ...

#+begin_src scheme <some headers>
(+ 1 5) ;=> 2
(/ 8 (* 2 2)) ;=> 1
#+end_src

... 그리고 C-c C-c주석을 업데이트 된 주석으로 대체합니다.

#+begin_src scheme <some headers>
(+ 1 5) ;=> 6
(/ 8 (* 2 2)) ;=> 2
#+end_src

또는, 내가 위에서 꿈꿔 왔던 것보다 짧게, github의 org 파일 렌더러에 의해 결과를 표시하는 쉬운 방법이 있습니까?

#+RESULTS:
: 2

재미있는 생각이지만 기성품이 없다고 생각합니다. 미리 정해진 장소에 결과를 배치하기 위해 특정 Babel 백엔드를 수정하려고합니다. 예를 들어 결과가 여러 줄로 표시되는 경우 복잡해 보이지만
wvxvw

답변:


7

이 시도

명명 된 코드 블록과 noweb헤더를 사용 하여 코드를 읽고 쓸 수있는 프로그램으로 바꾸십시오.

#+NAME: my-code
#+BEGIN_SRC elisp :exports none 
(+ 1 1)
#+END_SRC

#+NAME: my-other-code 
#+BEGIN_SRC elisp :exports none 
(/ 4 (* 2 2))
#+END_SRC

org코드 블록을 생성 하여 결과를 코드 형식으로 지정

#+BEGIN_SRC org :results drawer replace :noweb yes :exports results 

  ,#+NAME: my-code-with-answer
  ,#+BEGIN_SRC elisp  :exports code 
  <<my-code>> ;=> <<my-code()>>
  <<my-other-code>> ;=> <<my-other-code()>>
  ,#+END_SRC


#+END_SRC

수행 C-c C-corg코드 블록과 아래의 코드와 비슷한 결과를 볼 수 :

#+RESULTS:
:RESULTS:

#+NAME: my-code-with-answer
#+BEGIN_SRC elisp  :exports code 
(+ 1 1) ;=> 2
(/ 4 (* 2 2)) ;=> 1
#+END_SRC

:END:

Github에 코드를 게시하면

(+ 1 1) ;=> 2
(/ 4 (* 2 2)) ;=> 1

이 코드는
GNU Emacs 24.5.1 (x86_64-unknown-cygwin, GTK + 버전 3.14.13)
Org-Mode 버전 : 8.3.2
및 github 에서 테스트되었습니다 .


감사. 이것은 유용한 접근 방식이며 원하는 방식으로 결과를 형식화 할 수있을만큼 유연 해 보입니다. 그러나 (내 자신의 솔루션과 같은) 너무 빠른 메모 나 블로그 게시물에 편리하기에 너무 길다고 생각합니다. 아마도이 기능을 사용하여 babel을 수정하면 거기에 도달 할 수 있습니다.
parkeristyping

1
@ parkeristyping-동의합니다. 너무 장황하다. 예를 들어 블로그와 같이 상당히 자주 할 일이라면 보통 2 단계에서 서식이 지정된 조직 코드를 생성하는 템플릿 코드를 작성합니다. 그런 다음 템플릿 생성기로 전달되는 변수를 업데이트합니다 :var my_code='("my-code" "my-other-code"). 그럼에도 불구하고 여전히 내가 원하는 것보다 더 번거 롭습니다. 답변을 업데이트 하시겠습니까?
Melioratus

@ parkeristyping-방금 다른 방법을 찾았지만 원본 org 파일을 내보내고 GitHub에 내보내기를 게시해야합니다.
Melioratus

3

기존 Babel 기능으로 달성 할 수 있었던 가장 가까운 것은 다음과 같습니다.

먼저 emacs-lisp 함수를 정의하여 다음과 ";=> "같이 결과를 추가합니다 .

#+name: commentify
#+begin_src emacs-lisp :var result="" :exports none
(concat ";=> " (format "%s" result))
#+end_src

그런 다음 :post헤더를 사용하여 결과를 처리합니다 .

#+begin_src scheme :post commentify(*this*) :results code :exports both
(+ 5 7)
#+end_src

헤더에 C-c C-c의해 github 에 다음을 표시 :exports both하지만 별도의 코드 블록에 있습니다.

#+RESULTS:
#+BEGIN_SRC scheme
;=> 12
#+END_SRC

이 전략은 조직 파일이 너무 복잡하여 가치가 있다고 생각합니다. 코드 평가 확인을 비활성화하지 않으면 "코드를 평가 하시겠습니까?"라는 두 가지를 수락해야합니다. 프롬프트 (Scheme 블록과 elisp에 대해 하나씩 commentify).


1

다음과 같이 할 수 있습니다 :

  1. 평소와 같이 명명 된 Multi-Line 소스 코드 블록 작성

  2. 줄 바꿈을에서 BEGIN/END_SRC로 변경하십시오 …-EXAMPLE.

    # + NAME : 실제 소스
    # + BEGIN_EXAMPLE emacs-lisp
    (+ 3 4)
    (* 4 47)
    # + END_EXAMPLE
  1. 첫 번째 코드 블록 아래에이 블록을 붙여 넣고 실행하십시오.
    # + 이름 : LispBlock
    # + HEADER : : var lcmds = 실제 소스
    # + BEGIN_SRC emacs-lisp : 결과 출력 : src emacs-lisp 랩
    (dolist (cmd (분할 문자열 lcmds "\ n"))
      ((string = ""cmd가 아닌 한)
        (원칙
         ( "% s \ t; → % s \ n"형식
                 cmd (평가판 (자동차 (문자열 cmd)))))))
    # + END_SRC
  1. 결과:
    # + 결과 : LispBlock
    # + BEGIN_src emacs-lisp
    (+34); → 7
    (* 4 47); → 188
    # + END_src
  1. 필요에 따라 개별 이름을 가진 여러 줄의 소스 블록을 텍스트에 추가하십시오.

  2. 변수 #+CALL:이름으로 블록 이름을 지정하는 행을 추가하십시오 lcmds. 위의 변환 블록은 문서 당 한 번만 필요합니다.

변형 블록은 처리중인 언어로 작성해야합니다.

나는 먼저 @melioratus의 좋은 솔루션을 "자동화"하려고 시도했지만 위의 솔루션에 부딪쳤을 때 문제가 발생했습니다.

번호 목록과 코드 블록 문제를 피하는 데 필요한 수정 사항을 지적한 @jpkotta thx


1
매우 영리한 해결 방법! 게시 해 주셔서 감사합니다!
Melioratus
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.