WSL emacs 无法输入中文(有候选,无法上屏)

我使用的是WSL2的Ubuntu搭配X410,已经安装了fcitx与fcitx-sunpinyin,并且在fcitx-configtool中配置好了相关的设置。 在gedit中,我可以正常利用我设置的Ctrl+Shift快捷键切出输入法,并输入中文: 图片

但emacs下,可以切出中文输入法,但无论如何都无法上屏,下面是emacs -q下的效果: 图片

空格或是数字键都无法使文字上屏(输入的拼音也是消失不上屏)

请问有没有好的解决方案?

另,spacemacs的chinese layer,fcitx功能似乎存在问题,我按照文档的要求添加了chinese-enable-fcitx t之后总会报错Error (use-package): fcitx/:config: Unknown ‘M-x’ binding command. Only original M-x, ‘smex’, ‘helm-M-x’ and ‘counsel-M-x’ are supported. 是我的问题吗?

用emacs-rime吧

无法上屏 +1 ,已经换用emacs-rime

尝试了一下,emacs-rime需要动态支持,而ubuntu官方源的最新版本是没有动态支持的;添加kelleyk/emacs源后一番折腾装上了emacs27,但由于wsl没有systemd,一启动spacemacs就会报一个错误

File error: Creating directory, Permission denied, /run/user/1000

不知道为什么,官方源的emacs26.3就没这个问题

我自己用的是 pyim,换个词库之后很好用。

spacemacs不需要systemd支持。这是权限问题,你再查查是不是哪里没装对。

X410设置为Full desktop并配置环境变量试试。

不过个人也建议使用Emacs-rime。

楼主遇到的权限错误不了解,没有遇到过。

下面是我emacs --debug-init 显示的error,我不太清楚是怎么回事

Debugger entered--Lisp error: (file-error "Creating directory" "Permission denied" "/run/user/1000")
  signal(file-error ("Creating directory" "Permission denied" "/run/user/1000"))
  files--ensure-directory("/run/user/1000")
  make-directory("/run/user/1000/emacs" t)
  server-ensure-safe-dir("/run/user/1000/emacs")
  server-start()
  (if (server-running-p) nil (message "Starting a server...") (server-start))
  (progn (require 'server) (if dotspacemacs-server-socket-dir (progn (setq server-socket-dir dotspacemacs-server-socket-dir))) (if (server-running-p) nil (message "Starting a server...") (server-start)))
  (if (and dotspacemacs-enable-server (not (spacemacs-is-dumping-p))) (progn (require 'server) (if dotspacemacs-server-socket-dir (progn (setq server-socket-dir dotspacemacs-server-socket-dir))) (if (server-running-p) nil (message "Starting a server...") (server-start))))
  (let ((file-name-handler-alist nil)) (require 'core-spacemacs) (spacemacs/dump-restore-load-path) (configuration-layer/load-lock-file) (spacemacs/init) (configuration-layer/stable-elpa-init) (configuration-layer/load) (spacemacs-buffer/display-startup-note) (spacemacs/setup-startup-hook) (spacemacs/dump-eval-delayed-functions) (if (and dotspacemacs-enable-server (not (spacemacs-is-dumping-p))) (progn (require 'server) (if dotspacemacs-server-socket-dir (progn (setq server-socket-dir dotspacemacs-server-socket-dir))) (if (server-running-p) nil (message "Starting a server...") (server-start)))))
  (if (not (version<= spacemacs-emacs-min-version emacs-version)) (error (concat "Your version of Emacs (%s) is too old. " "Spacemacs requires Emacs version %s or above.") emacs-version spacemacs-emacs-min-version) (let ((file-name-handler-alist nil)) (require 'core-spacemacs) (spacemacs/dump-restore-load-path) (configuration-layer/load-lock-file) (spacemacs/init) (configuration-layer/stable-elpa-init) (configuration-layer/load) (spacemacs-buffer/display-startup-note) (spacemacs/setup-startup-hook) (spacemacs/dump-eval-delayed-functions) (if (and dotspacemacs-enable-server (not (spacemacs-is-dumping-p))) (progn (require 'server) (if dotspacemacs-server-socket-dir (progn (setq server-socket-dir dotspacemacs-server-socket-dir))) (if (server-running-p) nil (message "Starting a server...") (server-start))))))
  eval-buffer(#<buffer  *load*> nil "/home/wang1zhen/.emacs.d/init.el" nil t)  ; Reading at buffer position 1880
  load-with-code-conversion("/home/wang1zhen/.emacs.d/init.el" "/home/wang1zhen/.emacs.d/init.el" t t)
  load("/home/wang1zhen/.emacs.d/init" noerror nomessage)
  startup--load-user-init-file(#f(compiled-function () #<bytecode 0x57fd85>) #f(compiled-function () #<bytecode 0x489add>) t)
  command-line()
  normal-top-level()

非要在wsl下用emacs,建议使用scoop安装archlwsl archwsl 下emacs和emacs-rime的安装什么的都比较容易找到符合往上大部分教程的版本

不太了解,scoop安装的archwsl也是https://github.com/yuk7/ArchWSL这个版本吗?我尝试过这个版本的archwsl上的emacs,应该也存在systemd的问题,https://github.com/yuk7/ArchWSL/issues/170就是我提的类似issue。

WSL 之前因为技术原因,一直都无法使用 systemd ,现在不知道怎么了。你的报错是因为 emacs 在 26.x 到 现在的版本默认在 /run/user/1000/emacs 文件夹下创建服务端,解决方法:

  1. 不使用 emacs server, 在 spacemacs 中也许只需要更改 dotspaceemacs-enable-server 为 nil。
  2. 修改 server-socket-dir 值, 在 spacemacs 中也许是修改 dotspacemacs-server-socket-dir 的值。

PS: 我不使用 spacemacs

感谢!这确实解决了问题!