yasnippet 및 polymode를 사용하여 R Markdown에 코드 청크 삽입


10

코드 청크를 R Markdown 파일에 삽입하기 위해 yasnippet을 작성하려고합니다. 폴리 모드를 사용하여 단일 파일에 여러 주요 모드 (markdown, ESS [S])가 있습니다. 이것은 내 스 니펫입니다.

# -*- mode: snippet -*-
# name: chunk
# key: chunk
# --
\`\`\`{r $1}
$0
\`\`\`

마크 다운 모드에서 스 니펫을 .Rmd 파일에 삽입하려고하면이 오류가 발생합니다.

Error in post-command-hook (yas--post-command-handler): (error "Marker points into wrong buffer" #<marker at 7 in test.Rmd>)

스 니펫이 나타나고 커서가 올바른 위치에 있습니다 (두 번째 중괄호 바로 앞).

```{r }

```

탭을 누르면 다음과 같은 결과가 나타납니다.

yas-next-field: Wrong type argument: overlayp, nil

폴리 모드와 상호 작용하고 있다고 생각합니다. 스 니펫을 삽입 할 때 마크 다운 모드에 있지만 폴리 모드는 코드 청크의 내용을 ESS [S] 모드로 변환합니다. 결국 폴리 모드에 새로운 청크삽입 하는 명령이있는 것처럼 보이지만 그동안이 스 니펫을 작동시킬 수있는 방법이 있습니까?

답변:


6

나는 비슷한 문제로 달리고, 사이의 이상한 상호 작용을 해결하기 위해 독립적 인 기능을 작성 yasnippet하고 polymode.

다음 함수는 시도한 스 니펫의 동작을 모방하여 먼저 헤더 정보를 입력하라는 메시지를 표시합니다. 헤더 정보는에 삽입 $1한 다음 청크 본문 (your $0) 에 드롭합니다 .

(defun tws-insert-r-chunk (header) 
  "Insert an r-chunk in markdown mode. Necessary due to interactions between polymode and yas snippet" 
  (interactive "sHeader: ") 
  (insert (concat "```{r " header "}\n\n```")) 
  (forward-line -1))

고마워 나는 열렬한 emacs 사용자이지만 lisp에 익숙합니다.이 기능을 구현하는 방법을 설명 할 수 있습니까?
챈들러

4
코드를 .emacs 파일에 넣으면 Emacs를 시작할 때마다로드됩니다. 그런 다음을 통해 전화 할 수 있습니다 M-x tws-insert-r-chunk. 이 명령을 키보드 단축키에 바인딩하고 싶을 것입니다. 여기에는 키 바인딩 설정에 대한 많은 질문이 있습니다.
Tyler
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.