我现在在家和办公室的显示器有不同的分辨率,所以希望能够通过定义一个变量,根据这个变量的值来设定一些相关的参数,比如字体大小,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-workarea
和 frame-monitor-geometry
两个函数
谢谢提醒,我之前一直不知道emacs里有这个函数。
谢谢告知,看了你的回复我才知道emacs有这些和显示器有关的函数