yasnippetとpolymodeを使用してコードチャンクをRマークダウンに挿入する


10

コードチャンクをRマークダウンファイルに挿入するyasnippetを記述しようとしています。ポリモードを使用して、1つのファイルに複数のメジャーモード(マークダウン、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>)

スニペットが表示され、私のカーソルは正しい位置にあります(2番目の中括弧の直前):

```{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に精通しています。この関数Rmdワークフローを実装する方法を説明できますか?
チャンドラー2017年

4
Emacsを起動するたびにロードされるように、コードを.emacsファイルに入れます。その後、を介してそれを呼び出すことができますM-x tws-insert-r-chunk。おそらくあなたはこのコマンドをキーボードショートカットにバインドしたいと思うでしょう-キーバインドの設定に関してここにたくさんの質問があります。
タイラー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.