WSL2 & emacs 到底还有多少坑?

在公司一直用的 WSL1 环境跑 emacs,今天心血来潮升了下 WSL2。没想到居然这么坑。。。可是环境都配好了,就不想回去了 :joy: :joy:

发个帖子收集下大家在 WSL2 下还遇到过什么坑。。。

目前我遇到的问题主要有:

  1. WSL2 和 proxfier 会产生冲突:

这个问题非常鬼畜,主要表现在:没法同时使用 WSL2 和 proxifier 这俩。要是开了 proxifier 会使得 WSL 起不来,无法新建终端,直接跑 WSL 会报参考的对象类型不支持尝试的操作

解决’对象‘错误:

// powershell 管理员
netsh winsock reset
// 重启

解决方法:1. 不用 proxifier; 2. 运行修复程序

我采用的是方法2, 直接导致我现在 wsl-terminal 挂了,根本没法通过它启动 WSL。。。 但是 windows-terminal 因为是直接跑 wsl.exe 的就还能正常使用。

  1. WSL2 代理:

这个问题我给出自己(拿来)的配置

配置操作:

// .bashrc
// port 写代理软件(如 v2ray)的监听端口
// 注意代理过去的协议格式
export hostIp=$(cat /etc/resolv.conf |grep -oP '(?<=nameserver\ ).*')
export https_proxy="socks5://${hostIp}:port"
export http_proxy="socks5://${hostIp}:port"
export all_proxy="socks5://${hostIp}:port"

还有最后一个操作: 主要要把公共网络的防火墙策略配置下(最好别直接给关了)

// powershell 管理员
netsh interface portproxy add v4tov4 listenport=4000 listenaddress=0.0.0.0 connectport=4000 connectaddress=192.168.101.100
  1. xServer(VcxSrv) 连接:

用终端的大佬可以直接忽略。直接上配置:

// 接上
export DISPLAY=:${hostIp}:0
  1. 各种程序、文件的运行和处理速度非常慢/ 热编译不起作用等。。。

解决方法:把项目文件夹移到 Linux 的文件系统下。

其实都是些很小的问题,欢迎大家都试试让更多有需要的人少走些弯路。

3 个赞

有一个坑,睡眠唤醒后,gui的emacs会掉,应该也是wsl2的网络原因。

在等wsl2的gui官方支持,也许能好,也许不能。

这几天在win上我还重新配置了emacs,除了c++配置搞不大好,别的都还好,能用。

主要 WSL2 虚拟了一张网卡,导致一些配置要改,基于tun的透明代理在我这儿直接报废。 于是我继续用回 WSL1 了……

感觉直接用WSL2不如用基于WSL2的docker.

  1. Dockerhub有很多发行版的image, 比WSL2自带几个有限的发行版多很多选择
  2. Docker可以很方便的处理诸如端口转发等琐碎问题.

windows 难道不是想把 WSL 做成原生的子系统吗?还是期待它把 WSL 做好一点吧。。。

今天又遇到了几个问题:

  1. 找不到家目录在 windows 下的路径

解决方案:

创建一个脚本执行:

// find-home.sh
#!/bin/bash
explorer.exe .
  1. 给 emacs 做代理:

试了几种方式,都么得啥用

很奇怪的是外面的代理软件收到请求了,但是 emacs 貌似就是没法拿到返回数据。。。只好把所有代理关掉了走国内镜像和 github 了。

  1. emacs 居然会闪退。。。

这个感觉不是 WSL 的问题。但是我今天没解决。

表现: emacs 会闪退,主要是 x server 会无缘无故挂掉。然后终端报错:When compiled with GTK, Emacs cannot recover from X disconnects. This is a GTK bug: blablabla 解决方案

已经从wsl换回ubuntu了 >_<

接上

eamcs 闪退的问题和休眠 emacs 会掉的问题解决了。

原因应该出在 xServer 上, 我把 VcxSrv 换成 MobaXterm 这个问题迎刃而解。 :flushed:

老哥是不是不用 QQ 的 :joy: :joy:,我工作强依赖 QQ,太痛苦了,要不是这样我早就转 Linux 了。

deepin wine 微信效果不错,tim运行差强人意。。。。

老早就不用qq了,不过uos里面似乎有qq <_< 另外wsl太多坑了,gdb调试时候报错的位置都能错掉。:stuck_out_tongue:

差强人意: 大体上让人勉强满意

不知道大佬是不是就是这个意思,我这感觉 TIM 完全不能用

我这在Arch Linux 上连deepin wine 都不能用,点几下就直接崩了。

tim 感觉已经被放弃了

proxfier 做啥用啊,emacs在wsl下编辑不是挺好的。

做全局代理配置的软件,其实不用也可以的。

emacs 在 WSL2.。。。真的太一言难尽了,今天发现WSL 下 emacs 会越用越卡,开了几个 lsp 的后端就开始一卡一卡了。

另外发现,退出 emacs 重启之后,顶部的拖动条就没了 :innocent:,只能重启 MobaXterm。

PS:可能是我电脑配置太差了 :rofl: :rofl:

  • 判断是否是 WSL 环境

最近遇到一个问题是家里的笔记本字体比较小些,需要字体大小和在公司的不一样。这就需要判断是否在 WSL 环境下了。

下面是我使用的方法:

(defconst sys/linuxp
  (and (eq system-type 'gnu/linux)
       (not (string-match "-[Mm]icrosoft" operating-system-release)))
  "Are we running on a GNU/Linux system?")

(defconst sys/WSL
  (and (eq system-type 'gnu/linux)
       (string-match "-[Mm]icrosoft" operating-system-release))
  "Are we running on a GNU/Linux system?")

(defconst sys/win32p
  (eq system-type 'windows-nt)
  "Are we running on a WinTel system?")

;; 使用的时候
(cond
 (sys/linuxp (set-face-attribute 'default nil :height 160))
 (sys/win32p (set-face-attribute 'default nil :height 140))
 (sys/WSL (set-face-attribute 'default nil :height 140)))

借鉴了下 @seagle0128 大佬的配置 :rofl: :rofl:

3 个赞
(if (string= (system-name) "DESKTOP-DMGKG0I");;PC at work
    (progn (set-font "Sarasa Term SC" "Sarasa Term SC" 24 24)
  (setq desktop-dirname "~/.emacs.d/DMGKG0I")
  (setq desktop-path '("~/.emacs.d/DMGKG0I"))))

(if (string= (system-name) "DESKTOP-439OGGP");;Mini PC
    (progn (set-font "Sarasa Term SC" "Sarasa Term SC" 40 40)
  (setq desktop-dirname "~/.emacs.d/439OGGP")
  (setq desktop-path '("~/.emacs.d/439OGGP"))))

对于多设备,我是通过获取每个系统的system-name来判断的,进eshell输入(system-name)即可。

不过我发现在wsl2里面获取的system-name和宿主Windows上开GUI emacs获取到的system-name完全一致,幸好没人会同时使用wsl和windows的emacs吧。

我就是那个同时使用wsl和windows emacs的人。。。

1 个赞

有什么原因无法放弃Windows的emacs吗