Emacs编译模式赢得';看不到bash别名

Emacs编译模式赢得';看不到bash别名,emacs,emacs23,Emacs,Emacs23,Emacs M-x compile在.bashrc中未看到任何别名集。如果我使用M-x shell,然后键入别名,就可以了。我试着从/etc/profile、从~/.profile、~/bash_env中寻找.bashrc,我能想到的任何东西都没有用 我在Emacs23和Ubuntu11上。我使用/usr/bin/emacs%F从桌面按钮启动emacs。我认为编译命令不是通过shell解释的:它们只是由emacs执行(这意味着别名、shell函数和其他特定于shell的内容不被考虑) 尝试将编译

Emacs M-x compile在.bashrc中未看到任何别名集。如果我使用M-x shell,然后键入别名,就可以了。我试着从/etc/profile、从~/.profile、~/bash_env中寻找.bashrc,我能想到的任何东西都没有用


我在Emacs23和Ubuntu11上。我使用/usr/bin/emacs%F从桌面按钮启动emacs。

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

尝试将编译命令包装到一个shell脚本中,该脚本将为正确的环境提供源代码

您可以使用表单中的完整shell脚本来完成此操作

#/bin/bash
来源“~/.bashrc”
我的命令
或者直接在emacs中使用以下形式的编译命令


bash-c“source~/.bashrc;my_命令”
Emacs从父进程继承其环境。您是如何从命令行或其他方式调用Emacs的

如果您:

M-x编译RET C-a C-k bash-i-C您的别名RET

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

Edit:我认为M-xshell命令和M-xcompile都是通过调用过程在低级shell中执行命令的。在.emacs中尝试以下操作(或仅评估):

(setq shell文件名“bash”)
(setq外壳命令开关“-ic”)
我注意到,在对上述内容求值之后,.bashrc别名将被M-xshell命令和M-xcompile使用,即

M-x编译RET您的\u别名RET

那就行了


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

您可能喜欢emac的bash完成:

您将能够在编译微缓冲区和shell模式中使用别名的制表符补全

享受吧


(他们在这里谈论这个问题)

基思·弗劳尔的答案是有效的,但可能会因为.bashrc在其他地方被不必要地加载而导致一些速度减慢(可能有很多次,我的计算机并没有完全断电,但emacs在尝试使用autocomplete.el时几乎无法使用)

另一种方法是仅针对需要的功能本地修改
shell命令开关
。这可以通过使用emacs的“advice”特性来创建这些函数的包装器来实现。下面是一个修改
编译
的示例:

;; 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(例如,我还需要为
重新编译
定义相同的建议),只需复制上面的内容,并用另一个函数名替换上面的
compile

有关不运行所有.bashrc且不创建以下错误消息的修复程序,请参阅:

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


Francesco,我在compile命令上尝试了bash-c,结果是一样的:bash:[我的别名]:命令没有发现bash-c部分的必要;只需在compile命令变量中的任何其他命令之前添加“source/home/$USERNAME/.bashrc&&”。我自己也在使用它,它工作得很好。我有一个别名叫run\u csv。我按照你的要求做了,source/home/[ME]/.bashrc&&run\u csv。结果是/bin/bash:run\u csv:command未找到您是否尝试过编写shell脚本?在我的例子中(比你的稍微复杂一点),它工作得很好。当我将这些shell脚本放在一个已知的目录中,并将它们的路径添加到$path时,我将遇到类似的问题,\C-x\C将看不到它们。但修复路径问题可能比修复别名问题更容易。所以,如果我看不到其他可行的答案,我可能会尝试一下。这是相当恼人的Emacs仍然有这个问题。警告:对我来说,这有使autocomplete.el运行极其缓慢的副作用。大概它是在某处重复创建bash shell并每次运行我的整个.bashrc。我可能会尝试编写一个围绕编译的包装器,临时将shell命令开关更改为“-ic”。(关于
shell命令开关“-ic”
)不,它不适用于
shell命令。Ubuntu 16.04,emacs 24.5。打印出错误:“bash:无法设置终端进程组(-1):设备的ioctl不正确。bash:此shell中没有作业控制”。如果我从
shell命令开关
中删除
-I
选项,则不会加载定义了别名的
.bashrc
。看见建议“Emacs从父进程继承其环境”看起来不错,可以使用
export
s,但子shell中的别名不起作用!看见