조직 모드에서 소스 코드 블록을 자동으로 포맷하는 방법


11

org-mode를 사용하여 책에 대한 메모를 할 때 때때로 일부 코드 스 니펫을 메모 파일에 복사 / 붙여 넣기합니다. 붙여 넣은 후

1. `C-c '` to call `org-edit-special`
2. `C-x h` to mark all the source code
3. `TAB` to format it

코드를 붙여 넣은 후에 #+BEGIN_SRC...#+END_SRC자동으로 코드 블록 TAB을 포맷하거나 전체 소스 코드 블록을 포맷 (들여 넣기) 하는 것과 같은 하나의 키를 사용할 수 있는 org-mode 솔루션 이 있습니까?

기본값 TAB(을 사용하지 않고 블록으로 입력 C-c ')은 #+BEGIN_SRC헤더 다음에 모든 행을 2 열 정렬 하는 것입니다. 두 번째 줄의 시작 부분에 공백이 있으면 더 많은 공백이 추가되고 3 단계와 같은 모든 행이 들여 쓰기되지 않습니다.

답변:


7

아래는 어려운 해결책이지만 완벽하게 작동합니다. 실제로 그것은 단지 당신의 작업을 시뮬레이션하는 함수이며, run-at-time10 초마다 호출되도록 a 를 사용합니다. 건배.

(defun indent-org-block-automatically ()
  (when (org-in-src-block-p)
   (org-edit-special)
    (indent-region (point-min) (point-max))
    (org-edit-src-exit)))

(run-at-time 1 10 'indent-org-block-automatically)

물론 1 초마다 호출하도록 할 수 있습니다. 10을 1로 변경하면됩니다.


run-at-time실제로 필요하지 않습니다 . TAB키를 바인딩 하여 기본 TABwhen 을 대체하기 위해 키를 바인딩하는 방법은 무엇입니까 org-in-src-block-p? 기본값 TAB은 제한되어 yas-expand있지만 게시물에서 말한 것처럼 작동합니다.
CodyChan


0

이것은이 문제를 해결하기 위해 작성한 코드입니다.

(defun udf/my-org-tab-dwim (&optional arg)
  (interactive)
  (or (org-babel-do-key-sequence-in-edit-buffer (kbd "TAB"))
      (org-cycle arg)))

(define-key org-mode-map
  (kbd "<tab>") #'udf/my-org-tab-dwim)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.