在 emacs 中编辑 shell 脚本时,我可以使用 bash 自动完成功能吗?

Can I use bash autocomplete when editing shell scripts in emacs?

在我的环境中,我设置了 bash 自动完成功能来完成许多令人惊奇的事情。 但是,当我在 emacs 中编辑 shell 脚本时,所有自动完成的魔法都消失了。

有什么方法可以让 emacs 在我编辑 shell 脚本时执行 bash 命令行自动完成?

我会接受要求我使用不同编辑器的答案,如果该编辑器在 Linux 系统上可用。我也会接受一个告诉我需要使用不同的 shell 自动完成的答案。

bash-completion.el 提供了一个正常 bash 完成的接口,它也可以扩展到正常 sh-mode 中工作,添加到您的 completion-at-point-functions。这是它的工作原理,只需使用 sh-script 中的命令 sh-beginning-of-command 来确定当前完成候选者(如果需要,这可以扩展为处理更复杂的 shell 命令)。

(require 'sh-script)                    ;sh-beginning-of-command
(require 'bash-completion)

(defun my-sh-completion-at-point ()
  (let ((end (point))
        (beg (save-excursion (sh-beginning-of-command))))
    (when (and beg (> end beg))
      (bash-completion-dynamic-complete-nocomint beg end t))))

(defun my-sh-hook ()
  (add-hook 'completion-at-point-functions #'my-sh-completion-at-point nil t))

(add-hook 'sh-mode-hook #'my-sh-hook)