开发工具 Emacs 24 使用 GTK+ 经常会死机 (你们是怎么解决的?)

zw963 · 2012年09月09日 · 最后由 zw963 回复于 2013年07月23日 · 10921 次阅读

正如 Emacs 声称的那样:


Warning: due to a long standing Gtk+ bug
http://bugzilla.gnome.org/show_bug.cgi?id=85715
Emacs might crash when run in daemon mode and the X11 connection is unexpectedly lost.
Using an Emacs configured with --with-x-toolkit=lucid does not have this problem.
("emacs")

时不时 (也不经常,好几天出现一次) 会定格,快捷键无效,新开 emacsclient 照旧,除非重启 Emacs server. 倒也没什么大不了的,在 Emacs 23 也有这个问题。

我就是想知道,大家编译时,除了选择 GTK+ , 在 Linux 下,大家都在用哪一个??

@skandhas, @dotian, @yedingding, @Guest, @willmouse , @tudou, @dotnil @nouse, @sectic, @ugoa, @nuclearkitten @bin @ranmocy @reus @lilu @liuhui998 @willmouse @franky_xhl @hbin @zealinux @Asakawa @shouya

BTW: 我记得我试过 lucid,, 貌似问题更多 ?

Emacs 支持参数如下:

--with-x-toolkit=KIT    use an X toolkit (KIT one of: yes or gtk, gtk3,
                        lucid or athena, motif, no)

顺便问 @huacnlee, 一个帖子发送消息最大限制是多大?

试试其他两个吧,不行就用--without-x 把

--with-x-toolkit=lucid 有用吗?估计也没戏?

我个人是比较支持使用没有 GUI 的 emacs 和 vim 的,我都是在 terminal 下用 emacs。

#2 楼 @reus #3 楼 @willmouse

小小鄙视一下楼上两位大神,用 Emacs 已经够有自虐倾向了,还不用 GUI ...

#4 楼 @zw963 没必要用带 GUI 的啊,直接在终端下用挺好的,带 GUI 的有啥优势?

#4 楼 @zw963 用 emacs 虐的话我就不会用了,我的键绑定都很 ergonomic。而且终端里运行和 X 里运行都是一个样子

#6 楼 @reus #5 楼 @willmouse

Terminal 下也没什么不妥,就是有些快捷键 (个人特殊的), 在终端下面,好像有具体的绑定,无法单独使用。

另外,习惯问题吧,我觉得使用 GUI 可以更好的发挥 deamon 的效果,这点应该没有异议吧?

你们使用 Terminal, 习惯上应该是 大部分 Emacs 操作 都在同一个 Emacs 界面 下面运行的吧?要大量的借助 ido, helm 之类的软件,切换文件什么的。我是经常运行一大堆 Emacs GUI (frame), 然后 Alt + Tab 切换 ( Windows 过来的习惯 ), 当然 ido 也用。

总之我觉得在 Terminal 下使用 Emacs, 纯粹发挥不出来 Emacs Server 的好处,和在 Windows 下使用 Emacs 基本上没有啥差别,要开一个新的 Emacs 界面,还得首先开一个新的 Terminal, 是这样的吧?

我估计你们都是 Emacs 老用户吧,应该在 Emacs 22 的时候就在用了 (Emacs 22 不支持 daemon) , 所以会有现在的习惯,不知道我猜测的对吗?

@reus @willmouse

然 Emacs 个人使用方式非常多样化,不过咱们大家还是应该多多沟通呀,上次其他帖子中 @reus 的提示,帮我解决了 shell-mode 下的几个大问题。

#7 楼 @zw963 Emacs Server 在终端下没啥问题啊?有啥问题?

操作多个文件要不然用 Buffer,要不然拆窗口。

终端我都是只开一个的,用 tiling window,现在用的 http://www.brain-dump.org/projects/dvtm/

dvtm 一般分 2-3 个,有时候也在多个窗口中同时运行 emacs

#7 楼 @zw963 切换文件我用 tabbar,沿用 vim 里的习惯 emacs daemon 在用,因为冷启动很慢 打开一个新的 emacs client,按一下快捷键就可以了,配置了 wm 的快捷键 我是上个月才从 vim 转到 emacs 的其实

#9 楼 @willmouse

没问题呀。可是无法完全发挥 Server 的优势,如果不是 Terminal, 也就用不到 dvtm 之类的东西了。

不过只开一个终端也有好处,就是不太乱,像我,有时候在一个桌面下开 EmacsClient 太多,头就晕了。

#10 楼 @reus 我最近才开始用 tabbar, 不过只是在 shell-mode 下 才开启。换多个 shell 方便一些。

对了,问下你们,在 X-windows 下,用一个快捷键,将当前打开的所有 Windows , 上下对齐重排,或者左右重排,类似的软件叫什么。最好是独立于 具体的 Windows 管理器,就像 Xbindkeys 一样,不管 KDE, 还是 Gnome, 又或者 XFCE, 都可以用。

