Linux 下的 Emacs 无法 fetch package list

错误信息:

各位大佬好,在下使用 emacs 时发现无法从源上拉取包的信息, package-refresh-list 的 backtrace 如下:

同时比较奇怪的是把配置中 http 改成 https 会导致 emacs 卡在 contacting host xxx:443 直至超时。

我的环境配置:

init.el:

;; Added by Package.el.  This must come before configurations of
;; installed packages.  Don't delete this line.  If you don't want it,
;; just comment it out by adding a semicolon to the start of the line.
;; You may delete these explanatory comments.
(package-initialize)

 (when (>= emacs-major-version 24)
     (require 'package)
     (package-initialize)
     (setq package-archives
	   '(("gnu"   . "http://mirrors.tuna.tsinghua.edu.cn/elpa/gnu/")
	     ("melpa" . "http://mirrors.tuna.tsinghua.edu.cn/elpa/melpa/"))))

(global-linum-mode 1)
(set-face-attribute 'default nil :height 120)
(defun open-init-file()
  (interactive)
  (find-file "~/.emacs.d/init.el"))

(global-set-key (kbd "<f2>") 'open-init-file)

;; (global-company-mode 1)

;; Map Alt key to Meta
(setq x-alt-keysym 'meta)

;; proxy

从 anaconda 安装的 emacs emacs --version:

$ emacs --version
GNU Emacs 26.3
Copyright (C) 2019 Free Software Foundation, Inc.
GNU Emacs comes with ABSOLUTELY NO WARRANTY.
You may redistribute copies of GNU Emacs
under the terms of the GNU General Public License.
For more information about these matters, see the file named COPYING.

OS: CentOS Linux release 7.4.1708 (Core)

从命令行直接检查是否能连接到源:

$ curl -i http://mirrors.tuna.tsinghua.edu.cn/elpa/gnu/
HTTP/1.1 200 OK
Server: nginx/1.16.1
Date: Mon, 28 Oct 2019 09:37:05 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 30100
Last-Modified: Sun, 27 Oct 2019 21:05:29 GMT
Connection: keep-alive
ETag: "5db60699-7594"
X-TUNA-MIRROR-ID: neomirrors
Strict-Transport-Security: max-age=31536000
Accept-Ranges: bytes

<!DOCTYPE HTML PUBLIC>
<html>
    <head>
        <title>GNU ELPA Packages</title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <link rel="shortcut icon" type="image/png" href="../favicon.png">
        <link rel="stylesheet" href="//code.cdn.mozilla.net/fonts/fira.css">
        <link rel="stylesheet" type="text/css" href="../layout.css">
        <script src="../javascript/jquery.min.js" type="text/javascript"></script>
......

如果还需要我提供别的环境信息,请dalao们直接指出,提前感谢各位了🙏

对了,由于服务器无法直接连接外网,而是通过 ssh 隧道搭建的代理连接外网,因此环境变量中有

export HTTP_PROXY=socks5://127.0.0.1:1080
export HTTPS_PROXY=socks5://127.0.0.1:1080
export http_proxy=socks5://127.0.0.1:1080
export https_proxy=socks5://127.0.0.1:1080

Emacs 的代理是怎么设置的?


试了下,Emacs 貌似也支持 HTTP_PROXY,所以可以考虑在命令行用 Emacs 安装包。

Emacs 里没有设置代理;请问从 command line 安装包和从 emacs 内安装包使用的网络接口有什么区别吗?

你的截图显示 Using a proxy for http…,?

从命令行就是用文本界面的 Emacs,而非 GUI Emacs,都是 Emacs 所以没没区别。因为你的命令行已经设置好了环境变量,直接在里面用 Emacs 的话,Emacs 应该利用它,跟 curl、wget 等一样。

经过测试,这应该是emacs检测到http_proxy存在自动设置的。


哦哦哦,我还以为是通过 emacs --batch --expr \"(define pkg-to-install 'smex)\" -l emacs-pkg-install.el 这种命令安装来安装的(其实 batch 方式安装与 tui 安装实质也是一样的吧。


突然发现去掉代理后又可以使用了 QAQ ,好奇怪。还是要感谢大佬🙏

http代理变量给个socks5代理,能连得上就有鬼了 :joy:

可是我其他的软件,包括 git anaconda pip 以及 yumdownloader 等都可以通过这个代理变量连接外网 :full_moon_with_face:

经过测试,发现服务器可以直连 tuna 源(emacs-china 源布星),找到一个 workaround

#!/usr/bin/env sh
unset http_proxy
unset https_proxy
unset HTTP_PROXY
unset HTTPS_PROXY
exec emacs "$@"

保存为 xxx 把它放到用户 PATH 下,使用时直接 xxx 执行就可以了。

估计他们用的libcurl,而Emacs自带的网络连接真的鶸得窒息。(e.g. 设置了socks代理后https就不行了)

emmm 我又试了一下,通过 privoxysocks5 再转发成 http 代理后, emacs 确实可以连接源了

socks5 换成 http 就行,我在 v2rayN 日子发现 emacs 尝试用 http 的方法连接 socks。