【问题标题】:How to make auto-complete work with yasnippet and abbrev?如何使用 yasnippet 和 abbrev 进行自动完成工作?
【发布时间】:2013-11-22 22:27:28
【问题描述】:

我希望 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 展开 sn-p 触发器:

      (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 "&lt;tab&gt;") / ([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 "&lt;tab&gt;")。键入真正的tab键时,绑定(kbd "&lt;tab&gt;)的函数优先级更高,所以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)

我的设置

我通过el-get 打包管理器下载了yasnippetauto-complete。我正在使用 Ubuntu 12.04 和 Emacs 24.3.50.1。

结束

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

正如你在上面看到的,一些相关的设置我已经知道了。 (但如果您认为我在某处犯了错误,请告诉我。)还有一些我仍然不知道如何设置的东西(???)。也许没有办法让这些设置所有一起工作?让我知道是否是这种情况,否则请确保这些设置不会相互干扰。

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

感谢您的帮助!

【问题讨论】:

    标签: emacs autocomplete key-bindings yasnippet


    【解决方案1】:

    RET&lt;return&gt; 绑定到函数ac-expand。这是给选定的候选人。

    【讨论】:

      【解决方案2】:

      我很久以前就遇到过您描述的问题并像这样解决了它: 将auto-complete 绑定到 TAB (同样是 C-i) 和 yasnippetC-oC-o 上也有缩写,但我不经常使用它们。

      优点是:

      1. 没有状态行为会带来更加轻松和高效的编辑。
      2. 您不再想“TAB 在这种情况下会做什么?”按压前, 你只需按下它。
      3. 您不再检查是否得到了预期的结果,因为只有一个。
      4. 在扩展yasnippet的过程中,您可以使用auto-complete
      5. C-iC-o 是邻居,很容易按。
      6. Yasn-ps 现在可以在任何模式下可靠地扩展,因为没有模式会覆盖 C-o

      这可能不是您现在想要的,但请考虑尝试一下: 一段时间后你可能会喜欢它。

      【讨论】:

      • 好主意,我之前尝试过这个,但仍然尝试为此找到解决方案,因为我认为 TAB 是针对此操作的。这似乎很荒谬。但确实如此。我发现 C-o 很好。我会喜欢的。但我仍然有问题,关于使用 [Enter] 在自动完成弹出菜单中选择候选人。似乎 yasn-p 对我不起作用(这是我知道的另一个问题)。我尝试使用 [M-x yas-expand] 来扩展触发器,但它也不起作用。您如何看待这个问题?
      • 对于auto-complete,我总是使用tabC-i 进行扩展,从不使用RET。对于yasnippet,您可以从MELPA 和(global-set-key "\C-o" 'aya-open-line) 获得auto-yasnippet
      • 不,我不想用RET 完成,我用RET 选择condicate。我让自动完成自动提升弹出菜单。我将TAB 提供给 sn-p 引擎 -> YASnippet。
      • 如你所愿,我选择C-i的候选人。
      • 抱歉,您可能误解了我的意思,我的意思是我使用C-n/pM-n/p 在自动完成弹出菜单中导航。我想在菜单中使用RET select 候选人。如果我没有误解你的话,我想你使用C-i 来启用自动完成以弹出菜单。如果我想使用C-i来选择候选人,我至少需要一个函数来绑定,选择候选人的功能是什么?
      猜你喜欢
      • 2012-11-01
      • 1970-01-01
      • 2013-03-24
      • 2012-04-09
      • 2016-06-10
      • 1970-01-01
      • 1970-01-01
      • 2015-08-07
      • 2012-06-03
      相关资源
      最近更新 更多