2016-11-23 69 views

回答

1

首先,comint-dynamic-complete已經過時了,因爲Emacs 24.1。替換功能是completion-at-point

現在,如果您開始查看completion-at-point實際上在shell腳本緩衝區中執行的操作,最終您最終會以comint結束。特別是,功能comint--match-partial-filename看起來很有希望解釋您描述的行爲。

如果我正確地閱讀了這個問題,那麼這裏的問題是,「=」被認爲是文件名的有效部分,至少在類POSIX系統上(見變量comint-file-name-chars)。所以,完成機制試圖完成顯然找不到的文件名「inputfile =/...」。

如果您從不在文件名中使用「=」(或者您很少使用它,以至於工作完成超過其他缺點),您可能需要考慮在shell腳本模式鉤子中執行類似(setq comint-file-name-chars "[]~/[email protected]:_.$#%,{}-")(如果您在POSIX系統上;在Windows上它看起來稍有不同)。

希望有所幫助。

1

假設你不在windows上,你可以使用bash-completion。由於它使用comint函數來確定當前的完成候選項,因此只需稍作修改即可在sh-mode中工作。

我喜歡這個,因爲除了在那裏完成文件名之外,它還會給你所有漂亮的readline完成,比如命令行開關等。下面是一個使用company的例子,但是你可以刪除公司的東西,因爲所有你真正需要的是添加修改後的完成點功能。

;; required packages: company bash-completion 
(eval-when-compile 
    (require cl-lib)) 

;; locally redefine comint-line-beginning-position so bash-completion 
;; can work in sh-mode 
(defun sh-bash-completion() 
    (cl-letf (((symbol-function 'comint-line-beginning-position) 
      #'(lambda() 
       (save-excursion 
        (sh-beginning-of-command) 
        (point))))) 
    (let ((syntax (syntax-ppss))) 
     (and (not (or (nth 3 syntax) 
        (nth 4 syntax))) 
      (bash-completion-dynamic-complete))))) 

;; put this in your sh-mode hook 
(defun sh-completion-setup() 
    ;; add capf function 
    (add-hook 'completion-at-point-functions 
      'sh-bash-completion nil 'local) 
    (company-mode) 
    (make-local-variable 'company-backends) 
    ;; use company completion-at-point 
    (delq 'company-capf company-backends) 
    (cl-pushnew 'company-capf company-backends) 
    (setq-local company-transformers 
       '(company-sort-by-backend-importance))) 

(add-hook 'sh-mode-hook 'sh-completion-setup)