Emacs Shell模式下的Bash自动补全
在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即可重新同步自动完成。