Emacs编译模式不会看到bash别名

时间:2012-06-08 09:25:58

标签: emacs emacs23

Emacs M-x compile没有看到.bashrc中设置的任何别名。如果我使用M-x shell然后输入别名,那很好。我尝试从/ etc / profile,从〜/ .profile,〜/ bash_env采购.bashrc,我能想到的任何东西都无济于事。

我在Emacs 23和Ubuntu 11上。我使用/ usr / bin / emacs%F从桌面按钮启动emacs。

5 个答案:

答案 0 :(得分:17)

Emacs从父进程继承其环境。你是如何从命令行或其他方式调用Emacs的?

如果您:

会发生什么

Mx 编译 RET Ca Ck bash -i -c your_alias < KBD> RET

将bash作为交互式shell(-i选项)调用应该读取.bashrc别名。

编辑:我认为 M-x shell-command和 M-x 通过call-process在劣质shell中编译执行命令。在.emacs中尝试以下内容(或仅评估):

(setq shell-file-name "bash")
(setq shell-command-switch "-ic")

我注意到在评估了上述内容后,.bashrc别名被 M-x shell-command和 M-x 编译使用,即

M-x 编译 RET your_alias RET

然后应该工作。

我的环境:Emacs 24.1(预测试rc1),OSX 10.7.3

答案 1 :(得分:7)

Keith Flower的答案有效,但由于.bashrc在其他地方被不必要地加载(可能很多次,我的计算机不完全不足,但是当尝试使用autocomplete.el时,emacs几乎无法使用)会导致一些速度减慢。

另一种方法是仅针对需要它的函数本地修改shell-command-switch。这可以使用emacs的“建议”功能来创建围绕这些功能的包装器。以下是修改compile

的示例
;; Define + active modification to compile that locally sets
;; shell-command-switch to "-ic".
(defadvice compile (around use-bashrc activate)
  "Load .bashrc in any calls to bash (e.g. so we can use aliases)"
  (let ((shell-command-switch "-ic"))
    ad-do-it))

您需要为要使用的每个函数编写类似的“建议”.bashrc(例如,我还需要为recompile定义相同的建议),只需复制上面的内容并替换compile在上面用另一个函数名。

答案 2 :(得分:1)

我认为编译命令不是通过shell解释的:它们是由emacs执行的(这意味着别名,shell函数和其他特定于shell的东西不被考虑)。

尝试将编译命令包装到shell脚本中,该脚本将提供正确的环境。

您可以使用表格

中的完整shell脚本来执行此操作
#!/bin/bash
source "~/.bashrc"
my_command

或直接在emacs中使用

形式的编译命令

bash -c "source ~/.bashrc; my_command"

答案 3 :(得分:1)

你可能喜欢emac的bash-completion:

https://github.com/szermatt/emacs-bash-completion

您将能够在编译迷你缓冲区和shell模式下使用别名的制表符完成。

享受!

(他们在这里谈论Bash autocompletion in Emacs shell-mode

答案 4 :(得分:0)

请参见Is there a way to get my emacs to recognize my bash aliases and custom functions when I run a shell command?,了解无法运行所有.bashrc且不会创建以下错误消息的修补程序:

  

bash:无法设置终端进程组(-1):设备的ioctl不适当   bash:此shell中无作业控制