2012-12-19 62 views
1

如果我使用dabbrev-expand進行擴展,Emacs將搜索當前緩衝區,然後搜索其他具有相同模式的緩衝區。這由dabbrev-friend-buffer-function處理,默認設置爲dabbrev--same-major-mode-p仿真嬉皮擴展中的dabbrev-expand,限制匹配緩衝區

這工作正常,但我想使用hippie-expand

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

這是直接從所有緩衝區的完成,甚至不符合我目前的主要模式的緩衝區。

如何將hippie-expand與僅使用與當前緩衝區相同的主模式的緩衝區中的dabbrev完成項使用?

回答

1

基於肖恩的指教(假設你已經安裝了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)))) 
2

快速和骯髒的解決方案:

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

(你需要:功能try-expand-dabbrev-all-buffers的源代碼與表達式複製到新的位置,將其重命名(說)try-expand-dabbrev-all-buffers-same-mode,並更換表達(buffer-list)(require 'cl)得到remove-if-not,否則在mapcardelq方面重新實現它。)

然後,當然,在與try-expand-dabbrev-all-buffers-same-mode取代。

可以使用C-H˚F得到try-expand-dabbrev-all-buffers源。

+0

好主意。因爲我不打算使用'try-expand-dabbrev-all-buffers',所以我可以使用'defadvice'來根據謂詞創建'(buffer-list)'返回緩衝區。 –

+1

這是我的第一個想法,但建議這樣一個基本功能似乎充滿了我的危險。 – Sean

+0

我同意它可能會出錯(希望很少)。我更新了我的答案,只需調用'try-expand-dabbrev-all-buffers'並重新定義'matching-buffers'即可。 –