我在 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 有效,不会改变系统的环境变量。
2 个赞
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 虚拟机也都不是事。
Chris
2018 年2 月 27 日 17:54
16
对不起,我要回复一个老帖子。看了这个讨论,我给自己的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)))))
欢迎讨论。
1 个赞
很实用的功能!这样可以省去设置一些环境变量,开箱即用?
不过这样创建的 server
只能是默认服务名,不能设置为别的 EMACS_SERVER_FILE
。
PS:第二个链接应该指向你的博客吧。
1 个赞
Chris
2018 年3 月 1 日 16:52
19
您说的问题我真没关心过,这个特性我在Win下和*NIX下都是直接用的。
谢谢您的指正。我又添加了几条,和主题有点关系,但不大。
Grey
2018 年3 月 5 日 17:54
20
或许不同的电脑参数会有差异?我自己电脑上实现起来还是很简单的,我仅仅添加了一个HOME环境变量就行了。如果不添加,使用Emacs自己默认识别的也可以。GUI中修改一个配置,然后点击保存配置,mini buffer中会提示路径信息。如果有了这个,倒是也无需再设置环境变量了。
处于习惯以及好看,我自己设置了一个HOME环境变量。