編輯Bash腳本我想爲變量指定一個文件名。'='後emacs + comint-dynamic-complete-filename
E.g. inputfile = foo.txt
With std。設置如果不在'='之後插入空格,我無法完成文件名。
有沒有解決這個問題的方法?
編輯Bash腳本我想爲變量指定一個文件名。'='後emacs + comint-dynamic-complete-filename
E.g. inputfile = foo.txt
With std。設置如果不在'='之後插入空格,我無法完成文件名。
有沒有解決這個問題的方法?
首先,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上它看起來稍有不同)。
希望有所幫助。
假設你不在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)