如何使用yasnippet和abbrev自动完成工作?

时间:2013-11-11 07:26:02

标签: emacs autocomplete key-bindings yasnippet

我希望Emacs像这样工作:

  • auto-complete自动弹出菜单:

    (setq ac-auto-show-menu 0.8)
    (setq ac-delay 0.1)
    
  • 使用 C-n / p / M-n / p 选择auto-complete弹出菜单候选:

    (define-key ac-menu-map (kbd "M-n") 'ac-next)
    (define-key ac-menu-map (kbd "M-p") 'ac-previous)
    
  • 选择候选人时

    • 在弹出菜单选择中禁用 TAB / S-TAB

      (define-key ac-menu-map (kbd "<tab>") nil)
      (define-key ac-menu-map (kbd "<S-tab>") nil)
      
    • Enter 选择候选人,而不插入换行符

      ;; ???
      
    • 如果候选人是缩写 Enter 应该只选择候选人:

      ;; ???
      

      ...并按 Space 会导致Emacs自动展开缩写。

    • 如果候选人是 dabbrev ,则在候选人上按 M - \ 会触发dabbrev-expand

    • TAB / C-i 展开yasnippet的候选人:

      (setq yas-trigger-key "TAB")
      

      我设置了这个,但是当我按 TAB 时触发器不会扩展。

    • TAB 在字段中展开代码段触发器:

      (setq yas-triggers-in-field t)
      
    • C-j 跳转到下一个字段:

      (setq yas-next-field-key '("<tab>")) ;; or "C-j"
      
    • How can I expand a snippet within a snippet using yasnippet?


一些解释

Emacs中有两个 TAB

  • (kbd "TAB") / (\t, [9])
  • (kbd "<tab>") / ([tab])

如果yasnippetauto-complete等模式想要绑定到 TAB ,则其触发键必须与原始tab命令相同。由于Emacs将indent-for-tab-command绑定到(kbd "TAB"),因此最好将其用作触发键。 yasnippet默认绑定到它,并且很容易设置auto-complete以使用 TAB 触发:

;; trigger using TAB and disable auto-start
(custom-set-variables
 '(ac-trigger-key "TAB")
 '(ac-auto-start nil)
 '(ac-use-menu-map t))

但在某些模式下(ruby-modemarkdown-modeorg-mode等),命令必然会 (kbd "<tab>")。键入实际Tab键时,绑定到(kbd "<tab>)的函数具有更高的优先级,因此不会调用yasnippetauto-complete。通过移动键绑定很容易解决这个问题:

(defun iy-tab-noconflict ()
  (let ((command (key-binding [tab])))                 ; remember command
    (local-unset-key [tab]) ; unset from (kbd "<tab>")
    (local-set-key (kbd "TAB") command)))              ; re-bind to (kbd "TAB")
(add-hook 'ruby-mode-hook 'iy-ac-tab-noconflict)
(add-hook 'markdown-mode-hook 'iy-ac-tab-noconflict)
(add-hook 'org-mode-hook 'iy-ac-tab-noconflict)

我的设置

我通过yasnippet打包管理器下载了auto-completeel-get。我正在使用Ubuntu 12.04和Emacs 24.3.50.1。

结束

我知道这个问题有点长,但这确实让我很难使用auto-completeyasnippet。如果基本键绑定不能顺利运行,这会大大减慢我的工作流程。我想很多人都有类似的问题,因为我在互联网上发现了一些类似的问题(尽管它们都不像我的一样)。

如上所示,我已经了解了一些相关设置。 (但如果你认为我在某个地方犯了错误,请告诉我。)还有一些我还不知道如何设置的事情(???)。也许没有办法让所有这些设置一起工作?如果是这种情况,请告诉我,否则请确保这些设置都不会相互干扰。

在我得到这个问题的答案之后,我希望编写一个Emacs扩展来自动初始化所​​有这些设置。

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

我遇到了你很久以前所描述的问题,并解决了这个问题: 将auto-complete绑定到 TAB (同样 C-i ) 和yasnippet C-o 。 简称也在 C-o 上,但我不会经常使用它们。

优点是:

  1. 没有有状态的行为会导致更轻松,更有效的编辑。
  2. 您不再认为“TAB在这方面会做些什么?”在按下之前, 你按下它。
  3. 你不再检查你是否得到了预期的结果,因为只有一个。
  4. 您可以在展开auto-complete
  5. 的过程中使用yasnippet
  6. C-i C-o 是邻居,非常容易按。
  7. Yasnippets现在可以在任何模式下可靠地扩展,因为没有模式覆盖 C-o
  8. 这可能不是您现在想要的,但请考虑尝试: 你可能会在一段时间后喜欢它。

答案 1 :(得分:0)

RET<return>绑定到ac-expand。这是针对精选候选人的。