如何在 Windows 10 Bash 上将 X Windows 与 Emacs 一起使用?
How to use X Windows with Emacs on Windows 10 Bash?
我在 Ubuntu 上使用 Bash on Windows 程序来使用 Emacs for C++。
现在,我可以使用键盘快捷键对所有内容进行编码,但是,我想使用鼠标 select 文本或使用鼠标设置标记,而不必总是使用键盘。
为了获得 X Windows 系统,我已经做了 sudo apt-get install xserver -xorg
但 emacs 仍然在终端编辑器中运行。
我不知道要使用什么其他命令或如何让 X Windows 启动 运行。
Windows bash 不支持 X 服务器。但是,将 Windows X 服务器端口(例如 MobaXTerm、XMing 或 vcXsrv)与 Windows bash 结合使用是可行的。有些东西开箱即用(gvim 做到了,)emacs 需要更多努力。
我是这样实现的:
安装 MobaXterm. Most probably you can make it work with XMing as well, but I have tested only with MobaXterm. Update: Tested with vcXsrv and XMing(付费版本。)工作原理基本相同,我可能会坚持使用 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
然后运行
sudo update-alternatives --config emacs
和selectemacs-snapshot
确保设置 DISPLAY
export DISPLAY=localhost:0.0
运行 MobaXTerm(您不需要在其中执行任何操作,只需启动它 - 它会在需要时启动 X Server。)
运行 bash 中的 emacs 并享受。
仍然存在一个问题,它在我测试过的所有三个软件包(MobaXTerm、XMing 和 vcXsrv)中都存在。 Emacs 坚持初始框架大小,并且在 window 调整大小时不会调整其框架大小。菜单栏也有同样的问题 - 当菜单栏被禁用时,emacs 不会回收它的 space,它仍然是一个灰色的矩形。这个问题似乎是 Windows bash 上的 emacs 特有的 - gvim 和其他 GUI 程序似乎工作正常。此外,运行在 Linux 上使用任何 X 服务器在 Windows 上运行 emacs 25.1 工作正常。我尝试使用不同的 GUI 设置(GTK 2.0 等)构建 emacs,但是 emacs make on Windows bash 卡住了。如果我找到解决方法,我会 post 更新。
更新 09/24/2017 根据 Jarett 您的 init.el
中的以下内容应该可以解决帧大小调整问题:
(setq frame-resize-pixelwise t)
我没有 Windows 和 bash 活动,所以我无法测试它。
感谢@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 线程Intel 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 &
现在你可以最大化它并做你想做的事。这是一个屏幕截图,注意右上角,它已最大化:
不用担心颜色,这是我自己选择的主题。
还有一个问题。让我们再次解决它。有时您选择了一个菜单项,然后 "white border" 再次攻击!
它现在变小了,但仍然很烦人。
幸运的是这次我们可以让它消失了。 Maximize/restore window 它会消失。几轮之后,它有时会再次停止发生,但并非总是如此。这仍然很烦人。既然调整 window 的大小可以解决这个问题,为什么我们不让它自动呢?也许是一个不太糟糕的解决方法?
现在编辑您的“~/.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)
代码并不完美,但可以工作。它会稍微调整您的框架大小,并在您使用菜单时立即恢复它。它还可以防止自己频繁调整大小。
默认的 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
我在 Ubuntu 上使用 Bash on Windows 程序来使用 Emacs for C++。 现在,我可以使用键盘快捷键对所有内容进行编码,但是,我想使用鼠标 select 文本或使用鼠标设置标记,而不必总是使用键盘。
为了获得 X Windows 系统,我已经做了 sudo apt-get install xserver -xorg
但 emacs 仍然在终端编辑器中运行。
我不知道要使用什么其他命令或如何让 X Windows 启动 运行。
Windows bash 不支持 X 服务器。但是,将 Windows X 服务器端口(例如 MobaXTerm、XMing 或 vcXsrv)与 Windows bash 结合使用是可行的。有些东西开箱即用(gvim 做到了,)emacs 需要更多努力。
我是这样实现的:
安装 MobaXterm. Most probably you can make it work with XMing as well, but I have tested only with MobaXterm. Update: Tested with vcXsrv and XMing(付费版本。)工作原理基本相同,我可能会坚持使用 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
然后运行
sudo update-alternatives --config emacs
和selectemacs-snapshot
确保设置 DISPLAY
export DISPLAY=localhost:0.0
运行 MobaXTerm(您不需要在其中执行任何操作,只需启动它 - 它会在需要时启动 X Server。)
运行 bash 中的 emacs 并享受。
仍然存在一个问题,它在我测试过的所有三个软件包(MobaXTerm、XMing 和 vcXsrv)中都存在。 Emacs 坚持初始框架大小,并且在 window 调整大小时不会调整其框架大小。菜单栏也有同样的问题 - 当菜单栏被禁用时,emacs 不会回收它的 space,它仍然是一个灰色的矩形。这个问题似乎是 Windows bash 上的 emacs 特有的 - gvim 和其他 GUI 程序似乎工作正常。此外,运行在 Linux 上使用任何 X 服务器在 Windows 上运行 emacs 25.1 工作正常。我尝试使用不同的 GUI 设置(GTK 2.0 等)构建 emacs,但是 emacs make on Windows bash 卡住了。如果我找到解决方法,我会 post 更新。
更新 09/24/2017 根据 Jarett 您的 init.el
中的以下内容应该可以解决帧大小调整问题:
(setq frame-resize-pixelwise t)
我没有 Windows 和 bash 活动,所以我无法测试它。
感谢@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 线程Intel 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 &
现在你可以最大化它并做你想做的事。这是一个屏幕截图,注意右上角,它已最大化:
不用担心颜色,这是我自己选择的主题。
还有一个问题。让我们再次解决它。有时您选择了一个菜单项,然后 "white border" 再次攻击!
它现在变小了,但仍然很烦人。
幸运的是这次我们可以让它消失了。 Maximize/restore window 它会消失。几轮之后,它有时会再次停止发生,但并非总是如此。这仍然很烦人。既然调整 window 的大小可以解决这个问题,为什么我们不让它自动呢?也许是一个不太糟糕的解决方法?
现在编辑您的“~/.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)
代码并不完美,但可以工作。它会稍微调整您的框架大小,并在您使用菜单时立即恢复它。它还可以防止自己频繁调整大小。
默认的 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