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



Emacs M-x 编译在 .bashrc 中看不到任何别名集。如果我使用 M-x 外壳然后键入别名,这很好。我尝试从/etc/profile、~/.profile、~/bash_env 中获取 .bashrc,任何我能想到的东西都无济于事。

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

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

如果您出现以下情况,会发生什么情况:

M-x 编译 RET C-aC-k bash -i -c your_aliasRET

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

编辑:我认为M-x shell-command和M-x都通过调用过程在劣质shell中编译执行命令。在您的 .emacs 中尝试以下内容(或只是评估):

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

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

M-x 编译 RET your_aliasRET

然后应该工作。

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

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

另一种方法是仅针对需要的功能本地修改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替换为另一个函数名称。

你可能喜欢 emac 的 bash-complete:

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

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

享受!

(他们在这里谈论它 Emacs shell模式下的 Bash 自动完成)

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

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

您可以使用以下形式的完整 shell 脚本来执行此操作

#!/bin/bash
source "~/.bashrc"
my_command

或直接在 Emacs 中使用表单的编译命令

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

请参阅有没有办法让我的 emacs 在运行 shell 命令时识别我的 bash 别名和自定义函数? 对于不会运行所有 .bashrc 并且不会创建这些错误消息的修复程序:

bash:无法设置终端进程组 (-1):设备的 ioctl 不合适 bash:此外壳中没有作业控制

最新更新