#11 楼 @zw963 只知道 awesome 等 tiling window wm 默认的功能是如此,X11 下面有什么具体软件能这么做我不太清楚,可以去 linuxtoy 查查

我的 emacs24 在 GTK+ 倒没什么问题,只是-nw 之后有时候会莫名其妙挂起。

#12 楼 @willmouse

貌似你说的那个 awesome 应该就是,我曾经想安装,不过貌似 Slackware 不满足的依赖太多了... 我不想因为这个小工具,再装一堆东西,呵呵,所以没装。

#14 楼 @zw963 awesome 的依赖是很多,可以试下这个 http://i3wm.org/,或者这个 http://xmonad.org/

#15 楼 @reus

我去看下... 太谢谢啦。

p.s. 为什么你们知道这么多资源...

#16 楼 @zw963 tiling wm 这个东西好像是从 linuxtoy 里知道的,后来又 google 出很多来

#14 楼 @zw963 awesome 是个完整的 tiling wm 而不是你期望的独立于 wm 的小工具。

http://dwm.suckless.org/ 这个应该是依赖最少的 tiling wm 了吧...

#18 楼 @reus 个人表示,只要找对E文的关键字, Google 结果就没有压力...

有时候,找关键字不是那么容易呀。毕竟又不是中文,就算中文,还不一定找到呢。

#19 楼 @doitian 好一阵子都常见你上线,貌似最近有空呀?

正好向几位请教一个还算蛮棘手的问题:@willmouse @doitian @reus

现在我 C-w 快捷键,是复制内容到 secondary-region-ring,(就是和 kill-ring 一样的另一个 ring) 这其中使用了一个插件叫做:second-sel.el 来实现的一个 ring, 之所以这样绑定,是因为:C-w 之后,可能还会有 backward-kill-word, kill-line 之类的操作,这个时候,我可以不受干扰的通过一个自定义快捷键 C-M-y, 来直接粘帖 secondary-region 中的内容。

现在问题是:secondary-region-ring, 只要一退出 buffer, 再重新打开,ring 里面的内容就没有了。有时候,我希望复制一段内容到 second-region-ring 当中,哪怕我退出 buffer, 但是在稍后的其他新打开的 buffer 当中,都可以被 反复的 通过 C-M-y 粘帖。

反正就这么个功能,正常的删除,粘帖,就用 kill-ring, 但是最好有一个 其他的 (全局的)ring, 专门使用 C-M-y 来粘帖, 目前我用的这个 second-sel.el 中,这个 secondary-region-ring 不是全局的。只要一退出 buffer, 内容就消失了。

我要解决的问题是:

  1. 如果我希望更改 second-sel.el , 将那个 local ring 改为 global ring , 思路该如何解决?(最好谁有空帮我改下也行,如果能实现的话)

  2. 类似需求你们是如何处理的?是否有其他插件?或者自己写的插件?我想遇到一个 需要反复粘帖的情形,没有人愿意没完没了的 M-y 去吧?

#20 楼 @5long

写了,等会儿我挨个儿试一遍,呵呵。

我其实并不是要一个完整的 Windows Manager, 我现在用 XFCE 挺好,我其实只是想有个办法,让当前窗口 左右重排,上下重排,来个预览啥的。

没有遇到这个问题,因为我没有用 daemon mode,一般 Emacs 开在那就不会关了;second-region-ring 同样也没有用过,如果需要这些功能,可以先向组件作者反馈,如果没答复,就只好自己看 .el 试试加上这个功能啦;反复粘贴可以使用 C-u [num] M-y 来搞定吧,跟 Vim 的 normal mode 里按 [num] p 是一样的

#21 楼 @zw963 有的名字不好很难搜的 比如 awesome 比如 path

second-sel 没有声明任何 local varialbles 啊

@zw963 我一直没明白 emacs server 的作用是什么,可否给我讲解一下?

#24 楼 @doitian

嘿,我在 21 楼 说的问题,不知道描述清楚没有?

不知道能否通过改 second-sel 源码实现一个全局的 secondary-kill-ring ?

代码请看: http://emacswiki.org/emacs/second-sel.el

#26 楼 @ugoa

你如果在 Window 下用,Emacs Server 是无效的。

如果在 Linux 或 Mac 下,Emacs Server 就是先启动一个 Emacs Deamon, 然后稍后运行 Emacs 不是通过 Emacs 这个命令了,因为 Emacs 作为一个 Deamon 已经被启动了,只需要运行任意多个 emacsclient 连接到那个 Emacs server 就可以启动一个 Emacs 窗口,最大的优势是:秒开, 速度可比 Vim 快多了。

