分析对比windows原装的emacs与wsl2上运行的GUI版本

趁着热度抛一个讨论话题。

在用了三个多月的windows原装版的Emacs之后, 零秒精通Emacs之Windows10上畅行无碍地使用emacs的11步骤,最后还是有点无奈的用了wsl2-gui-emacs。

一、忍痛割爱的唯一原因

最重要的原因是 windows 版本不支持 Symbolic link。日常重度使用 dired,不支持建立软连接,最终忍痛割爱,其他方面似乎都能忍受。

比如以上对bookmarks建立超链接,会报错

Symlink: ‘c:/Users/gaowei/.doom.d/bookmarks’ to ‘c:/Users/gaowei/bookmarks’ failed:
(file-error Making symbolic link Operation not permitted c:/Users/gaowei/.doom.d/bookmark)

同时,所有的linux目录中的 symbolic-link 都无效,进而导致我的导航地图bookmarks残破不全(里面各种link套link)。如果继续用这个版本,几乎必然要放弃wsl2-terminal中的linux所提供的种种便利,不再使用wsl2.

独一的原因就只有这一点,不知能否解决。以下其他对比都是碎碎念。

二、没有真正的Terminal可用

有eshell可用,常常不太灵光。有时候录制Linux的课程玩,经常会有些小故障,给后面的剪辑添加不必要的工作量。

因此,录制linux视频,不得不回到wsl2的terminal中。而只要回到Linux,就要面对symbolic-link的问题。

这个问题导致,windows与Linux始终在计算机里是各自独立的系统,不能协同工作。

也是由于没有一个真正的terminal,装不了 vterm,比如 ntop 用不了,比如想录制一个htop的视频蹭蹭流量,简直不可能。

其他碎碎念,比如只能用bash,zsh不能用。

但是,这不是核心矛盾,虽然没有terminal,但日常应用能够忍受。

三、功能正常的部分

org-babel,org-agenda等都正常水平,此处略掉不提。

四、最喜欢的部分(wsl2-gui版不能实现)

最喜欢的部分就是从 dired 中按键 M-& 执行 async-shell-comand,直接调用windows的程序打开文件,比如打开pdf.

这是真的async,打开之后,不论你怎么折腾emacs,已经打开的程序都会继续运行不受干扰。

这一点wsl2-gui版本实现不了,因为会调用linux的图形程序。作为妥协方案,我只能开着wsl2-terminal版本,专门处理用windows的程序打开某些文件。

五、最后一点是底层思维问题

用windows版本,心底里总是藏着一个“担忧”的恶魔。不论出现何种问题,都会战战兢兢的想,会不会是Windows版本不支持呢? 几乎是在压抑的大气层下,偷偷的使用linux,思维和身体都难以舒展。

琐碎的问题是需要频频在Linux与windows之间切换思维。

但是在wsl2-gui-emacs中, 披着wsl2这层虚拟机的皮,linux伸出千万只手,完全控制windows。

image

鉴于此,最终还是用了wsl2-gui-emacs。不知道诸位遇到了哪些难以克服的问题,或者有哪些破解良策。

4 个赞

WSL2 版本的 Emacs 不方便与 Windows 的程序同时编辑一个文件,这是硬伤。

1 个赞

我的应用范围比较窄,还没遇到过需要完全同时的应用场景,所有的文件都在wsl2中处理。

只有markdown文件,会开windows里的typora,各自保存都能即时更新。

markdown mode 也很好用的,C-c C-x RET

2 个赞

有两项功能org只能羡慕地远远的张望,

一是支持 mermaid

流程图 即时编辑即时渲染,而且不赘余地过多展示源码:

orgd的planuml插件是以生成图片的方式展示,而且不能隐藏源码

二是 支持 mathjax, 无论inline还是block,也是即时编辑即时渲染。这个几乎是org最欠缺的死穴。

三是,开着typora,给自己留个气口,随时了解下org之外的世界发展成什么样了。不使用emacs内置的浏览器,pdf等工具,也会给自己留个气口,随时了解Emacs之外真实世界的动态。

2 个赞

wsl2打开windows的应用为啥不行?很简单啊。用explorer.exe就行了,写了小脚本用了很久,没有遇过任何问题。https://hkvim.com/post/windows-setup/

;;;###autoload

(defmacro wsl--open-with (id &optional app dir)
  `(defun ,(intern (format "wsl/%s" id)) ()
     (interactive)
     (wsl-open-with ,app ,dir)))

(defun wsl-open-with (&optional app-name path)
  "Send PATH to APP-NAME on WSL."
  (interactive)
  (let* ((path (expand-file-name
                (replace-regexp-in-string
                 "'" "\\'"
                 (or path (if (derived-mode-p 'dired-mode)
                              (dired-get-file-for-visit)
                            (buffer-file-name)))
                 nil t)))
         (command (format "%s `wslpath -w %s`" 
(shell-quote-argument app-name) path)))
    (shell-command-to-string command)))
(wsl--open-with open-in-default-program "explorer.exe" buffer-file-name)
(wsl--open-with reveal-in-explorer "explorer.exe" default-directory)

dired下,然后wsl/open-in-default-program,就可以用explorer打开文件了。

9 个赞

哇,好棒,兴奋ing…

一个非分之想的问题

当前在dire的中的文件contrive.pdf 按键 & 调用 dired-do-async-shell-command,emacs默认调用 xdg-open, 怎样将此处的xdg-open替换为explorer.exe?

按步骤设置好,完美工作

按照 The ultimate Emacs hacking tutorial in Windows 10 WSL 2 | Damon Chan's Blog 设置好了,成功运行。

先设置 ~/.zshrc:

# fix interop
fix_wsl2_interop() {
	for i in $(pstree -np -s $ | grep -o -E '[0-9]+'); do
		if [[ -e "/run/WSL/${i}_interop" ]]; then
			export WSL_INTEROP=/run/WSL/${i}_interop
		fi
	done
}

~/.emacs.d/bin/doom env > /dev/null 2>&1

然后再:

;;;###autoload

(defmacro wsl--open-with (id &optional app dir)
  `(defun ,(intern (format "wsl/%s" id)) ()
     (interactive)
     (wsl-open-with ,app ,dir)))

(defun wsl-open-with (&optional app-name path)
  "Send PATH to APP-NAME on WSL."
  (interactive)
  (let* ((path (expand-file-name
                (replace-regexp-in-string
                 "'" "\\'"
                 (or path (if (derived-mode-p 'dired-mode)
                              (dired-get-file-for-visit)
                            (buffer-file-name)))
                 nil t)))
         (command (format "%s `wslpath -w %s`" (shell-quote-argument app-name) path)))
    (shell-command-to-string command)))

(wsl--open-with open-in-default-program "explorer.exe" buffer-file-name)
(wsl--open-with reveal-in-explorer "explorer.exe" default-directory)

接下来在dired中调用 wsl–open-with open-in-default-program 就能完美工作。

其实windows,至少是win10是有symbolic link的,只不过需要管理员权限或者开启开发者模式

1 个赞

@DR_MING xdg-open 的问题解决了。

sudo ln -s /usr/bin/wslview /usr/local/bin/xdg-open

看来是全部地球人的痛点,最新版的ubuntu预装了这个工具(感觉能开心一整年 :yum:

2 个赞

好东西啊,不用自己搞脚本了。

我用x-server + wsl windows的程序可以通过在wsl下面创建链接 ln -s 来调用 wsl2的文件系统不互通太不方便了