Emacs 怎么使用代理

已经解决,感谢!步骤很详细,从你这了解了逻辑之后,我翻半人马的配置对照和实践,发现你的配置socks和http代理没分开 (defvar default-proxy "127.0.0.1:1080")都是用了1080端口。我本地跑的v2的socks和http端口分别是1080和1087,所以就分开设置:

(Setq my-http-proxy "127.0.0.1:1087")
(Setq my-socks-proxy "127.0.0.1:1080")

知道,我故意的呀一般我只会用其中一种,如果我需要修改使用socks的时候我会执行eval设置一下端口就好了,很少会变端口的。除非梯子挂的厉害,不过用的机场,一年多基本上没变过。 :joy: :joy: :joy: :joy:

:+1:正在拜读你的其他blog,每篇讲解都很详细,对我这种非it人员很友好,期待继续更新 :grin:另外,如果有空捣鼓的话,希望可以让proxy自动启动,当遇到package not found或make client process failed的时候触发proxy-http-enable,感觉有点难 :grinning:

hook一下应该就可以,不过,我更倾向手动启动,在镜像里的东西,还是直连快一些,一些需要代理的地方比如lsp之流,一般也就只需要安装一次。blog很久没更新了, :rofl: :rofl: 后面看情况吧,尽量把TODO List 写完,哈哈。

那也是,偶尔代理一下也没啥麻烦。加油加油,blog我先收藏了,等待更新 :laughing:

make-network-process 并不使用 process-environment,而是使用 url-proxy-services

Emacs 发起的网络请求基于 make-network-process 没错,但如果设置了 url-proxy-services,那么 make-network-process 则是创建与代理服务器的连接,通过代理服务器转发请求。

以下代码分别经由代理访问 google 和不经代理访问 baidu:

