如何在Windows 10 Bash上使用Emacs的X Windows?

20

我正在使用Bash on Ubuntu on Windows程序来使用Emacs编写C++代码。 目前,我可以使用键盘快捷键编写所有内容,但是,我想用鼠标选择文本或使用鼠标设置标记,而不总是必须使用键盘。

为了获得X Window系统,我已经执行了sudo apt-get install xserver -xorg,但Emacs仍在终端编辑器中运行。

我不知道要使用哪些其他命令或者如何启动X Window。


1
据我所了解,Windows Bash不支持X Server。然而,使用Windows Bash + XMing或MobaXTerm的组合可能适用于您。 - Yuri Steinschreiber
2
vcXsrv强烈推荐使用,相比免费版本的Xming,vcXsrv更为优秀。我不确定捐赠版的Xming是否与其兼容,但是免费版的Xming非常老旧。 - Harry Gindi
3个回答

38

Windows bash不支持X Server。但是,使用Windows X Server端口(如MobaXTerm、XMing或vcXsrv)与Windows bash一起使用可以解决问题。有些事情可以直接使用(gvim可以,)emacs需要更多的努力。

以下是我如何使其工作的方法:

  • 安装MobaXterm。很可能你也可以用XMing使其工作,但我只测试过MobaXterm。更新:已经测试了vcXsrvXMing(付费版本)。基本上都可以,但我可能会坚持使用MobaXTerm。

  • 安装emacs 25.1快照。原因:Ubuntu 14.04带有emacs 24.3,它无法与Windows bash和MobaXTerm X server配合使用(不知道为什么,而且它太旧了)。

使用以下命令安装快照:

sudo add-apt-repository ppa:ubuntu-elisp/ppa
sudo apt-get update
sudo apt-get install emacs-snapshot

然后运行
sudo update-alternatives --config emacs

选择emacs-snapshot

确保设置DISPLAY

export DISPLAY=localhost:0.0

运行MobaXTerm(您不需要做任何事情,只需启动它 - 当需要时它会启动X服务器。)

在bash中运行emacs并享受它。

仍然存在一个问题,并且在我测试的所有三个软件包中都持续存在(MobaXTerm、XMing和vcXsrv)。Emacs会坚持初始框架大小,并且在窗口大小调整时不会调整其框架大小。菜单栏也有同样的问题 - 当菜单栏被禁用时,emacs不会回收其空间,而是保留为灰色矩形。这个问题似乎是emacs在Windows bash上特有的 - gvim和其他GUI程序似乎工作正常。此外,使用Windows上的任何X服务器在Linux上运行emacs 25.1也可以正常工作。我尝试使用不同的GUI设置(GTK 2.0等)构建emacs,但是Windows bash上的emacs制作卡住了。如果我找到解决方法,我会发布更新。

更新09/24/2017 根据Jarett在你的init.el中添加以下内容应该可以解决框架调整大小的问题:

(setq frame-resize-pixelwise t)

我不再使用安装了bash的Windows系统,因此无法进行测试。


2
这个运行成功了! 但是我有2个小问题: Emacs窗口非常小,我不知道如何改变显示大小(调整窗口大小实际上并不会改变显示的大小;只会得到大白边框)。另外,每当我点击一个链接时,编辑器中有很多行变成白色,而且无法消失。http://tinypic.com/r/27xi5bn/9 - novice
1
与此同时,您可以通过使用几何命令选项来解决第一个问题,例如 emacs -g 200x50。不幸的是,这对于 emacsclient 不起作用。 - Yuri Steinschreiber
1
export命令放入您的.bashrc文件中。重点部分非常棘手,我已经尝试过了,要点是 - 几乎不可能做到。 - Yuri Steinschreiber
@novice - 我已经检查了MobaXTerm 9.1版本,鼠标点击后的白线不再出现。同时也测试了vcSrv和XMing(付费版)-它们都能正常工作。但是在所有这些软件中,窗口最大化并不能完美实现。如果有任何更新,我会及时告知你。 - Yuri Steinschreiber
1
(setq frame-resize-pixelwise t)非常好用。我正在WSL2上运行带有Ubuntu的VcXsrv,这个问题让我抓狂了。谢谢你。还要感谢Jarett,他似乎不再使用该程序了。 - theherk
显示剩余8条评论

7
感谢@Yuri的好答案,它起作用了!经过进一步的尝试和错误,我找到了解决白边问题的方法。您需要从Emacs v24.5源代码重新构建(我在git存储库中尝试了一些v25版本,但都失败了,如果您正在使用git存储库,请检出标签“emacs-24.5-rc3”)。 在配置阶段,您需要选择“lucid”(或“athena”,相同的东西)x-toolkit,而不是当前的“gtk3”。请注意,“motif”也有相同的问题。 首先,下载Emacs源代码并安装“libxaw7-dev”包。如果您没有它,“libncurses5-dev”就是为了保险起见。假设我们在目录~/build-emacs24中完成所有操作:
mkdir ~/build-emacs24
cd ~/build-emacs24
wget https://ftp.gnu.org/gnu/emacs/emacs-24.5.tar.xz
sudo apt-get install libxaw7-dev libncurses5-dev
tar xvf emacs-24.5.tar.xz

