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.

    • 如果是这样,那么它会尝试完成 minibuffer

      • 如果(在 minibuffer 中)无法完成它,它会调用 dabbrev-expand
  • 否则,如果要点是not in minibuffer

    • 如果某个区域被标记,它会缩进该区域。

    • if no mark is active,它检查该点是否在end of some word

      • 如果是这样,它会检查 yasnippet 是否可以扩展。

        • 如果 yas 不能扩展,它会调用 dabbrev-expand
      • 如果不是,它会尝试缩进当前行

这就是您的代码所做的。

您的代码由于 yas/expand 而失败。如果扩展失败,此命令不会返回。

如果此命令失败,它会检查变量的状态yas/fallback-behavior。如果此变量具有 value 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 回答