Emacs23 之前最让人诟病的一个原因是 Emacs 启动慢,不过现在变成优点了. 前面讲的不准确,之前这个最大的缺点在 Emacs23 之后就不再存在了,相反,因为 daemon 的缘故,启动速度非常快,反倒成为 Emacs 的优点了

#23 楼 @dotnil

这作者联系不上,汗~~

#29 楼 @zw963 为什么变成优点呀?

#29 楼 @zw963 哦。我的是用 daemon,好像有问题,有部分配置没有加载。就没有使用 daemon,不过反正启动以后,就不关。

什么发行版?据我所知 Fedora 爱死机

#22 楼 @zw963 唉,Awesome 一旦拥有别无所求⋯⋯我当年用 Arch 的时候就是为了尝试 Awesome。如果 OSX 有办法自动 tiling windows 我就再也不会尝试 Linux 了⋯⋯ 现在只有还算可以的半自动替代方案。

#24 楼 @doitian 搜索这种大众名字的可以加 Linux,X11 等辅助关键词

#33 楼 @tudou 使用 server-daemon 记得要将 frame 相关的代码放到 after-make-frame-functions 的 hook 中去。很多命令都是对当前使用的 frame 操作的,而 init 代码只会在启动的时候执行,加到 hook 中去才能在新建 frame 的时候对新 frame 生效。 你可以参考我的配置 https://github.com/ranmocy/emacs_config/blob/master/customizations/ui/set-x.el

#35 楼 @ranmocy

我试了好多,最后才明白过来,原来 awesome 之类的东西根本就是用来取代其他 Windows Manager 的。所以我还是觉得算了,就用 XFCE4 , 虽然 Thunar 稍显简单,就这么凑合用吧。

after-make-frame-functions 我加了好多东西,包括 键位映射, 设置字体, 启动窗口最大化等等。

#36 楼 @zw963 键位映射是指什么?是针对 frame 操作的么? 这个 hook 东西多了,降低 frame 的开启速度(当然不怎么明显,但是增加冗余计算不环保)。

#37 楼 @ranmocy

初衷,其实仅仅是为了保证所有的快键在所有的 frame 下一致。(包括在多个不同的文本 Terminal 下)

就是一个键盘 map 的映射,例如:


(define-key key-translation-map [(meta o)] [(super o)])

所有针对 meta o 的 按键序列,都转移到 super o, 然后,在所有模式下,都可以保证按下 meta o, 是我所需的那个快捷键。

#38 楼 @zw963 可是 define-key 是全局操作呀,不用每次新建 frame 都运行一下。

#39 楼 @ranmocy

我早忘了为什么这样,但是一定是必须的。

可能是最初我用 Emacs, 实在文本 Terminal 下,就是 Ctrl-Alt-1, Ctrl-Alt-2 下面,不这样搞一下,切换到一个新的下面,又恢复成原样了。

#40 楼 @zw963 表示不能理解,不知道能不能重现。因为键盘输入首先被 Terminal 捕获,然后如果没有触发它的快捷键列表就传递给 Emacs,这个时候 Emacs 才能处理。除非 Emacs 在新建 frame 的时候又自己重定义了键位。你看下他俩里面都有啥呗? after-make-console-frame-hooks after-make-window-system-frame-hooks

#41 楼 @ranmocy

你试试就知道了,更改快捷键,在 tty1 启动,然后,到 tty2, 新开一个 emacsclient, 看看原来的键位是不是仍旧有效?当时我试了半天这是唯一的解法。虽然现在已经不在 tty1 下面玩了,不过也懒得删除。几十个快捷键映射,也不会搞得太慢,可以接受呀。基本上秒开。

#35 楼 @ranmocy 多谢,又学到了一手。

#42 楼 @zw963 好吧,其实是有洁癖的缘故。我手头上也没有 Linux 可以测试。不过我之前使用 Linux 的时候是将 emacs --daemon 放到 init.d 的启动项中去,然后在 X 下启动 emacsclient -c,不知道跟不同 tty 原理一样否,反正我当时用的挺好的。

#44 楼 @ranmocy

在文本 Terminal 下,参数不同,我用的 -nw.

-nw, -t, --tty      Open a new Emacs frame on the current terminal

我刚刚试了下,取消了那个 hook, 快键映射照样能用,不过字体恢复成默认了。你使用 Emacs, 不需要在 hook 里面设定字体吗?

说实在的,过去好久了,我也不记得当时为什么这样。呵呵。

#45 楼 @zw963 当然要改字体了,不然中文显示一塌糊涂,字体是和 frame 相关的。 其实我现在都没找到自己心宜的字体,都多少有些问题。

你可以看看我的有关 frame 的配置文件。 https://github.com/ranmocy/emacs_config/blob/master/customizations/ui/set-x.el

