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

nov*_*ice 18 emacs windows-subsystem-for-linux

我在Windows程序上使用Ubuntu上的Bash来使用Emacs for C++.现在,我可以使用键盘快捷键对所有内容进行编码,但是,我想用鼠标选择文本或用鼠标设置标记,而不是总是使用我的键盘.

为了获得X Windows系统,我已经做了,sudo apt-get install xserver -xorg但emacs仍然在终端编辑器中运行.

我不知道使用什么其他命令或如何让X Windows开始运行.

Yur*_*ber 33

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服务器(不知道为什么,而且它太老了.)

使用以下命令安装快照:

sudo add-apt-repository ppa:ubuntu-elisp/ppa
sudo apt-get update
sudo apt-get install emacs-snapshot
Run Code Online (Sandbox Code Playgroud)

然后跑

sudo update-alternatives --config emacs
Run Code Online (Sandbox Code Playgroud)

并选择 emacs-snapshot

确保你设置 DISPLAY

export DISPLAY=localhost:0.0
Run Code Online (Sandbox Code Playgroud)

运行MobaXTerm(你不需要做任何事情,只需启动它 - 它将在需要时启动X服务器.)

在bash中运行emacs并享受.

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

更新09/24/2017根据Jarett你的下面init.el应该修复帧大小调整问题:

(setq frame-resize-pixelwise t)
Run Code Online (Sandbox Code Playgroud)

我没有带有bash活动的Windows,所以我无法测试它.

  • 这有效!但是,我有两个小抱怨:emacs 窗口小得令人难以置信,而且我不知道如何更改显示的大小(调整窗口大小实际上并没有改变显示的大小;我只是得到了很大的白色边框) . 此外,每当我单击链接时,编辑器中的很多行都会变成白色并且不会消失。http://tinypic.com/r/27xi5bn/9 (2认同)

Luk*_*Lee 6

感谢@ Yuri的好回答,它的确有效!经过一些进一步的尝试和错误后,我找到了解决白边问题的方法.您将需要从Emacs v24.5源代码重建(我在git存储库中尝试了一些v25版本但是都失败了,如果您使用的是git存储库,则checkout标记为"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
Run Code Online (Sandbox Code Playgroud)

现在我们提取了"emacs-24.5"目录.为了防止在其他地方报告的D-BUS问题,让我们在没有它的情况下进行配置,并将其安装在/ usr/local/bin中(默认情况下):

cd emacs-24.5
./configure --without-dbus --without-gconf --without-gsettings --with-x-toolkit=athena 
Run Code Online (Sandbox Code Playgroud)

现在,我们几乎准备好构建Emacs.但在此之前,我们需要稍微调整一下内核,否则构建很快就会失败.(让我们跳过细节,如果您感兴趣,可以在emacs源代码的"etc/PROBLEMS"中解释.)您只需要在构建阶段使用它.安装新的emacs后,您无需再次执行此操作.

sudo sh -c "echo 0 > /proc/sys/kernel/randomize_va_space"
Run Code Online (Sandbox Code Playgroud)

现在让我们进入长构建过程,您可能会在构建期间遇到整体系统减速,您可以减少构建中使用的线程数(这里我使用"4"代表2核4线程Intel CPU,不要'使用大于支持的线程(cat/proc/cpuinfo)的数字,或者它会变得更慢.)

time nice make -j 4
Run Code Online (Sandbox Code Playgroud)

只需几分钟?更多内容,现在安装它(记住这里的"sudo"):

sudo make install 
Run Code Online (Sandbox Code Playgroud)

整个构建和安装在我的机器上只需不到10分钟,也不算太差.现在我们有一个工作的Emacs 24.5位于"/ usr/local/bin/emacs".如果您将所有内容设置为@ Yuri的答案,您应该能够立即启动它:

/usr/local/bin/emacs &
Run Code Online (Sandbox Code Playgroud)

现在你可以最大化它并做你想做的事情.这是一个屏幕截图,注意到右上角,它是最大化的:

在此输入图像描述

不要担心颜色,这是我自己的主题选择.

还有一个问题.让我们再次解决它.有时您选择了一个菜单项并再次进行"白色边框"攻击!

在此输入图像描述

它现在更小但仍然很烦人.

在此输入图像描述

幸运的是,这次我们可以让它消失.最大化/恢复窗口,它将消失.经过几轮后,它有时会再次停止发生,但并非总是如此.这仍然很烦人.由于调整窗口大小可以解决这个问题,为什么我们不自动化呢?也许是一个不太糟糕的解决方法?

现在编辑你的"〜/ .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)
Run Code Online (Sandbox Code Playgroud)

代码并不完美,但它有效.当您使用菜单时,它会稍微调整您的框架大小并立即恢复它.它还可以防止自己频繁调整大小.