如何更改emacs的环境变量,exec-path这个命令没什么用

今天太让我无语了,这个错误我调了一下午
我的proxy端口换掉了,但是emacs还是用的旧端口,用exec-path-from-shell-initialize给我跳出来这个

You appear to be setting environment variables ("PATH") in your .bashrc or .zshrc: those files are only read by interactive shells, so you should instead set environment variables in startup files like .profile, .bash_profile or .zshenv.  Refer to your shell’s man page for more info.  Customize ‘exec-path-from-shell-arguments’ to remove "-i" when done, or disable ‘exec-path-from-shell-check-startup-files’ to disable this message.

那好吧,我就把export http_proxy='http://127.0.0.1:7890'这条指令在各种profile.bashrc,.zshrc里写了个遍,都source过了
到emacs里exec-path-from-shell-copy-env,然后M-! echo $http_proxy,还是以前的端口,一点都没改
劳资这个也改了,

(setq url-proxy-services '(
			   ("http" . "http://127.0.0.1:7890")
			   ("https" . "https://127.0.0.1:7890")
			   ("socks" . "socks://127.0.0.1:7891")))

照样木大
最后终于找到了解决方案

(setenv "http_proxy" "http://127.0.0.1:7890")
(setenv "https_proxy" "https://127.0.0.1:7890")

这是怎么回事啊,我下体裂开了啊

exec-path-from-shell 只负责把shell的PATH变量导入Emacs的exec-path变量里

那为什么emacs不用我shell里的配置呢

你是怎么启动Emacs的

图标启动啊,直接emacs

你用图标启动和我shell变量有什么关系?

image

1 个赞

哈哈哈哈,当初GUI界面变量与shell中的变量不同步的时候,我是用exec-path-from-shell这个函数解决的

exec pfs 只给你同步 PATH 变量,其他变量是不管的,最经济的当然是 setenv

那原来emacs是怎么读取环境变量的,除了setenv要怎么去修改

bashrc, zshrc这些只影响交互环境

如果你想让emacs启动时读到你的环境变量,一般来说要改的是xsession这类。有些发行版可能在图形界面也会去执行bashrc这种,但这不是很标准。一般来说你是不能在运行期修改图形界面运行的那个环境的变量,你开个新的终端只是那个环境的sub。getenv读是读你emacs运行环境的变量,也就是这个图形界面的环境,如前面说的,这个和你的交互环境一般是分开的。除非你emacs是从终端启动的

再一点,你用setenv修改的只是emacs运行的这个subshell环境,也不会影响到parent shell

同步变量值的方法可以参考exec-shell和direnv这种,自己写脚本去开个shell,然后把变量导出来setenv

哦,你用exec-shell的话,他有个配置是可以配置同步哪些变量来的

我在 linux 是直接从 bash 里 startx 的,所以没那么多复杂的要整。

可以像 Spacemacs 那样自动或手动 dump 一份完整的 env,启动时用 load-env-vars 加载这个文件

等需要修改的时候,再重新 dump 或者编辑文件

环境变量不是一个巨型全局哈希表, 他是进程间独立的

POSIX系统里创建子进程, 先用fork 复制父进程, 然后用exec运行命令, 替换掉这个被fork出来的进程, exec 命令里可以给重新设定进程的环境变量, 如果不设定则是从父进程复制得来

搜得私呢,我明白了

你用export 设置命令行shell的环境变量, 然后用图标启动, 点图标是GUI shell进行fork+exec, 自然不会被命令行里shell的环境变量影响.

如何初始化GUI shell的环境变量, 通常是由login manager(就是让你启动输入密码的程序)来决定的, 有的login manager会读取~/.profile 或者 ~/.xprofile. 但是没有一个统一的标准, 导致不同login manager实现不一样, 这也是Linux桌面一个令人诟病的地方

@LdBeth 那样在tty使用startx, X是在命令行的shell里启动的, shell会用对应的~/.shell_profile 或者 ~/.shellrc 初始化环境变量, 正好让startx 继承了.