我希望 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选择候选,不插入换行符:
;; ???
如果候选人是abbrev,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"
一些解释
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-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)
我的设置
我通过打包管理器yasnippet
下载了 。我正在使用 Ubuntu 12.04 和 Emacs 24.3.50.1。auto-complete
el-get
包起来
我知道这个问题有点长,但它确实让我很难使用auto-complete
和yasnippet
. 如果基本键绑定不能顺利进行,这会大大减慢我的工作流程。我想很多人都有类似的问题,因为我在互联网上发现了一些类似的问题(尽管没有一个与我的完全一样)。
正如你在上面看到的,一些我已经知道的相关设置。(但如果您认为我在某处犯了错误,请告诉我。)还有一些我仍然不知道如何设置的东西(???
)。也许没有办法让所有这些设置一起工作?让我知道是否是这种情况,否则请确保这些设置都不会相互干扰。
在我得到这个问题的答案后,我希望编写一个 Emacs 扩展来自动初始化所有这些设置。
谢谢你的帮助!