现在我们已经解压了"emacs-24.5"目录。为了防止其他地方报告的D-BUS问题,让我们在没有它的情况下进行配置,并将其安装在默认的/usr/local/bin目录中。
cd emacs-24.5
./configure --without-dbus --without-gconf --without-gsettings --with-x-toolkit=athena 

现在,我们已经准备好构建Emacs了。但在此之前,我们需要稍微调整一下内核,否则构建很快就会失败。(如果您感兴趣,可以在emacs源代码的"etc/PROBLEMS"中找到详细解释,这里不再赘述。)这只是在构建阶段需要做的。一旦您安装了新的Emacs,就不需要再次进行此操作。

sudo sh -c "echo 0 > /proc/sys/kernel/randomize_va_space"

现在让我们进入漫长的构建过程,您可能会在构建过程中遇到整个系统变慢的情况,您可以减少构建中使用的线程数(这里我使用“4”表示2核4线程的英特尔CPU,请勿使用大于支持线程数(cat / proc / cpuinfo)的数字,否则速度会变得更慢。)

time nice make -j 4

只需要几分钟?还有更多功能,现在安装它(请记住这里要使用“sudo”):
sudo make install 

整个构建和安装在我的机器上不到10分钟,还算不错。现在我们有一个位于"/usr/local/bin/emacs"的工作中的Emacs 24.5。如果您按照@Yuri的答案设置了所有内容,现在应该能够启动它:
/usr/local/bin/emacs &

现在您可以将其最大化并做您想要的事情。这是一个屏幕截图,请注意右上角,它被最大化了: enter image description here 别担心颜色,这是我自己选择的主题。
还有一个问题。让我们再次解决它。有时您选择了菜单项,“白色边框”又出现了! enter image description here 现在它更小了,但仍然很烦人。 enter image description here 幸运的是,这一次我们可以让它消失。将窗口最大化/恢复,它就会消失。几轮之后,它有时会停止再次发生,但不总是。这仍然很烦人。既然调整窗口大小可以解决此问题,为什么不让它自动化呢?也许是个不错的解决方法?
现在编辑您的“~/.emacs”文件并添加以下代码(使用您的新Emacs,当然要):
(defvar fix-frame-white-border-last-check 0)

(defun current-sec ()
  (let ((currtime (current-time)))
    (logior (lsh (car currtime) 16) (cadr currtime))))

(defun fix-frame-white-border-uow (&optional frame)
  (when (> (- (current-sec) fix-frame-white-border-last-check) 2)
    (setf frame (or frame (selected-frame)))
    (let ((width  (frame-width frame))
          (height (frame-height frame)))
      (set-frame-size frame (1- width) height)
      (set-frame-size frame width height))
    (setq fix-frame-white-border-last-check (current-sec))))

(advice-add 'menu-bar-open :after #'fix-frame-white-border-uow)
(add-hook 'menu-bar-update-hook #'fix-frame-white-border-uow)

代码并不完美,但它能够正常运行。在使用菜单时,它会稍微调整你的框架大小,并立即将其恢复原状。它还可以防止频繁地自我调整大小。

Chihiro Fukazawa的评论建议,在成功构建Emacs之后,应将/proc/sys/kernel/randomize_va_space恢复到其原始值。 - Antti Haapala -- Слава Україні
实际上,一旦您退出根bash(及其所有子进程),/proc/sys/kernel/randomize_va_space 将恢复到其原始值。下次运行bash时,您可以看到它已恢复为“2”。 - Luke Lee
这真是太棒了!你是如何让字体正常工作的?我按照指示安装了所有字体,但Emacs无法看到我的系统字体,包括Windows字体和fclist显示的字体,这使得Emacs对我来说非常丑陋。 - hal3

1

默认的Emacs可以与Xming和其他选项一起使用。问题在于默认替代品指向emacs24-nox命令。您需要安装'emacs24',它会删除emacs24-nox。

$ sudo update-alternatives --query emacs
Name: emacs
Link: /usr/bin/emacs
....
Status: auto
Best: /usr/bin/emacs24-nox
Value: /usr/bin/emacs24-nox

$ sudo apt install emacs24

$ sudo update-alternatives --query emacs
Name: emacs
Link: /usr/bin/emacs
...
Status: auto
Best: /usr/bin/emacs24-x
Value: /usr/bin/emacs24-x

请确保 $DISPLAY 变量设置正确。
export DISPLAY=localhost:0.0

谢谢,这个解决方案比上面列出的那个要简单得多,而且我不需要添加任何额外的存储库。 - Canageek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接