【问题标题】:emacs + comint-dynamic-complete-filename after '=''=' 之后的 emacs + comint-dynamic-complete-filename
【发布时间】:2016-11-23 19:18:24
【问题描述】:

编辑 Bash 脚本 我想将文件名分配给变量。

例如输入文件=foo.txt

与标准。如果不先在“=”后插入空格,我将无法完成文件名。

有什么解决办法吗?

【问题讨论】:

    标签: bash emacs completion


    【解决方案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 "[]~/A-Za-z0-9+@:_.$#%,{}-") 的操作(如果您在 POSIX 系统上;在 Windows 上看起来会略有不同)。

    希望对您有所帮助。

    【讨论】:

      【解决方案2】:

      假设您不在 Windows 上,您可以使用 bash-completion。它只需要稍作修改即可在 sh-mode 中工作,因为它使用 comint 函数来确定当前的完成候选。

      我喜欢这个,因为除了在那里完成文件名之外,它还会为您提供所有不错的 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)
      

      【讨论】:

        猜你喜欢
        • 2012-12-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多