【发布时间】: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 "<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-mode、markdown-mode、org-mode 等),该命令绑定到
(kbd "<tab>")。键入真正的tab键时,绑定(kbd "<tab>)的函数优先级更高,所以yasnippet和auto-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 打包管理器下载了yasnippet、auto-complete。我正在使用 Ubuntu 12.04 和 Emacs 24.3.50.1。
结束
我知道这个问题有点长,但它确实让我很难使用auto-complete和yasnippet。如果基本键绑定不能顺利进行,这会大大减慢我的工作流程。我想很多人都有类似的问题,因为我在互联网上发现了一些类似的问题(尽管没有一个与我的完全一样)。
正如你在上面看到的,一些相关的设置我已经知道了。 (但如果您认为我在某处犯了错误,请告诉我。)还有一些我仍然不知道如何设置的东西(???)。也许没有办法让这些设置所有一起工作?让我知道是否是这种情况,否则请确保这些设置不会相互干扰。
得到这个问题的答案后,我希望写一个 Emacs 扩展来自动初始化所有这些设置。
感谢您的帮助!
【问题讨论】:
标签: emacs autocomplete key-bindings yasnippet