2

開いているすべてのバッファ内でタブを完全に取得しようとしており、yasnippet の両方がタブ キーで動作します。現時点では、どちらか一方を使用できます。次のコードは、私が yasnippet の展開をどのように処理しているかを示していますが、私は Lisp プログラマーではないので、ここで間違いを見つけることはできません。

スニペットを展開できない場合は、バッファから展開してみてください。

;; Auto complete settings / tab settings
;; http://emacsblog.org/2007/03/12/tab-completion-everywhere/ <-- in the comments
(global-set-key [(tab)] 'smart-tab)
(defun smart-tab ()
  "This smart tab is minibuffer compliant: it acts as usual in
    the minibuffer. Else, if mark is active, indents region. Else if
    point is at the end of a symbol, expands it. Else indents the
    current line."
  (interactive)
  (if (minibufferp)
      (unless (minibuffer-complete)
        (dabbrev-expand nil))
    (if mark-active
        (indent-region (region-beginning)
                       (region-end))
      (if (looking-at "\\_>")
          (unless (yas/expand)
            (dabbrev-expand nil))
        (indent-for-tab-command)))))
4

1 に答える 1

1

まず、コードが何をするのか、そしてあなたが何をしたいのかを理解しようとします。

あなたのコード

  • first checksポイントが にある場合the minibuffer

    • もしそうなら、それはミニバッファを完成させようとします

      • (ミニバッファーで) 完了できない場合は、dabbrev-expand を呼び出します。
  • そうでなければ、ポイントがnot in minibuffer

    • 一部の領域が とマークされている場合、その領域がインデントされます。

    • の場合no mark is active、ポイントがend of some word

      • そうであれば、yasnippet が展開できるかどうかをチェックします。

        • yas が展開できない場合は、dabbrev-expand を呼び出します
      • そうでない場合は、現在の行をインデントしようとします

これはあなたのコードが行うことです。

yas/expand が原因でコードが失敗します。拡張が失敗した場合、このコマンドは返されません。

このコマンドが失敗した場合、変数の状態をチェックしますyas/fallback-behavior。あなたの場合のように、この変数に値があるcall-other-command場合、失敗したyas展開は、変数に保持されているキーにバインドされたコマンドを呼び出しますyas/trigger-key

あなたの場合、この変数はTAB.

そう: あなたは単語の最後にいます, あなたはそれを完了するために TAB を押します, これはインタラクティブsmart-tabを引き起こします. yas/expand を呼び出しTABます.

nil to yas/fallback-behavior問題の解決策は、このsmart-tab関数に一時的にバインドすることです。

これを修正する方法は次のとおりです。

(if (looking-at "\\_>")
      (let ((yas/fallback-behavior nil))
        (unless (yas/expand)
          (dabbrev-expand nil)))
    (indent-for-tab-command))
于 2013-01-01T11:24:41.950 に答える