Windows 下如何为 Emacs 设置环境变量?

我在 Windows 10 机器上用 MSYS2 安装了 Emacs 25.1

$ pacman -S mingw-w64-x86_64-emacs

我把 Emacs 配置放在 MSYS2 下的 ~/.emacs.d(对应于 Windows 认为的 C:\msys64\home\xcy),然后启动 Emacs

$ emacs

一切都是正常的。现在我想把启动 Emacs 变得更简单些,在桌面上创建了一个快捷方式至 C:\msys64\mingw64\bin\runemacs,点击它,可以启动 Emacs,但不出意料的,我的配置没有加载,Info,Man 等等也不能正常工作,请问如何把 MSYS2 下的

  • HOME
  • SHELL
  • PATH
  • INFOPATH
  • MANPATH

等环境变量传递给 Emacs?

(emacs) Windows HOME 中说可以用从“我的电脑”的属性中设置 HOME,但是我找不到“我的电脑”,可能 Windows 10 下压根就没有。也说可以从注册表中设置,然后我也不清楚具体怎么操作。

在cmd输入regedit后回车就会打开注册表了

找到HKEY_LOCAL_MACHINE\SOFTWARE\GNU\Emacs(如果没有则手动添加项),在此项下添加字符串值,名称为HOME, 值为D:\emacs.d。这样做的目的是让D:\emacs.d成为Emacs的home路径

以此类推。

不过一般这是针对在官方网站下载的版本。我不清楚能不能对用MSYS32装的有效。

1 个赞

我试了下是可以的(HOME 设置的值是 .emacs.d 所在的目录,比如我的 C:\msys64\home\xcy,不是其本身)。

其它的环境变量手动改起来比较烦,暂时还没设置,不清楚 exec-path-from-shell 能不能用在 Windows + MSYS2 下。

大神开始用 windows 了吗?

这里有一个 bat 可以参考:

不过不是 msys 版本的emacs,不知道适用不。

set OLDPATH=%PATH%
set PATH=%PATH%;D:\PortableApps\miktex-portable-2.9.6221\texmfs\install\miktex\bin
set LANG=en
set HOME=D:\James\Dropbox
start "" "D:\PortableApps\PortableGit\emacs-win\bin\runemacs.exe" -l "D:\PortableApps\PortableGit\emacs-win\init.el" %1

环境变量可以在path后面添加,注意要用分号分隔开,并且最后一个路径后面不要有分号,这个只是启动 emacs 有效,不会改变系统的环境变量。

1 个赞

elisp 也可以设置环境变量吧?

的确可以。不过 HOME 还是用先注册表比较好

不用修改注册表,最干净的办法是 bat 文件启动

Emacs可以识别Windows的环境变量设置,但是有时候很诡异。Windows环境变量配置可以用这款免费软件:

不过你也不用太费心力捣鼓,未来只有Bash on Windows。Bash on Windows的Emacs现在已经可用,不过还是有一些BUG:窗口不能隐藏工具条,不能拉伸窗口,不过用不了多久应该就会被修复了,详情见下方链接:

追加推荐注册表编辑器:

2 个赞

windows下使用Emacs时,如果是官网下载的直接修改Eamcs/share/emacs/site-lisp/subdirs.el 是比较好的方法,或者使用bat来启动。 你如果使用msys2的环境的话可以里面启动,配置是在msys2文件夹里的,如果你把Emacs拷贝或者建立快捷方式的话,配置就变了,就跟官网下载的没有太大区别了。也可以按照上面的方法来配置。 我觉得你可以参考我整理的文档

如果你是在msys2里面运行Emacs的话,跟linux是差不多的,如果拷贝出来还想再调用w3m等外部程序的话就要加$PATH,可以参考这个 文档

bat 这个法子也不错,直接让 Bash 启动 Emacs,然后所以的环境变量就都直接传过去了(?)

start "" "c:/msys64/usr/bin/bash.exe" -l -i -c "c:/msys64/mingw64/bin/runemacs.exe"

美中不足的是,每次双击打开这个 bat 文件,都会短暂地弹出一个黑色的窗口,然后在 Emacs 窗口出现之后又里面消失。不知道有没有办法改进。


UPDATE:刚发现上面 Bash 执行了 ~/.bash_profile,但是没有执行 /etc/profile,所以还是有问题,暂时从 Emacs 启动 Emacs,曲线救国(不直接用 $ emacs 的因为会占用当前的终端。)

