当我运行shell命令时,有没有办法让emacs识别bash别名和自定义函数?
在我的shell环境中,我有别名和自定义函数。当我在emacs实例中(我总是使用当我运行shell命令时,有没有办法让emacs识别bash别名和自定义函数?,bash,shell,emacs,environment-variables,Bash,Shell,Emacs,Environment Variables,在我的shell环境中,我有别名和自定义函数。当我在emacs实例中(我总是使用emacs-nw)并且执行shell命令(M-!)时,我无法使用它们。这是有道理的,因为我想象它会启动自己的子shell来做这些。。。但是有没有办法(也许在我的.emacs中)让它起作用呢?也许即使在执行任何给定的shell命令之前,默认情况下需要寻找一个环境?将别名和函数放在.bashrc中,而不是.bash\u profile中。后者仅在登录shell中执行,前者在所有shell中执行。请通读 对于非交互式she
emacs-nw
)并且执行shell命令(M-!
)时,我无法使用它们。这是有道理的,因为我想象它会启动自己的子shell来做这些。。。但是有没有办法(也许在我的.emacs
中)让它起作用呢?也许即使在执行任何给定的shell命令之前,默认情况下需要寻找一个环境?将别名和函数放在.bashrc
中,而不是.bash\u profile
中。后者仅在登录shell中执行,前者在所有shell中执行。请通读
对于非交互式shell,唯一来源的文件是BASH_ENV环境变量的值。如果emacs将使用BASH来执行shell命令,则调用emacs,比如
BASH\u ENV=~/.bashrc emacs
——有些程序专门使用“/bin/sh”,下面是我对我认为相关问题的评论:
我认为M-xshell命令和M-x compile命令都是通过调用过程在低级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
要使
shell命令
在按照中所述的技术执行命令之前读取~/.bashrc
,并且由于为整个Emacs会话定义了$BASH_ENV
而不会产生潜在的副作用,请在~/.Emacs.d/init.el
(或.Emacs
)文件中尝试以下操作:
如第二行中的注释所述,还要安装(在$PATH
中)一个名为bash for emacs.sh
的脚本,该脚本包含:
#!/bin/bash
BASH_ENV="~/.bashrc" exec bash "$@"
请注意,您的~/.bashrc
可能需要更改以定义非交互式别名,即使[-z“$PS1”]
为true(表示非交互式shell)。这就是我为自己的环境(比如现在的环境)所采取的方法,这是在
此外,这假设您想像我一样使用Bash作为Emacs派生的shell。我们需要在非交互式shell中启用别名扩展,最好仅在从Emacs调用别名时启用(以避免在运行其他shell时造成细微差异)。对我有效的方法是创建两个文件:~/.alias拥有我所有的别名,例如
alias python python27
和~/
source ~/.alias
shopt -s expand_aliases
当然,我还将.bashrc中的所有别名替换为
source ~/.alias
最后,我在.emacs中添加了以下内容:
(setenv "BASH_ENV" "~/.aliasExpand")
我尝试了基思·弗劳尔(Keith Flower)的解决方案(让贝壳互动),我得到了
bash:无法设置终端进程组(-1):设备的ioctl不正确
bash:此shell中没有作业控制
注意,我是通过格伦·杰克曼和尼古拉斯·杜德布特的暗示得到的
如果您愿意冒险让所有shell都具有别名扩展,并且不介意为每个emacs shell运行所有.bashrc,那么您可以将此简化为添加别名扩展
shopt -s expand_aliases
给你的.bashrc和
(setenv "BASH_ENV" "~/.bashrc")
对于以非登录模式启动的.emacs,您必须找到在何处更改要运行的命令以启动shell并添加
-l
。我使用vim,所以我不确定emacs将其隐藏在哪里。问题不是登录,而是交互。execute子命令shell是非交互式的(如运行M-x!tty-s
所示,它给出了一个1的代码)。我也有这个问题。然而,由于M-&
及其在Dired中的对应项的特殊性,我只是放弃了,将我的别名改为.zshenv
。bashrc源代码用于交互式shell,而不是所有shell:@Barmar,将别名放在中。bashrc
不会改变任何事情。您似乎还必须使用shopt-s expand\u alias
启用别名机制。默认情况下,在非交互式shell中不启用此功能。此功能运行良好!谢谢,“-ic”部分做什么?它是用于交互的吗?@PalaceChan:-i
是用于交互的,-c
告诉bash读取后面的任何命令(所以无论Emacs在它的shell调用中使用什么)。@PalaceChan给出了下一个问题(),该问题问你为什么会出现一个错误,它是如何出色地工作的?(Terminator中的Emacs 24.4.1)这对我来说非常有效,但在输出之前我会收到消息:bash:无法设置终端进程组(-1):设备的ioctl不合适bash:此外壳中没有作业控制这不起作用-我正在运行emacs 26.1,bash 4.4谢谢答案。顺便说一句,我认为您可以只使用(setenv“BASH_ENV”(扩展文件名“~/.bashrc”)
或(setenv“BASH_ENV”(替换为文件名“$HOME/.bashrc”)
,这样就不需要shopt
。
(setenv "BASH_ENV" "~/.bashrc")