Emacs Shell模式下的Bash自动补全

时间:2020-03-06 15:02:22  来源:igfitidea点击:

在GNOME终端中,Bash进行智能自动补全。例如

apt-get in<TAB>

变成

apt-get install

在Emacs shell模式下,即使我显式地获取了/ etc / bash_completion的源代码,该自动完成也不起作用。上面的示例粘贴为" in"或者自动完成,并使用当前目录中的文件名而不是有效的" apt-get"命令选项。大概是因为Emacs截获了Tab键。如何在" shell模式"下启用智能自动完成功能?

解决方案

我不知道答案。但是它无法按预期工作的原因可能是因为emacs shell中的完成是由emacs内部处理(通过comint-dynamic-complete函数),并且没有内置的智能完成功能。

恐怕这不是一件容易的事情。

编辑:njsf关于使用term-mode的建议可能与它一样好。从开始

M-x term

它包含在标准的emacs发行版中(至少在Ubuntu和Debian上的emacs21-common或者emacs22-common中)。

我没有声称自己是emacs专家,但这应该可以解决问题:

创建:〜/ .emacs

添加到它:

(需要'shell-command)
(shell命令完成模式)

Emacs接管了外壳程序,因此BASH设置不会保留下来。这将为EMACS本身设置自动完成。

就像Matli所说的那样,这不是一件容易的事,因为bash以--noediting开始,而TAB必然是comint-dynamic-complete。

可以使用本地设置键将TAB重新绑定到shell-comand-hook中的self-insert-command
并使shell模式不以M-x customize-variable RET explicit-bash-args的--noediting开头,但是我怀疑它不能与所有其他编辑配合。

我们可能想尝试term-mode,但是它还有另一组问题,因为term-mode取代了其他一些常规的键绑定。

编辑:通过术语模式超越其他常规的键盘设置,我的意思是除C-c之外的所有键都成为能够转换缓冲区的转义符。因此,我们不必C-x k来杀死缓冲区,而必须C-c C-x k。或者切换到另一个缓冲区" C-c C-x o"或者" C-c C-x 2"

在emacs外壳程序中,实际上是emacs进行了自动补全,而不是bash。如果shell和emacs不同步(例如,通过使用push,popd或者某些bash用户函数来更改shell的当前目录),则自动完成功能将停止工作。

要解决此问题,只需在shell中键入" dirs",然后一切恢复同步。

我的.emacs文件中也包含以下内容:

(global-set-key "\M-\r" 'shell-resync-dirs)

然后只需按Esc-return即可重新同步自动完成。