emacs怎么在加载配置文件之前读取命令行传入的变量

我现在在家和办公室的显示器有不同的分辨率,所以希望能够通过定义一个变量,根据这个变量的值来设定一些相关的参数,比如字体大小,modeline高度等等,因此我需要这个变量是在emacs加载配置文件的过程中或者之前传入的。

比如我在家的时候就在启动emacs时设定一个变量值为t,在办公室就设为nil。我一开始尝试了在命令行中通过 --eval 来传入变量,希望在家的时候使用类似

emacs --eval '(setq at-home t)'

来完成。但是发现这个是在emacs加载完配置文件之后才执行的。测试的过程如下:首先在配置文件中加入

(defvar myvar "in config")
(message myvar)

在命令行中启动emacs

emacs --eval '(setq myvar “in command line”)'

在启动emacs之后发现在 *message* 中显示的是 in config,而describe-variable后可以看到myvar这个变量的值是"in command line"。所以emacs应该是先加载完配置文件再执行我传入的lisp的。

请问是否能够在emacs加载配置文件之前读取命令行传入的变量?

为啥不定义一个本地的文件,在主流程中 require ,更简单可扩展些。

感觉这个场景用环境变量更合适吧?定义一个环境变量,elisp 里使用 getenv 获取就行了。

谢谢,你的办法确实更合适。我之前一直在想在emacs内部怎么做到这个,没想到可以用环境变量来。

要是单纯只是和屏幕宽度有关的话,可以在启动的时候最大化frame,然后用frame-pixel-width 获取屏幕宽度。这样就可以不用引入外部的东西了。

谢谢,这个方法也很好,能够让emacs自动判断而不是我手动传入参数。

如果你用Xorg的话,可以考虑用xrandr获取显示器信息。比如archwiki上的几段脚本

如果只是分辨率的话, 其实可以考虑用 elisp 自带的 api 判断

(display-pixel-height)
(display-pixel-width)

这个接口如果是单屏的话当然最好,但如果是双屏就会返回双屏配置好后的最终宽度。

对单个屏幕来说就不准确了。

要获取所有屏幕的信息还有个api是display-monitor-attributes-list,不过这个接口返回的是

屏幕信息的列表,而且参数需要单独解析

edit: 更简单的方法是使用 frame-monitor-*系列函数,更简单一些,尤其是frame-monitor-workareaframe-monitor-geometry两个函数

谢谢提醒,我之前一直不知道emacs里有这个函数。

谢谢告知,看了你的回复我才知道emacs有这些和显示器有关的函数