编辑Bash脚本我想为变量分配文件名。
E.g。 inputfile中= foo.txt的
用std。设置如果没有先在'='之后插入空格,我无法完成文件名。
有没有解决方案?
答案 0 :(得分:3)
首先,自{Emacs 24.1}以来,completion-at-point
已经过时了。替换函数为completion-at-point
。
现在,如果您开始查看{脚本缓冲区中comint--match-partial-filename
实际执行的操作,那么您最终还是会以comint结尾。特别是,函数comint-file-name-chars
看起来很有希望解释你所描述的行为。
如果我读得正确,这里的问题是" ="被认为是文件名的有效部分,至少在类似POSIX的系统上(参见变量(setq comint-file-name-chars "[]~/A-Za-z0-9+@:_.$#%,{}-")
)。因此,完成机制正在尝试完成文件名" inputfile = / ..."它显然无法找到。
如果你从不使用" ="在您的文件名中(或者您很少使用它,以至于工作完成超过其他缺点),您可能需要考虑在shell脚本模式钩子中执行类似board.length
的操作(如果您在POSIX系统上;在Windows上它看起来会略有不同。)
希望有所帮助。
答案 1 :(得分:2)
您可以使用bash-completion
假设您不在Windows上。只需稍加修改就可以在sh-mode
中工作,因为它使用了一个comint函数来确定当前的完成候选者。
我喜欢这个,因为除了在那里完成文件名之外,它还将为您提供所有良好的读取线完成功能,如命令行开关等。以下是使用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)