如果我使用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完成一起使用?
答案 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
,或者根据mapcar
和delq
重新实施。
然后,当然,将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))))