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

Emacs 如何使用yasnippet和abbrev使自动完成工作?,emacs,autocomplete,key-bindings,yasnippet,Emacs,Autocomplete,Key Bindings,Yasnippet,我希望Emacs能像这样工作: 让自动完成自动弹出菜单: (setq ac-auto-show-menu 0.8) (setq ac-delay 0.1) 使用C-n/p/M-n/p选择自动完成弹出菜单候选项: (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-

我希望Emacs能像这样工作:

  • 自动完成
    自动弹出菜单:

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

    (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)
      
    • 如果候选人是abbrev,Enter应仅选择candiate:

      ;; ???
      
      。。。按空格键会使Emacs自动展开abbrev

    • 如果候选项是dabbrev,则在候选项上按M-\n将触发
      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"
      
      但是在某些模式下(
      ruby模式
      降价模式
      org模式
      ,等等),命令绑定到
      (kbd”“)
      。当键入真正的tab键时,绑定到
      (kbd”)
      的函数具有更高的优先级,因此不会调用
      yasnippet
      自动完成
      。通过移动键绑定可以很容易地解决这一问题:

      (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)
      
      (defun iy选项卡无冲突()
      (让((命令(键绑定[tab]));记住命令
      (本地未设置键[选项卡];从(kbd“)取消设置)
      (本地设置键(kbd“TAB”)命令);重新绑定到(kbd“TAB”)
      (添加钩子'ruby mode hook'iy ac tab noconflict)
      (添加挂钩“降价模式挂钩”iy ac选项卡无冲突)
      (添加钩子“组织模式钩子”iy ac选项卡无冲突)
      
      我的设置 我通过
      el-get
      packager管理器下载了
      yasnippet
      auto complete
      。我使用的是Ubuntu 12.04和Emacs 24.3.50.1

      收尾 我知道这个问题有点长,但它确实让我很难使用
      自动完成
      yasnippet
      。如果基本密钥绑定不能顺利工作,这会使我的工作流程慢很多。我想很多人都有类似的问题,因为我在互联网上发现了一些类似的问题(虽然没有一个和我的一模一样)

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

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


      谢谢你的帮助!

      我很早以前就遇到了你描述的问题,并这样解决了它: 将
      自动完成
      绑定到选项卡(同样是C-i) 和
      yasnippet
      到C-o。 Abbrev也在C-o上,但我不经常使用

      优点是:

    • 没有状态行为会导致更轻松、更高效的编辑
    • 在按下之前,您不再想“TAB在这种情况下会做什么?”, 你只要按它
    • 你不再检查你是否得到了预期的结果,因为只有一个
    • 在扩展yasnippet的过程中,您可以使用
      自动完成
    • C-i和C-o是邻居,很容易按下
    • 由于没有模式覆盖C-o,所以Yasnippets现在可以在任何模式下可靠地扩展
    • 这可能不是你现在想要的,而是试着去尝试:
      过一会儿你可能会喜欢它。

      绑定
      RET
      函数
      ac expand
      。这是为选定的候选人准备的。

      好主意,我以前试过,但仍然试图找到解决方案,因为我认为TAB是用于此操作的。这似乎很神奇。但确实如此。我发现C-o很好。我会喜欢它。但我仍然有e问题,关于使用[Enter]在自动完成弹出菜单中选择候选人。yasnippet似乎不能为我工作(这是我知道的另一个问题)。我尝试使用[M-x yas expand]要扩展触发器,但它也不起作用。您对这个问题有何看法?对于
      自动完成
      ,我总是使用
      选项卡
      C-I
      展开,从来没有使用
      RET
      。对于
      yasnippet
      ,您可以从MELPA和
      获得
      自动yasnippet
      (全局设置键“\C-o”'aya打开行)
      。不,我不想用
      RET
      完成,我用
      RET
      选择Conducate。我让auto complete自动弹出菜单。我把
      选项卡给snippet engine->YASnippet。正如你喜欢的,我用
      C-I
      选择候选人。对不起,也许你误解了我的意思,我的意思是我用
      C-n/p
      M-n/p
      在自动完成弹出菜单中导航。我想使用
      RET
      在菜单中选择候选人。如果我没有误解您的话,我想您可以使用
      C-I
      启用自动完成以弹出菜单。如果我想使用
      C-I
      选择候选人,我至少需要一个绑定函数,选择cand的函数是什么伊达特?
      ;; trigger using TAB and disable auto-start
      (custom-set-variables
       '(ac-trigger-key "TAB")
       '(ac-auto-start nil)
       '(ac-use-menu-map t))
      
      (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)