emacs 和 X11
XMing 6.9
不需要修改key binding。而且XMing支持ttf字体,字体配置比mobaXterm方便。但是高版本的XMing和VCXSrv都有问题。
最近需要在linux上开发nginx的module。ssh到vm中用字符界面的emacs写代码非常稳定,功能正常,但是gui的中文的显示更漂亮,而且可以全屏显示,能多看几行,所以就折腾了一下xwindow。
最开始是用mobaXterm作为xserver,虚机作为xclient。后来用XMing和VCXSrv。
不得不说的是,emacs在linux中的启动真的是神速,同样的配置文件,虚机中的linux都只要1.5s,而win10要10s左右,这个差距太明显。
字符界面的问题:
- <esc>键按下去后有时候感觉响应比较慢,后续的按键容易出错
gdb debug
时能看的内容有点少。字符都是一个大小,显示不如gui那么好看。- 显示行号后,copy时总是把行号给copy下来。
用yum安装X11相关包
我的emacs 25.3是用源代码编译安装的。centos默认只有字符界面,需要安装X11相关的rpm包,尤其是开发包才能重新编译emacs,让emacs支持gui。
安装X Window相关的rpm包
yum groupinstall 'X Window System' -y
After that you can choose one of these available Desktop groups to install.
yum groupinstall basic-desktop desktop-platform x11 fonts
yum install libX11*
不一定要装window manager,如gnome kde或者gtk,反正不在centos上启动桌面,只是XClient罢了,XServer由mobaXterm来做。
编译
在configure时提示需要几个图片格式的包,先装png和jpeg两个吧。
[root@master emacs-25.3]# yum install libpng* libjpeg # 安装libgif时有报错,暂时不装了。 configure: error: The following required libraries were not found: libgif/libungif libtiff Maybe some development libraries/packages are missing? If you don't want to link with them give --with-gif=no --with-tiff=no as options to configure
不用支持gif和tiff格式,emacs能显示png和jpeg就够了。
./configure --with-gif=no --with-tiff=no make && make install
中文字体
mobaXterm貌似只能用点阵字体(pcf格式),ttf一类的怎么设置都不行。
中文字体有个遗留问题,英文字符和中文字符没法区分开,需要再看看为什么都用默认的字体了。
刚开始配置时用了习惯的微软雅黑(true type), mkfontdir or ttmkdir or mkfontscale
生成了fonts.dir和fonts.scale,但是在 xset fp+ ~/.fonts
时总是报错。
想了一下,觉得xserver时mobaXterm,xclient是centos,server和client不是一个机器,应该用xserver上有的字体,而且 xset 命令其实是增加xserver上对应的目录,我在xclient(即centosz)有个目录 ~/.fonts,但是在xserver上是没有的,肯定报错。需要先看看xserver的字体目录和支持的字体。
用mobaX作为xserver时,font path是 C:\Users\Albert\AppData\Local\Temp\Mxt107/usr/share/fonts/misc/
,这是windows上的临时目录啊。那我要增加一个font path的话,不能加到临时目录下,每次重启xserver都是把临时目录清空,我的字体就会丢失。所以可以设置到我的emacs字体的目录。
字体目录除了点阵字体(pcf格式,不知道xserver是否支持其他格式,true type报错)需要 fonts.dir
和 fonts.alias(不一定需要,有别名的话写配置比较方便)
文件,否则 xset fp 会报错。
- 中英文等宽字体 找不到ubuntu mono点阵字体,如果用点阵字体,需要转换一下,先用文泉驿中文字体顶替一下,文泉驿字体不是中英文等宽的,还需要找个等宽的英文字体,mobaxterm自带的等宽字体不如ubuntu mono和consolas好看。
# 查看xserver中支持的字体和字体对应字符集 [albert@master ~]$ xlsfonts [albert@master ~]$ xset q ... Font Path: C:\Users\Albert\AppData\Local\Temp\Mxt107/usr/share/fonts/misc/,built-ins ...
增加font path后需要执行 xset fp rehash
,使服务器重读当前字体路径下的字体数据库。通常只在运行 mkfontdir
重新创建字体数据库后添加新字体到字体目录时才会使用。
# for xorg = mobaX xset +fp "E:\backup\emacs_font\wqy-bitmapfont-pcf-0.9.9-0\wqy-bitmapfont" && xset fp rehash [albert@master ~]$ xset q Font Path: E:/backup/emacs_font/ubuntu-font-family-0.83/,C:\Users\Albert\AppData\Local\Temp\Mxt107/usr/share/fonts/misc/,built-ins [albert@master ~]$ xset fp rehash
- fonts.alias
是否存在都不影响,mobaXterm自带的是有fonts.alias的,在emacs中执行
M-x menu-set-font
menu选择时看着会比较短。
wqy-unibit等宽点阵字体
文泉驿的等宽点阵字体很漂亮。
xset +fp "E:\backup\emacs_font\wqy\wqy-unibit" && xset q && xset fp rehash && xlsfonts |grep wq
consolas with yahei ttf
xset +fp "E:\backup\emacs_font\Consolas-with-Yahei" && xset q && xset fp rehash && xlsfonts |grep Yahei
输入法
在x window中想把emacs真的用好了,实在是太难了。输入法就是个问题。在没安装gnome等桌面的情况下,不知道直接装sougou输入法是不是能成功。
可以在emacs中用 pyim
。pyim在github上很活跃,安装简单。就是用的感觉有点奇怪,而且内存占用很大。
遗留了几个问题:
- 中英文切换 如何在输入法中想其他输入法一下按 shift 快速切换输入法,总是按 C-\ 切换输入法太麻烦了。M-j效果很好
- 字库 是否考虑下一个大的字库。自带的字库有点小。
- 内存占用很高 小字库已经用了快100MB的内存,虚机的内存紧张。
键盘
mobaXterm的xserver坑最深的就是键盘。我的要求很简单,就是把 <esc>
还给我,在x window中的emacs,esc键的行为非常奇怪,按下去一点反应都没有,只有先按 alt 键,再按esc才行。按2个键,这是不能忍受的。
Ctrl-[ 可以输入 Escape ,就是不习惯,不好用。
用xmodmap改变键盘映射
执行 xev
命令,发现先按 ALT ,再按 esc 的keycode = 9, 再按个字母键后按 esc 的keycode都是8,而且会不停的显示log,就像键 lock住了,按下去一直不弹起来一样。
没改之前的:
#显示x11中的keymap xmodmap -pm xmodmap -e "keycode 8 =" [albert@master ~]$ xmodmap -pke keycode 8 = Mode_switch NoSymbol Mode_switch keycode 9 = Escape NoSymbol Escape
ALT_R 基本是不用的,把escape改到alt_r上。不爽的是win和linux x window的按键操作不一致,非常不舒服,但是可以将就着用。
vi ~/.Xmodmap keycode 8 = keycode 113 = Escape # 修改key mapping后,使之生效 xmodmap ~/.Xmodmap
用xkb改变键盘映射
这东西是出了名的难用。坑了我一个下午和整个晚上,还是搞不定。为什么keycode是从8开始的,而且8、9都对应esc键,和键盘的layout有关系吗?
pc 104和 pc105的layout是不是应该用pc104的layout
剪切板 clipboard
是字符集还是mobaxterm的clipborad的问题,从win往linux上粘贴时,只能paste进去一堆0,这个问题解决了emacs的gui就基本就可以用了。
好像不需要配置,按鼠标中键粘贴即可。为什么呢?我安装了epel源后,装上了xsel和xclip?
但是Shift+Ins paste到x11的emacs里面是一堆的0。先凑合着用吧。
https://www.emacswiki.org/emacs/CopyAndPaste#toc5 https://stackoverflow.com/questions/3216081/integrate-emacs-copy-paste-with-system-copy-paste https://stackoverflow.com/questions/64360/how-to-copy-text-from-emacs-to-another-application-on-linux
https://stackoverflow.com/questions/9985316/how-to-paste-to-emacs-from-clipboard-on-osx
(global-set-key [(shift insert)] 'x-insert-selection)
Try using the M-x clipboard-yank command. If you want to copy text to the clipboard you have to M-x clipboard-kill-region. This works on Linux and Windows, I guess on Mac it's the same.
在evil中无效啊。
(global-set-key [(shift insert)] 'clipboard-yank)
(global-set-key (kbd "S-<insert>") 'clipboard-yank)
https://github.com/wbolster/evil-colemak-basics 调整evil的key binding,可以参考一下。
;(if (eq system-type 'gnu/linux) ; (progn ; (setq x-select-enable-clipboard t) ; (defun xsel-cut-function (text &optional push) ; (with-temp-buffer ; (insert text) ; (call-process-region (point-min) (point-max) "xsel" nil 0 nil "--clipboard" "--input"))) ; (defun xsel-paste-function() ; (let ((xsel-output (shell-command-to-string "xsel --clipboard --output"))) ; (unless (string= (car kill-ring) xsel-output) ; xsel-output ))) ; (setq interprogram-cut-function 'xsel-cut-function) ; (setq interprogram-paste-function 'xsel-paste-function)))
速度
感觉mobaXterm的xserver中的emacs在打开配置文件时有点卡,可以试试修改渲染方式为 direct draw ? 打开opengl的硬件加速后还是卡,我的集显有问题?需要用nv的独显?2D显示用不了nv的独显进行加速。