我当时为了让 Emacs 随系统自启动,同时支持 Terminal 和 X 两种样式的一致,特意将 menu-bar-mode 等移到 hook 中去了,不然貌似 Terminal 下会报错。

#46 楼 @ranmocy

我见你文件注释中有写 Inconsolata, 你试过这个英文字体吗?很不错呀。

至于那个微米黑, 我觉得差不多是最好看的中文字体了吧。我觉得至少比黑体看着舒服。你可以试试,不过我很奇怪你用 等宽中文字体. 如果你用 org-mode, 经常用文本表格(我记笔记大量使用), 你会发现,英文等宽字体 + 中文等宽字体 根本没办法对齐的。你有试过用 org-mode 画一个文本表格吗?

#47 楼 @zw963 字号要调整 我英文用 pixelsize 21 的话,中文得用 22 的

#48 楼 @doitian

哦。原来如此,我还真没有试过调整不同的大小。

不过我用 15 号的英文 Inconsolata, 中文字体 (文泉驿微米黑) 就没有设定大小,用起来表格可以对齐,效果很好。

只要中文不是等宽字体就行。

这里有中英等宽的补丁,http://forum.ubuntu.org.cn/viewtopic.php?f=68&t=370220。我在 Emacs 24.1 上试过了,Org mode 表格对齐完全没问题。

#50 楼 @fangwen

谢了,Emacs 资源 真是丰富呀。

#47 楼 @zw963 #48 楼 @doitian

我觉得完美的字体是这样的:

  1. 英文等宽
  2. 中文等宽,且刚好等于英文的两倍
  3. 编程符号区别度大,比如 quote 和 单引号,0 和 o 之类的。
  4. 字体清晰易于阅读什么的应该就不用提了,这是一个能用的字体必须的。
  5. 不是点阵字体,显示器 dpi 在这呢

怎么对中文和英文分别设置字体?那些符号在编程和平时文本下表现其实也应该区分开来才是,不知道怎么设置?

要是一个字体的话,我用过一个网友自制的 YaheiMono 满足前两条,但是第三条不行。 org-mode 我就没强求完全对齐了,反正用的次数也不是很多。

#52 楼 @ranmocy

我连 Text-mode 都设定快捷键,直接使用 orgtbl-mode 画表格。如果通过 C-c 命令无法自动对齐表格,对我来说是不可忍受的。

英文字体常规设法,中文字体,你可以参考这段代码,我放到一个函数里,可以在 frame hook 被调用。

(defun initialize-font (&optional frame)
  (set-fontset-font "fontset-default" 'unicode'("WenQuanYi Micro Hei Light")) ;Linux下字体设置
  (when (equal window-system 'w32)
    (set-fontset-font "fontset-default" 'unicode'("文泉驿微米黑"))))

坑爹,一个中文,一个英文是必需的。因为 Linux 字体名称识别为英文,Windows 下识别为英文。

#52 楼 @ranmocy

(set-frame-font "Mono:pixelsize=21")
(set-fontset-font "fontset-default"  'chinese-gbk "Mono:pixelsize=22")

#53 楼 @zw963 用 cl 高亮 lisp 代码

#55 楼 @doitian

嗨,你这个回复啥意思?

#56 楼 @zw963

```cl
(highlight 'lisp)
```

#57 楼 @doitian

哈哈。我一直以为你说的是 Emacs 里面常见的那个 (require 'cl).

我试试。

(highlight 'lisp)

#57 楼 @doitian

再问你个问题,你在 PS1 中 反白显示 的代码是如何处理的?

我修改 PS1 的初衷,还真就是 输出的时候一大堆,找不到最后的命令提示符在那里。

#59 楼 @zw963 ansi code +10 就是设置背景色了

37 是白色前景,47 就是白色背景(^[是 ESC,终端用 C-v ESC 输入,Emacs 用 C-q ESC 输入

echo -e '^[[47m^[[34mtest^[[00m'

#60 楼 @doitian

呵呵。太谢谢啦~

不过,我的系统 ESC 和 ^[ 两个键 是单独的两个键。

上面的代码得写成:

echo -e '\e[47m\e[34mtest\e[00m'

#60 楼 @doitian

反白挺强大呀。我这才算达到我所期望的目的。呵呵。

抛弃 神的编辑吧,问题迎刃而解!

#54 楼 @doitian 好东西,学习了。

GTK+3 和 lucid 都用过很长时间,只出现过一个很小的问题

#65 楼 @xuefuqiao

自从使用了 Slackware 14 版本之后,Emacs 24.2 貌似很久不死机了。 可能是之前的 13.37 GTK 的图形库存在一些 Bug 吧。事实上不仅仅是 Emacs, 我在 Linux 下的另一个软件,beyond compare 3 原来也存在问题, 后来覆盖了几个新的 GTK 库文件,就好了。

貌似社区新来了位 Emacser, 多多讨论,多多分享,哈哈。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号