Emacs Eshell can';在eshell路径上找不到脚本

Emacs Eshell can';在eshell路径上找不到脚本,emacs,eshell,Emacs,Eshell,我的目标 我正在尝试将“/opt/bin”添加到eshell用于查找脚本的路径列表中。到目前为止,我试着用三种方法来做这件事 迄今为止的尝试次数 1) (setenv“路径”(concat)/opt/bin:(getenv“路径”)) 2) (eshell/addpath”/opt/bin:) 3) (添加到列表“执行路径”/opt/bin) 第一次尝试将“/opt/bin”添加到eshell的路径中(它在下面调用“which lein”的输出中显示为“/opt/bin:”的第一个实例) 第二次

我的目标

我正在尝试将“/opt/bin”添加到eshell用于查找脚本的路径列表中。到目前为止,我试着用三种方法来做这件事

迄今为止的尝试次数

1) (setenv“路径”(concat)/opt/bin:(getenv“路径”))

2) (eshell/addpath”/opt/bin:)

3) (添加到列表“执行路径”/opt/bin)

第一次尝试将“/opt/bin”添加到eshell的路径中(它在下面调用“which lein”的输出中显示为“/opt/bin:”的第一个实例)

第二次尝试还将“/opt/bin”添加到eshell的路径中(在下面调用“which lein”的输出中显示为“/opt/bin:”的第二个实例)

实际上,我已经有一段时间将“/opt/bin”添加到我的exec路径中。我相信这样做是为了在运行启动shell的命令时,/opt/bin会出现在我的路径上,这似乎很好,但无助于eshell在那里找到命令

尝试失败和临时解决办法

您可以在下面的eshell输出中看到,即使在eshell识别eshell的路径上有命令lein,但eshell没有找到该命令。但是,如果我从eshells默认路径中的目录创建一个符号链接到/opt/bin中的脚本,那么eshell就能够找到它

Eshell输出

~ $ which lein
which: no lein in (/opt/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/usr/local/sbin:/usr/sbin:/sbin:/opt/bin:)
~ $ l /opt/bin/ | grep lein
-rwxr-xr-x   1 kevin          kevin    12538 2019-01-17 07:32 lein
~ $ sudo ln -s /opt/bin/lein /usr/local/bin/lein
[sudo] password for kevin: 
~ $ 
~ $ which lein
/usr/local/bin/lein
我希望不必在/usr/local/bin/中创建符号链接,这样eshell就可以在my/opt/bin中找到脚本。注意:即使重新启动emacs,它仍会在/opt/bin中找到符号链接而不是脚本。这发生在linux mint debian(v9.3)版上emacs-25的GUI实例中

问题:


如何让eshell实际检查eshell路径,而不是某些默认目录列表?我应该更新一个不同的路径变量吗?

查看
eshell/addpath
的源代码,它在
eshell path env
上使用
setq
,这是一个缓冲区局部变量。这意味着如果使用
eshell/addpath
,它必须在每个eshell缓冲区的上下文中执行。最好的方法是使用模式挂钩

(defun jpk/eshell-mode-hook ()
  (eshell/addpath "/opt/bin"))
(add-hook 'eshell-mode-hook #'jpk/eshell-mode-hook)
我对Eshell不太熟悉,所以我不想说这是最好的方法,但它应该会起作用
eshell path env
最初是从
(getenv“path”)
设置的,所以设置
path
env var不起作用(除非您在加载eshell之后这样做)