2019年01月16日

emacs 和 X11

[2019-08-09 Fri 15:57] 几个月前,在尝试不同的x server时,发现 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左右,这个差距太明显。

字符界面的问题:

  1. <esc>键按下去后有时候感觉响应比较慢,后续的按键容易出错
  2. gdb debug 时能看的内容有点少。字符都是一个大小,显示不如gui那么好看。
  3. 显示行号后,copy时总是把行号给copy下来。

用yum安装X11相关包

我的emacs 25.3是用源代码编译安装的。centos默认只有字符界面,需要安装X11相关的rpm包,尤其是开发包才能重新编译emacs,让emacs支持gui。

  1. 安装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来做。

  2. 编译

    在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.dirfonts.alias(不一定需要,有别名的话写配置比较方便) 文件,否则 xset fp 会报错。

# 查看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

wqy-unibit等宽点阵字体 [2019-01-17 Thu 22:40]

文泉驿的等宽点阵字体很漂亮。

xset +fp "E:\backup\emacs_font\wqy\wqy-unibit" && xset q && xset fp rehash && xlsfonts |grep wq

consolas with yahei ttf [2019-01-30 Wed 12:45]

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上很活跃,安装简单。就是用的感觉有点奇怪,而且内存占用很大。


遗留了几个问题:

  1. 中英文切换 如何在输入法中想其他输入法一下按 shift 快速切换输入法,总是按 C-\ 切换输入法太麻烦了。M-j效果很好
  2. 字库 是否考虑下一个大的字库。自带的字库有点小。
  3. 内存占用很高 小字库已经用了快100MB的内存,虚机的内存紧张。

键盘

mobaXterm的xserver坑最深的就是键盘。我的要求很简单,就是把 <esc> 还给我,在x window中的emacs,esc键的行为非常奇怪,按下去一点反应都没有,只有先按 alt 键,再按esc才行。按2个键,这是不能忍受的。

[2019-02-10 Sun 15:59] 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就基本就可以用了。

[2019-01-30 Wed 10:40] 好像不需要配置,按鼠标中键粘贴即可。为什么呢?我安装了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的独显进行加速。