1

我希望 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选择候选,不插入换行符

      ;; ???
      
    • 如果候选人是abbrevEnter应该只选择候选人:

      ;; ???
      

      ... 并按下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"
      
    • 如何使用 展开片段中的片段yasnippet


一些解释

TABEmacs中有两个:

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

如果模式喜欢yasnippet并且auto-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下载了 。我正在使用 Ubuntu 12.04 和 Emacs 24.3.50.1。auto-completeel-get

包起来

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

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

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

谢谢你的帮助!

4

2 回答 2

2

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

优点是:

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

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

于 2013-11-11T08:56:44.420 回答
0

绑定RET<return>函数ac-expand。这是为选定的候选人。

于 2013-11-11T10:06:22.003 回答