3

Yasnippet スニペットがパーセント記号 を持ち、パーセント記号の前ではなく、パーセント記号の後にカーソルが配置されるという%点で、スニペットの最後のポイント で行を終了させると、$0パーセント記号の前では奇妙な動作をします。どうすればこの奇妙な動作を回避できるのだろうか。

次のスニペットを検討してください。

# -*- mode: snippet -*-
# name: test snippet
# key: ts
# --
{
$0%
}

次の例のように、アクティブ化すると、最初の行、最後の行、2 行目の 3 行挿入し、2 行目の前にカーソルを置く必要があると思います。{}%%

{
[cursor]%
}

しかし、何が起こるかは次のとおりです。

{
  % [cursor]
}

スニペットが思うように動作するようにするにはどうすればよいですか?

私の推測では、これは AUCTeX の何かが原因であると思われます。これは、AUCTeX が有効になっている場合に発生しますが、メジャー モードの Lisp インタラクションでは発生しないためです。

4

1 に答える 1

2

それは私の構成で正しく機能しますが、自動インデントに関係していると思われます(私のものは大幅にカスタマイズされているため、違いがある可能性があります)。追加しても問題は解決しますか

# expand-env: ((yas/indent-line 'fixed))

また

# expand-env: ((yas/indent-line t))

スニペットのヘッダーに?$>インデントしたい行に追加して、それが違いを生むかどうかを確認することもできます(そうであれば、物事が大幅に絞り込まれます)。yasnippet のコードには、マーカーの場所の変更に関するいくつかの問題に関するメモがありますが、数年前に修正されたようです。

indent-line-functionが適切な値、つまりであることも確認する必要がありますLaTeX-indent-line

sit-forの定義にいくつかの を追加yas/indent-according-to-modeして、ポイントがさまざまな段階にある場所を確認できます。たとえば、次のコードをスクラッチ バッファーに入れ、カーソルをその末尾に置いて、 と入力しC-x C-eます。次に、通常どおりスニペットを挿入すると、コード内の(sit-for 1). したがって、カーソルが間違った場所から始まる場合、問題はインデントの前などにあることがわかります。インデントされているすべての行を監視する必要があるため、問題のある行を除いてインデントをオフにしたい場合があります$>. を追加または削除sit-forすると、絞り込むことができます。

(defun yas/indent-according-to-mode (snippet-markers)
  "Indent current line according to mode, preserving
SNIPPET-MARKERS."
  (sit-for 1)
  (goto-char (yas/real-line-beginning))
  (sit-for 1)
  (let ((trouble-markers (remove-if-not #'(lambda (marker)
                                            (= marker (point)))
                                        snippet-markers)))
    (save-restriction
      (widen)
      (sit-for 1)
      (condition-case err
          (indent-according-to-mode)
        (error (message "[yas] warning: yas/indent-according-to-mode habing problems running %s" indent-line-function)
               nil)))
    (sit-for 1)
    (mapc #'(lambda (marker)
              (set-marker marker (point)))
          trouble-markers)))
于 2011-11-14T18:20:37.847 に答える