LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: pluskid

加速你的Emacs!

[复制链接]
 楼主| 发表于 2006-5-14 21:01:16 | 显示全部楼层
Post by seamonkey
嗯 ,就和urxvt的c/s模式一样,通过unix domain socket通信,如果server崩溃了,所有client window也就终结了,这是一个不利之处。

所以把 server 隐藏起来了,不过这个东西目前还处于开发阶段,由于 bug 而导致崩溃的问题还是有可能出现的,幸好 Emacs 自动备份等功能也是做得很好的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-8-19 17:49:58 | 显示全部楼层
Post by pluskid
恩,加进 .Xresources 之后确实没有崩溃了,不过不能使用 X 对于我来说好像是很不方便的。把代码注释掉之后也好了,不过这确实不是解决办法,你的英语好,你去报告到邮件列表吧

看来作者对于这个问题是不是不好 Reproduce ,好像邮件列表里面的邮件也没
有人回复。不过现在不用 emacs multi-tty 也可以做到几乎相同的功能了,是
配合 Sawfish 使用的,不过我想只要是有类似于 Sawfish 里面的那个
jump-or-exec 的扩展并且可以通过命令行进行控制的窗口管理器都好轻松实现
这个功能吧。我在 Sawfish 里面是这样做的:

首先配置 Sawfish 的 jump-or-exec :


  1. (defun jump-or-exec-emacs ()
  2.   (interactive)
  3.   (jump-or-exec "emacs@"                ; Emacs's title
  4.                 (lambda ()              ; When Emacs isn't running
  5.                   (system "emacs &"))
  6.                 (lambda (wind)          ; When already focused
  7.                   (display-window wind))))

  8. (bind-keys global-keymap
  9.            "H-e" 'jump-or-exec-emacs)
复制代码


然后写一个脚本来调用 emacsclient :


  1. #!/bin/sh

  2. # first jump-or-exec to emacs
  3. sawfish-client -c jump-or-exec-emacs

  4. # then call emacsclient
  5. emacsclient "$@"
复制代码


不过这样并不能满足要求,因为 Emacs 的启动需要几秒钟的时间,如果事
先没有启动 Emacs ,就调用 e ,则 sawfis-client -c
jump-or-exec-emacs 立即返回,这个时候 Emacs 还没有完全启动起来并执
行 (server-start) ,所以 emacsclient 这个时候会抱怨找不到 server
。没关系,我们修改一下代码,如果 Emacs 没有启动起来,就 sleep 几
秒,在 sawfish 里面 sleep 当然不好,所以将作为一个返回值传回脚本
,并由脚本来 sleep 。下面是修改后的 jump-or-exec-emacs 函数:


  1. (defun jump-or-exec-emacs ()
  2.   (interactive)
  3.   (jump-or-exec "emacs@"                ; Emacs's title
  4.                 (lambda ()              ; When Emacs isn't running
  5.                   (system "emacs &")
  6.                   "sleep 3")
  7.                 (lambda (wind)          ; When already focused
  8.                   (display-window wind))))
复制代码


并将启动脚本改为:


  1. #!/bin/bash

  2. # first jump-or-exec to emacs
  3. cmd=`sawfish-client -e '(jump-or-exec-emacs)'`

  4. if [ "()" != "$cmd" ]
  5. then
  6.     # () stands for nil in lisp, if it is not (), then
  7.     # it should be the cmd returned by jump-or-exec-emacs
  8.     # to be invoked. See ~/.sawfishrc for more information
  9.     #
  10.     # $cmd
  11.     # simply $cmd won't work, because $cmd is "some cmd"
  12.     # with the quote mark, so I have to filter the quote
  13.     # mark first
  14.     cmd=${cmd%"}
  15.     cmd=${cmd#"}
  16.     $cmd
  17. fi

  18. # if there's argument then call emacsclient
  19. if [ $# -gt 0 ]
  20. then
  21.     emacsclient "$@"
  22. fi
复制代码


其中, jump-or-exec-emacs 里面的秒数可以根据自己 Emacs 的启动速度
来设定,这样是不是非常方便了?然后把这个脚本命名为 e ,再把 EDITOR 变
量设置为 e 就OK啦!
回复 支持 反对

使用道具 举报

发表于 2006-8-19 22:30:15 | 显示全部楼层
[color="Magenta"]
想问一下pluskid兄,我在NTEMACS 21.3中,
M-x customize-group RET server
页中,发现有server的一些配置信息,不知道配置好后是否能够快速启动NTEMACS 21.3呢?那NTEMACS 23.0.*中的配置能否实现呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-8-20 00:31:08 | 显示全部楼层
Post by mylynx
[color="Magenta"]
想问一下pluskid兄,我在NTEMACS 21.3中,
M-x customize-group RET server
页中,发现有server的一些配置信息,不知道配置好后是否能够快速启动NTEMACS 21.3呢?那NTEMACS 23.0.*中的配置能否实现呢?
你好,mylynx ,不好意思,因为我没有用 Windows ,前面你给我看的那个 gnuserv 我也一直没有仔细看过。今天我试了一下,是可以的。

首先,到你给的那个网站去下载 gnuserv : http://www.wyrdrune.com/index.html?gnuserv.html~main

解压之后放到某个目录里面,例如: C:/gnuserv/gnuserv/
(我这里用两个 gnuserv 目录是因为我还下载了那个 gnuserv_beta 版本,据说是可以自动安装的,但是好像程序没有编译出来。)

然后在你的 .emacs 里面这样配置:
  1. (add-to-list 'load-path
  2.                   "C:/gnuserv/gnuserv/")
  3. (require 'gnuserv)
  4. ;; 这个是必要的,要不然会找不到 gunserv.exe
  5. (add-to-list 'exec-path
  6.                   "C:/gnuserv/gnuserv/Release/")
  7. (gnuserv-start)
复制代码

这样就可以了。之后你可以使用 gnuclient 或者 gnuclientw 来打开文件。gnuclient 是命令行程序,而 gnuclientw 是 windows 程序,gnuclientw 默认并不等待你编辑完文件,除非你加 -w 选项(我也不清楚,我是看到 beta 里面的文档是这样说的,也许是beta版才加入这个选项的)。用 gnuclient 的时候编辑完用 C-x # 来关闭并告知 gnuclient 文件已经编辑完。 gnuclientw 启动的可以用 C-x 5 0 来关闭窗口。另外,如果首先没有启动 emacs 的话,gnuclient 会试图先去启动它。但是在我这里会有错误,说找不到 runemacs.exe ,我看到 beta 版的说明里面讲到会有一个注册表项来控制这个,但也没有讲如何控制,文档好像实在是不太详细。
不过我也找到了一个解决办法:把 gnuclient.exe 等几个文件全部拷贝到 Emacs 的 bin 目录下,也就是和 runemacs.exe emacs.exe 等几个文件在同一个目录下面(同时也要修改 .emacs 里面的exec-path的目录配置)。但是我开始试的时候有问题,老是出现 Windows Socket 错误 Socket Error 10053 - An established connection was aborted by the software in your host machine. 但是后来我又试了一次,就可以了,我也不知道是怎么回事。

总之,这样配置好之后,你就可以直接用 gnuclient.exe 来打开文件,如果没有启动 Emacs 他会先去启动,如果事先已经有 Emacs 在运行,他会直接连接过去,这样速度就非常快了。

ps: 这个 gnuserv 好像已经是 emacs-multi-tty 的功能了,呵呵。

btw: 我是在 emacs 23 上测试的,我不知道是不是就是ntemacs 23,我用的这个是herberteuler给我的编译好的exe。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表