emacs smart-tab with yasnippets

时间:2012-11-27 01:38:51

标签: ruby-on-rails emacs lisp yasnippet

我正在尝试在所有打开的缓冲区中使标签完成,并且yasnippet都使用tab键。此刻我可以拥有一个或另一个。以下代码是我如何处理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)))))

1 个答案:

答案 0 :(得分: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,以防万一它无法扩展调用{{{}的绑定函数1}},这是无限循环。

您的问题的解决方案是在此TAB函数中临时绑定nil to yas/fallback-behavior

以下是修复方法:

smart-tab