在hippie-expand中模拟dabbrev-expand,限制匹配缓冲区

时间:2012-12-19 17:29:07

标签: emacs autocomplete elisp emacs24

如果我使用dabbrev-expand进行扩展,Emacs将搜索当前缓冲区,然后搜索具有相同模式的其他缓冲区。这由dabbrev-friend-buffer-function处理,默认设置为dabbrev--same-major-mode-p

这很好用,但我想使用hippie-expand

(setq hippie-expand-try-functions-list
  '(try-expand-dabbrev
    try-expand-dabbrev-all-buffers))

这会从所有缓冲区中提取完成,甚至是与当前主模式不匹配的缓冲区。

如何将hippie-expand与仅使用与当前缓冲区相同的主模式的缓冲区的dabbrev完成一起使用?

2 个答案:

答案 0 :(得分:2)

快速而肮脏的解决方案:将函数try-expand-dabbrev-all-buffers的源代码复制到新位置,重命名(例如)try-expand-dabbrev-all-buffers-same-mode,并将表达式(buffer-list)替换为表达式:< / p>

(remove-if-not (lambda (x) (eq major-mode (with-current-buffer x major-mode)))
               (buffer-list))

(您需要(require 'cl)才能获得remove-if-not,或者根据mapcardelq重新实施。

然后,当然,将try-expand-dabbrev-all-buffers替换为try-expand-dabbrev-all-buffers-same-mode中的hippie-expand-try-functions-list

您可以使用 C-h f 获取try-expand-dabbrev-all-buffers的来源。

答案 1 :(得分:1)

基于Sean的出色建议(并假设您已安装dash.el列表实用程序库):

(autoload '--filter "dash" nil t)

;; only consider buffers in the same mode with try-expand-dabbrev-all-buffers
(defun try-expand-dabbrev-matching-buffers (old)
  (let ((matching-buffers (--filter
                           (eq major-mode (with-current-buffer it major-mode))
                           (buffer-list))))
    (flet ((buffer-list () matching-buffers))
      (try-expand-dabbrev-all-buffers old))))