Q:yasnippet
elispコード内から(スニペットフィールドを認識して)テキスト文字列を正しく展開するにはどうすればよいですか?
非常に単純なスニペットは、いくつかの制御文字が混在した単なる文字列です。elispフォームを使用してよりリッチなスニペットを作成することもできますが、それらを適切に展開する方法がわかりません。
これは問題を捉えた簡単な例です。のorg-mode
ようなリンクスケルトンを挿入するスニペットを作成しています[[source][description]]
。次の簡単なスニペットは、「ソースフィールドで開始し、説明フィールドで終了する」という望ましい動作を生成します。
[[$1][$0]]
elispコードをスニペット( `sでラップ)に混在させることができます。if
は単に[[$1][$0]]
文字列として評価されるため、次のコードは単純なバージョンとまったく同じ動作を生成すると考えていました。
`(if t "[[$1][$0]]")`
ただし、そうはしません。代わりに、$0
and $1
フィールドがフィールドではないかのように機能し、スニペットを終了し、最後のの後にポイントを配置し]
ます。それで、elispフォームがyasnippet
フィールドに埋め込まれたテキスト文字列に評価されるときに、どのようにして望ましい動作を得るのでしょうか?
編集:要求されたとおり、ここに質問を引き起こした特定のユースケースがあります。XクリップボードにURLリンクが含まれている場合は、組織リンクのソースフィールド([[ source ] [description]])を入力し、リンク先フィールドをそのままにしておきます。dan-xclipboard-link-p
存在する場合はURLを返すヘルパー関数()を使用しますnil
。私には次のようなことができるはずです:
`(let ((link (dan-xclipboard-link-p)))
(if link
(concat "[[" link "][$0]]")
"[[$1][$0]]"))`
実際、以前のバージョンのyasnippetでは、このコードのバージョンは意図したとおりに機能しました。
編集2:興味深いことに、このスニペットは、Xクリップボードにリンクがある場合は機能しますが、ない場合は失敗します(つまり、$1
フィールドとして認識されません)。
[[`(or (dan-xclipboard-link-p) "$1")`][$0]]
yas-insert-snippet
ここでどのように適用されるかはわかりません。とにかく、実際に使用されていたケース(以前は機能していたもの)が問題になっています。
(if t (yas-insert-snippet))
ですか?実際のユースケースを理解できるように、より現実的な条件を与えることができますか?これは、より洗練されたソリューションでのXY問題である可能性があります。