【问题标题】:Can I use bash autocomplete when editing shell scripts in emacs?在 emacs 中编辑 shell 脚本时可以使用 bash 自动完成功能吗?
【发布时间】:2020-03-06 11:29:12
【问题描述】:

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

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

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

【问题讨论】:

  • 是的,你可以使用bash-completion.el
  • 据我所知,该软件包仅适用于 shell 模式(我实际执行命令的地方),而不适用于 sh 模式(我正在编辑 shell 脚本的地方),即我需要的。我当然不能让它在 sh 模式下工作,尽管它可以在 shell 模式下工作。
  • 它也可以在sh-mode下使用,加上一点elisp,我将添加一个示例配置

标签: bash shell emacs autocomplete


【解决方案1】:

bash-completion.el 提供了一个普通 bash 完成的接口,它也可以扩展为在普通 sh-modes 下工作,除了你的 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)

【讨论】:

  • 如果我可以再纠缠你一点 -- 似乎有两种模式。有时 TAB 会缩进,而 M-TAB 会完成,而其他时候 TAB 和 M-TAB 都会完成而没有任何缩进。例如,我第一次编辑特定行时,我需要第一次使用 M-TAB 完成,然后只需 TAB 将完成。有没有办法控制这个,或者如果没有,你能帮我理解吗?
  • 如果你有(setq tab-always-indent 'complete)(我会这样做),那么TAB 将首先尝试缩进,如果该行已经缩进,它将完成。使用此设置,我永远不会使用 M-TAB,但请参阅tab-always-indent 的选项
猜你喜欢
  • 2010-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-24
相关资源
最近更新 更多