$ emacs -f restart-emacs

我没有这样用过。但是我一直觉得在 windows 下面用 bash 是很蛋疼的一件事,以前用过 cygwin msys,最后都放弃了,干脆装虚拟机了事。

虚拟机还有一个好处就是可以随意进行各种尝试,实在不行就立刻恢复前一个存档。现在的电脑的配置跑个 linux 虚拟机也都不是事。

可惜会出现命令行窗口。当然可以用上vbs来隐藏。

原来还有这种东西。。。

你的两个文档都看不到了。

1 个赞

对不起,我要回复一个老帖子。看了这个讨论,我给自己的Windows下使用Emacs的最佳实践添加上了我对这几个问题的解决方案:

7. 如何启动Emacs

说了半天没介绍怎么启动Emacs,失策。新建一个快捷方式,目标是emacsclientw.exe的绝对路径后跟参数-c -n -a "",运行这个快捷方式就可以以daemon模式启动Emacs。各参数的解释:

  • -c新建一个frame。这个参数也让emacsclientw不要求提供文件名。
  • -n立即退出,对于Windows来说这样就可以。
  • -a ""这个参数很有意思。-a的本意是在Emacs没有运行的时候提供一个后退的编辑器,而提供一个空字符串则以daemon模式启动Emacs,这就是我们需要的。注意必须要带空字符串。详解

8. 配置HOME

在启动Emacs的快捷方式里,还要设置启动位置为%HOME%,同时在系统的环境变量里为用户或系统添加环境变量HOME,路径就用MSYS2里你的home目录就可以。

9. 配置PATH

与其依赖系统的环境变量,不如自己设置一个专用于Emacs的。方法是

(setenv "PATH" "C:\\msys64\\mingw64\\bin;C:\\msys64\\usr\\bin;C:\\Windows\\System32;C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0")

注意看路径的写法。

10. 使用*NIX世界的路径表示方法

需要用到cygwin-mount,用包管理器安装就好了,然后用下面三行配置

(require 'cygwin-mount)
(setq cygwin-mount-cygwin-bin-directory "C:/msys64/usr/bin/")
(cygwin-mount-activate)

注意这里的路径要改成你电脑上的。这里也看出Windows的一个不好的地方了:不同电脑的目录结构有很大的不同,造成的麻烦远比好处多。

11. 怎么用shell

我现在的做法是,不改shell相关的设置,启动Bash的shell用快捷键实现,如果是运行程序,用代码判断,具体请看两段代码:

(if (string-equal system-type "windows-nt")
    (progn
      (defun my-bash ()
	(interactive)
	(let ((shell-file-name "/bin/bash"))
	  (call-interactively 'shell)))
      (global-set-key (kbd "H-s") #'my-bash))
  (global-set-key (kbd "H-s") #'shell))
  
(defun my-hexo-deploy ()
  "Deploy my hexo site."
  (interactive)
  (let ((c "time (cd ~/repo/hexo-blog/; time (hexo g) &>> /tmp/hexo.log; time (hexo d) &>> /tmp/hexo.log;)"))
    (async-shell-command
     (if (string-equal system-type "windows-nt")
	 (concat "bash -c "
		 (shell-quote-argument c))
       (shell-quote-argument c)))))

欢迎讨论。

上面的回贴不能修改了,回复在这里吧。

设置 HOME 目录与 Portable Emacs

调用外部程序

很实用的功能!这样可以省去设置一些环境变量,开箱即用? 不过这样创建的 server 只能是默认服务名,不能设置为别的 EMACS_SERVER_FILE

PS:第二个链接应该指向你的博客吧。

1 个赞

您说的问题我真没关心过,这个特性我在Win下和*NIX下都是直接用的。

谢谢您的指正。我又添加了几条,和主题有点关系,但不大。

或许不同的电脑参数会有差异?我自己电脑上实现起来还是很简单的,我仅仅添加了一个HOME环境变量就行了。如果不添加,使用Emacs自己默认识别的也可以。GUI中修改一个配置,然后点击保存配置,mini buffer中会提示路径信息。如果有了这个,倒是也无需再设置环境变量了。

处于习惯以及好看,我自己设置了一个HOME环境变量。