(let ((adfn (lambda (&rest args) (message "==> make-network-process:\n%S" args))))
  (unwind-protect
      (with-proxy
        (advice-add 'make-network-process :before adfn)
        (url-retrieve-synchronously "https://www.google.com"))
    (advice-remove 'make-network-process adfn)))

;; ==> make-network-process:
;; (:name "www.google.com" :buffer #<buffer *url-http-temp*> :host "127.0.0.1"
;; :service 7890 :nowait (:nowait t) :tls-parameters nil :coding nil)

(let ((adfn (lambda (&rest args) (message "==> make-network-process:\n%S" args))))
  (unwind-protect
      (progn
        (advice-add 'make-network-process :before adfn)
        (url-retrieve-synchronously "https://www.baidu.com"))
    (advice-remove 'make-network-process adfn)))

;; ==> make-network-process:
;; (:name "www.baidu.com" :buffer #<buffer *url-http-temp*> :host
;; "www.baidu.com" :service 443 :nowait nil :tls-parameters nil :coding nil)

可以了解一下《 with-proxy: 在局部范围内使用代理 》。

我也用了大佬你的with-proxy,eshell下git和从melpa安装pacakge都用上代理了,速度很快,但是安装all-the-icons-install-fonts的时候卡住了,连不上"https://raw.githubusercontent.com/"。可能是我配置问题 :joy:

(use-package with-proxy
  :hook (after-init-hook . with-proxy)
  :config
  (with-proxy
  :http-server "127.0.0.1:1087"
  :no-proxy '("localhost" "127.0.0.1" "192.168.*" "10.*")
  "https://elpa.gnu.org/packages/"
  "https://melpa.org/packages/"
  "http://github.com"
  "https://github.com"
  "https://raw.githubusercontent.com/"))

你这几行不会出错吗?是想完成什么操作?

我不了解 use-package,试试这样安装一个包:

(with-proxy
  (use-package all-the-icons-install-fonts
    ...))

若想验证某个地址是否可以访问:

(with-proxy
  (with-current-buffer (url-retrieve-synchronously "https://raw.githubusercontent.com/")
    (url-http-parse-response)))
;; => 200

(with-proxy
  (with-current-buffer (url-retrieve-synchronously "https://www.google.com")
    (url-http-parse-response)))
;; => 200

这几行没报错啊 :rofl:我以为像git代理那样git config --global http.https://github.com.proxy socks5://127.0.0.1:1080,直接填写url来让其使用代理 :joy:

all-the-icons-install-fonts是这样安装M-x all-the-icons-install-fonts 我在执行这一步的时候出现这样的错误:

open-network-stream: make client process failed: Connection refused, :name, raw.githubusercontent.com, :buffer, #<killed buffer>, :host, raw.githubusercontent.com, :service, 443, :nowait, nil, :tls-parameters, nil

引起这个错误的原因应该就是国内网络无法访问 raw.githubusercontent.com ,所以我想通过with-proxy对melpa和git等难以访问的网站进行代理 :joy:

麻烦大佬指导一下! :pray:

(with-proxy
  (call-interactively #'all-the-icons-install-fonts))
1 个赞

原来是这样子用,with-proxy的readme没有具体举例,对elisp小白来说真的搞不了 :joy:

另外,还想请教一下,如何对指定网址进行设置呢?例如:

(with-proxy
  (*这里写什么* "raw.githubusercontent.com"))

不明白你想表达什么。

Sorry 没表达清楚

我在执行M-x all-the-icons-install-fonts的时候不能访问 raw.githubusercontent.com 这个网址。需要下面这样写配置才能解决。

(with-proxy
  (call-interactively #'all-the-icons-install-fonts))

如果以后我装了其他的包,包运行后也是需要连接 raw.githubusercontent.com这个网址,那我就不知道该怎么写配置了。

请问:with-proxy怎么配置指定网址进行代理呢?这样不管a包、b包还是c包需要访问 raw.githubusercontent.com时都能顺利代理完成访问了。

with-proxy 不适合,你需要全局代理。

可惜了,那就只能用with-proxy来给eshell设置代理了。谢谢大佬耐心解答! :+1:

我前面说了:

所以全局代理不是我的选择,毕竟大部分时候不需要代理。当然可以启用全局代理,然后设置 no_proxy 白名单,不过我更想要的是与之相反的黑名单。

但我也不是每次都 (with-proxy (quelpa ...)),而是给 quelpa 打了一个"补丁":

(defvar quelpa-domain-proxy-list
  '("raw.githubusercontent.com" "github.com" github))

(defun quelpa@with-proxy (fn arg &rest plist)
  (let ((recipe ...))
    (if (or (plist-get recipe :proxy)
            (memq (plist-get recipe :fetch) quelpa-domain-proxy-list)
            (member (url/domain (plist-get recipe :url)) quelpa-domain-proxy-list)
            ...)
        (with-proxy
          (message "Proxy: t")
          (apply fn arg plist))
      (apply fn arg plist))))

(advice-add 'quelpa :around #'quelpa@with-proxy)

然后使用 quelpa 安装包的时候就可以自动按需使用代理了:

或许可以试试把补丁打到 url-retrive 函数上。

啊~我就是希望实现这样的功能。我也没搞邮箱 rss,目前在emacs里需要代理的就是安装melpa的包(刚看到国内镜像站出问题)和git :joy:尴尬的是,我才选择了straight作为use-package/package.el的扩展 :sweat_smile:

大佬有没有兴趣把with-proxy.el的功能扩展一下,方便在init-file里设置参数实现自定义需要代理的网站,例如:

(require 'with-proxy) 
(with-proxy-url
  :http-server "127.0.0.1:1087"
  :no-proxy '("localhost" "127.0.0.1" "192.168.*" "10.*")
  :url-proxy '("XXXX.com" "YYY.com"))
(with-proxy-shell
  :http-server "127.0.0.1:1087")

对我这样抄作业的小白来说,多这一行::url-proxy '("XXXX.com" "YYY.com")就比较直观易懂了,自己把需要代理的网址填上去即可 :grin:一开始我就以为是直接填写网址就能实现自动按需使用代理,想不到还要打补丁,太难了 :tired_face:

另一种解决问题的思路:url-retrieve 使用 curl 作为后端实现

1 个赞

今天才发现用request包还得另外设置代理,网上查了查发现需要设置request-curl-options选项。但是这个这个选项的内容应该怎么填注释说的也很模糊。网上找了一圈以后,反而是在论坛里面找到了相关信息。

1 个赞