本页主题: 【老帖】emacs的日常生活 -- for emacs rookies 打印 | 加为IE收藏 | 复制链接 | 收藏主题 | 上一主题 | 下一主题

galilette
级别: 嘉宾


精华: 30
发帖: 2139
威望: 1382 点
金钱: 0 静电币
支持度: 0 点
在线时间:3012(小时)
注册时间:2002-05-01
最后登录:2019-03-12

 【老帖】emacs的日常生活 -- for emacs rookies

发信人: hhuu (归来,从某个地方), 信区: Linux    
标 题: Emacs的日常生活 1
发信站: BBS 水木清华站 (Thu May 1 20:29:30 2003), 转信


  我开始在键盘上敲这些字的时候,感觉很是诡异。诡异的原因就在我
面对的这个编辑器上。每次用它的时候总有一些说不出来的奇怪感觉,可
能是太多疑了吧。

  有很多很多现成的文章介绍Emacs的。大致有那么两种:一种介绍说,
Emacs是一个无比强大的文本编辑器,但是不管谁用了一下都会觉得,这
个文本编辑器真是难用了,所有的命令都是组合出来的怪物(Emacs的
info里面说,用Emacs多的了用户会希望终端的输入设备加上两个脚踏板);
另一种介绍说Emacs是一个无比强大的IDE,但是对于象我们这样见过VS之
类市面的小孩来说,这个无比强大真是可望不可及阿。

  但是我最后还是停留在Emacs旁边不愿意走开。这也是为什么我感觉
诡异的原因之一。

  以下介绍的,纯粹是我自己用Emacs过日子的一点体会。我假设看这
片东西的同学知道什么是.emacs文件,知道怎么进入Emacs,知道怎么退
出Emacs......如果这些你都不会,我的建议还是先看Emacs的帮助。我还
假设所有人都有一个GUI终端,如果你是坚持用console的同学,可能会碰
上一些额外的问题,这显然不是Emacs的责任(当然更不是我的)。

*0   给你的Emacs装上翅膀

  绝大多数从console下过来的人都有这样的习惯,就是在X底下开一个
终端,在命令行环境里逛目录,看到不顺眼的文件就vi之。不用说emacs
这几个字就比vi长,emacs的启动速度也比vi慢不是一点两点;简单的比
较两者的执行文件大小,vi大约在1M左右,而Emacs则保持在5M上下。这
一直以来是我不愿意离开vi的唯一原因。

  当然,这种状况是可以改变的。有一个额外的包,gnuserv可以改变
这种情况(这也经常让人觉得很奇怪,为什么gnuserv这么重要的东西竟
然没有直接放到Emacs发行版里面去,当然这个是额外的额外疑问了)。

  gnuserv的安装并不复杂,无非是将几个可执行文件放到%PAHT%变量
提及的地方,然后将gnuserv.el放到site-lisp目录中去,最后在.emacs
文件中加入两句配置:

(require 'gnuserv)
(gnuserv-start)

  这是Emacs安装插件的标准做法。以下还有一些代码,是从David
Vanderschel的帖子上抄来的,偶一般将其中的dv-close-client-frame绑
定到C-\上,估计也会有人喜欢绑定到C-f4上。大致如此。

(defvar dv-initial-frame (car (frame-list)) "Holds initial frame.")

(defun dv-focus-frame (frame) "pop to top and give focus"
(make-frame-visible frame)
(raise-frame frame)
(select-frame frame)
(w32-focus-frame frame))

(defun dv-focus-initial-frame () "Make the initial frame visible"
(dv-focus-frame dv-initial-frame))

(defvar dv-mail-frames () "Frames created by dv-do-mailto")

(defun dv-do-mailto (arg) "For handling mailto URLs via gnudoit"
(dv-focus-frame (make-frame))
(message-mail (substring arg 7))
(delete-other-windows)
(setq dv-mail-frames (cons (selected-frame) dv-mail-frames)))

(defun dv-close-client-frame () "Close frame, kill client buffer."
(interactive)
(if (or (not (member (selected-frame) dv-mail-frames))
      (and (> (length (buffer-name)) 4)
          (equal (substring (buffer-name) 0 5) "*mail")
          (not (buffer-modified-p))))
    (kill-buffer (current-buffer)))
(setq dv-mail-frames (delete (selected-frame) dv-mail-frames))
(if (equal (selected-frame) dv-initial-frame)
    (iconify-frame)
  (delete-frame)))


(defun dv-paste-to-temp () "Load clipboard in a temp buffer"
(dv-focus-frame (make-frame))
(switch-to-buffer (generate-new-buffer "temp"))
(clipboard-yank))

  再如果,你和我一样是个win32底下的懒人,那么估计你还需要这个。

(defun w32-restore-frame (&optional arg)
  "Restore a minimized frame"
  (interactive)
  (w32-send-sys-command 61728 arg))
(defun w32-maximize-frame (&optional arg)
  "Maximize the current frame"
  (interactive)
  (w32-send-sys-command 61488 arg))
(w32-maximize-frame)
(add-hook 'after-make-frame-functions 'w32-maximize-frame)

  这可以使得每一个新打开的frame都自动最大化。

  走得更远一点,我们可以创建一个gc.sh(或者是gc.cmd),酱紫的
话,在输入命令的字符数上,Emacs也可以不输给Vi了。


--

听说现在大陆地网络论坛是礼乐崩坏,只怕还不止,连逻辑都找不着了。


※ 来源:·BBS 水木清华站 smth.org·[FROM: 211.157.204.133]
Posted: 2004-04-26 22:47 | [楼 主]
galilette
级别: 嘉宾


精华: 30
发帖: 2139
威望: 1382 点
金钱: 0 静电币
支持度: 0 点
在线时间:3012(小时)
注册时间:2002-05-01
最后登录:2019-03-12

 

发信人: hhuu (归来,从某个地方), 信区: Linux    
标 题: Emacs的日常生活 2
发信站: BBS 水木清华站 (Sat May 3 16:14:17 2003), 转信

*1   安排自己的时间

  如果你已经是一个善于管理自己时间的人,那么Emacs的这些功能可
能就全都没有必要了。不过,如果你和我一样在这个方面拎不清,Emacs
就显得很帮忙了。

  以下假定你已经把下面的内容加入到你的.emacs文件里面去了。

(setq display-time-24hr-format t)
(setq display-time-day-and-date t)
(display-time)

(setq todo-file-do "~/emacs/todo/do")
(setq todo-file-done "~/emacs/todo/done")
(setq todo-file-top "~/emacs/todo/top")

(setq diary-file "~/emacs/diary")
(setq diary-mail-addr "you@your.email.address")
(add-hook 'diary-hook 'appt-make-list)

  将所有emacs里面用到的文件都放到~/emacs目录中去,偶觉得是个
好习惯。

  对于大多数预期要做的事情,使用todo模式是最方便的,偶的习惯是
访问do文件的时候,作一个bookmark(M-x bookmark-set),这样以后访
问起来就很方便了。bookmark是Emacs很有用的功能,偶一般就把
list-bookmark绑定到F12上去,随手就能钩着。想起什么事情的时候,随
手就切到todo那边去,找一个catalog,用I命令插入一个新的entry;做
完了一件事情,随手切到todo那边去,用d或者f就能把entry去掉。每个
星期结束的时候,看看done文件,就会有“日子过得好充实阿”酱紫的感
叹。

  也有的事情没有那么重要,写不成todo的。这个时候就用
appointment。用(setq appt-issue-message t)确认打开了约会提醒功能,
然后appt-add就可以加入新的约会提醒。比如在电话里和mm吵架了,挂了
电话以后,在Emacs里面加一条(M-x appt-add),估计一下半个小时以
后,给mm打个电话赔礼道歉。半个小时以后,Emacs就会跳出一个小框来
提醒说,该打电话了。当然,如果半个小时之内,mm主动打电话回来修好,
那就用appt-delete删掉提醒好了。

  对于那些周期性比较长的事情,可以用diary。我刚开始用diary的时
候,以为diary是用来帮助写日记的,所以试了一下觉得好难用阿。仔细
看看,发现diary其实是用来做行程管理的。 ;-)

  单独用diary没什么意思的,所以info里面diary也是和calendar放在
一起的。偶把calendar绑定到F8上(global-set-key [(control f8)]
'calendar)。启动calendar会出现一个小窗口,显示当前日历。calendar
模式底下命令很多,但是常用的就那么几个,.命令可以跳回当今天,o命
令可以跳到某一个月。g系列命令表示goto,可以跳到指定的某一天,g d
是跳到某年某月某日,g c是跳到某年某星期的星期几,g C可以跳到阴历
的某一天。p系列命令表示print,可以按照某格式显示当前日期,比如p
C就可以显示当前的阴历日期。偶们现在比较关心的是i系列命令,i d是
加入当前这一天的行程安排,d表示的是day,显然依此类推还有m,y,w。

  比如mm打个电话来说,星期天要陪她去颐和园。用Emacs记一下吧,
免得忘了。打开calendar,跳到星期天上面,i d,陪mm去颐和园。又比
如老板说,以后每个星期一都给我交一份报告上来,打开calendar,跳到
某个星期一上面,i w,交报告给老板。还有一个常用的,比如mm生日是
9/29,打开calendar,跳到9/29,i a,a代表anniversary,mm生日。养
成用diary的习惯以后,经常性的打开calendar,跳到某一天,按一下d,
就可以看那一天有哪些安排了。相比之下,h命令对偶来说就很垃圾。

  diary文件里面可以写一些更详细的内容,比如直接把一个约会提醒
写到diary里面,偶觉得这个不是很方便。diary文件不过是一个纯文本,
有什么不满意的话,可以直接去修改,记得打开diary文件的时候,切回
基本模式,不然很多东西是看不到啦。 ;-)

--

C programmers think memory management is too important to
be left to the computer.
Lisp programmers think memory management is too important
to be left to the user.


※ 来源:·BBS 水木清华站 smth.org·[FROM: 211.157.205.69]
Posted: 2004-04-26 22:48 | 1 楼
galilette
级别: 嘉宾


精华: 30
发帖: 2139
威望: 1382 点
金钱: 0 静电币
支持度: 0 点
在线时间:3012(小时)
注册时间:2002-05-01
最后登录:2019-03-12

 

发信人: hhuu (归来,从某个地方), 信区: Linux    
标 题: Emacs的日常生活 3
发信站: BBS 水木清华站 (Mon May 5 00:08:51 2003), 转信

*2   用Emacs写东西

  虽然写程序也叫做写东西,可是我们现在要讨论的不是它。我们大部
分的时间里写的,是拿到bbs上灌的,是留到以后查的。Emacs有一些不错
的特点,可以方便上面说的这些事情。

  大部分的时间里,我们要写的文章写成TeX挺困难,因为不是那么有
条理;但是直接当纯文本处理,似乎又太没有条理。这种时候,用Emacs
的outline-mode就很合适。outline模式最大的好处是简单:只要在行首
放上几个星号“*”,就可以表达文章的条理关系。比如,看《爱丽丝漫
游奇境》是做一点摘录,先打开一个新文件C-x C-f;然后打开outline模
式M-x outline-mode;再然后呢,第一章的内容,先来一个*吧,写上第
一章的题目;第一章的写完了,C-c C-c就可以把前面写的内容都折起来,
只留下一个标题,看起来很是清爽。过一段时间想起来翻查的时候,C-x
C-f打开文件,还是进入outline-mode,C-c C-o就把所有内容都折起来了,
只留下标题,文件里面到底有些什么内容,也都一目了然了。

  这样做有一个缺点,就是很容易把所有内容都堆到同一个文件里面,
眼看着文件越来越大,很容易就要上兆了。不过Emacs是支持直接编辑压
缩文件的,用auto-compression-mode就可以。

  另外一个经常让人头疼的问题,就是文章的排版。特别是要拿到bbs
上贴的文章,bbs虽然号称支持自动换行,但是那也只是个聊胜于无的东
西,要想给人看,还是得手动换行才行。Emacs可以把一句长长的话自动
分成若干行,而且这个效果一般都很让人满意。只要把point移动到需要
重新整理的段落之中,M-q,就可以完成排版的工作。如果这样还嫌麻烦,
那么做成宏也是个不错的注意。如果文章是自己在写,那么打开
auto-fill-mode,是个不错的注意。auto-fill模式可以在写的同时,帮
你做换行的工作。

  如果写的东西大部分是英文的,还可以考虑打开flyspell-mode。不
过这个东西需要后面有ispell支持。win32底下有一个native的ispell v4,
不过用起来挺不爽的,建议装一个cygwin。打开flyspell-mode之后,写
东西的过程当中,ispell认为写错了的单词,就会自动高亮,很是显眼。
M-$可以让Emacs提示你写错的单词到底应该怎么拼。win32的Emacs 21还
没支持tooltip,所以有些看起来很炫的功能不能用。不过偶觉得就上面
说的几种模式,一般过日子也就足够了。

  尝试过wiki的同学,也可以试用一下emacs下的wiki模式,不过偶以
为wiki模式不适合给说中文的人用。 ;-(

 
--
  搞了半天,其实class和typename还是不能互换的。有种受骗上当的感觉。
    template<
          class Boy,
          class Girl,
          template <typename, typename> class Baby = SomethingHappend
    >


※ 来源:·BBS 水木清华站 smth.org·[FROM: 211.157.205.67]
Posted: 2004-04-26 22:48 | 2 楼
galilette
级别: 嘉宾


精华: 30
发帖: 2139
威望: 1382 点
金钱: 0 静电币
支持度: 0 点
在线时间:3012(小时)
注册时间:2002-05-01
最后登录:2019-03-12

 

发信人: hhuu (归来,从某个地方), 信区: Linux    
标 题: Emacs的日常生活 4
发信站: BBS 水木清华站 (Wed May 7 12:17:37 2003), 转信

*3   管理自己的地盘

  我习惯没事情干的时候,就逛自己的硬盘。相信很多人有和我类似的
毛病,上网的时候看到好的文章就存下来,时间一长,硬盘的各个角落里
面就堆满了各种各样的html,txt文件。只能常常抽空遍历一下自己的目录,
看看又多了一些什么东西。这件事情用cmd.exe可以做,用资源管理器也能
做,不行话还有wincmd,totalcmd之类的软件。当然用惯命令行的还是觉
得用sh.exe最好。

  Emacs既然是个八卦,就会八卦到底,它至少提供了另外两种选择,
eshell和dired。

  eshell看起来就很象一个shell了,不过拿它就做一个shell那也太
委屈它了,eshell带的pcomplete自动补全功能比bash.exe之类的shell,
还是有差距的。但是eshell的特长在于,可以直接使用emacs lisp的函数
做命令。比如偶比较喜欢的(defalias 'vi 'find-file)(前提是系统里
面没有vi的可执行文件),这样在eshell里面,vi一个文件,就会弹出一
个新的emacs buffer。充分发挥想象力吧。唯一要注意的是,eshell里面
不能用C-c取消一个输入了一半的命令,我的做法一般是C-a C-k,其实也
不太麻烦的。

  说到自动补全,不知道什么时候开始,突然发现几乎所有的shell,
所有的编辑器都支持用tab来做自动补全了。Emacs当然也可以这样设定,
不过有的时候,我们还是会怀念用tab来indent,不是吗?用这样一个函数
吧:

(defun my-indent-or-complete ()
"如果在词尾,那就hippie-expand,否则就indent"
(interactive)
(if (looking-at "\\>")
    (hippie-expand nil)
  (indent-for-tab-command)
  ))
(global-set-key [(tab)] 'my-indent-or-complete)

  hippie-expand虽然已经很不错了,不过我们可以让它更强一点的,

(autoload 'senator-try-expand-semantic "senator")

  然后再

(setq hippie-expand-try-functions-list
    '(
    senator-try-expand-semantic
    try-expand-dabbrev
    ........))

  当然前提是要装一个semantic,这个以后再说。

  Dired看起来就更象一个wincmd。常用的命令也就是v(查看),e
(编辑),d(标记删除),x(执行删除)。以前一度,我喜欢再dired里
面做el文件的byte compile,只要在需要compile的文件上面按B就可以了,
不过现在发现,那样还不如用这样一行命令合算:

(byte-recompile-directory "/path/to/somewhere" 0 t)

  自动重新编译一个目录下面所有的el文件。Emacs和python不一样,
elc 和el执行速度会差的很多,mule-ucs就是一个典型,编译之前启动一
次要半分钟,编译之后启动就是一眨眼的事情了。当然编译也是一个很费
时的事情。真是的。

--
  搞了半天,其实class和typename还是不能互换的。有种受骗上当的感觉。
    template<
          class Boy,
          class Girl,
          template <typename, typename> class Baby = SomethingHappend
    >


※ 来源:·BBS 水木清华站 smth.org·[FROM: 211.150.211.18]
Posted: 2004-04-26 22:49 | 3 楼
galilette
级别: 嘉宾


精华: 30
发帖: 2139
威望: 1382 点
金钱: 0 静电币
支持度: 0 点
在线时间:3012(小时)
注册时间:2002-05-01
最后登录:2019-03-12

 

发信人: hhuu (归来,从某个地方), 信区: Linux    
标 题: Emacs的日常生活 5
发信站: BBS 水木清华站 (Fri May 9 00:45:43 2003), 转信

*4   用Emacs写程序

  Emacs号称是一个强大的IDE,可是往往被人误解。常常有人说,
让VS.net的热键设置和Emacs一样,VS.net就算可以模仿Emacs了,他是在
逗你玩呢。

  还是从写还是吧。

  基本上那些常见的编程语言,Emacs都有支持。我们现在说的支持,基
本上就限于有一种对应于这种语言的major mode。最常见的就是cc-mode了,
甚至还专门拿出来,在sourceforge上做了一个项目的说。cc-mode可以不
错的支持各种语法上有些类似c的语言,甚至于idl。

  不过,cc-mode不支持c#。google上能搜到一些给Emacs用的c# major
mode,我觉得http://davh.dk/script上的那个不错;别的大都需要对
Emacs自带的cc-mode做替换,让人觉得很不爽。前面提到的那个,在
Emacs 21.3.xx上可能需要作一点小的修改,大概621行左右的位置,
(c-common-init)改成(c-common-init 'c-mode),大致如此。

  Python mode需要到http://www.python.org上去下载。

  有了这些以后,基本上不愁写程序的时候的语法加亮的问题了。(其
实本来也没什么好愁的,毕竟这是最基本的要求)。

  有人偏爱ue那样,把当前行高亮的样子,那就先打开M-x hl-line-mode。

  有人看到ThisIsASimpleVarInJava就觉得郁闷,那就打开M-x
glasses-mode。

  关于补全,上次提到过,hippie-expand加上semantic是现在最好的选
择了。 dabbrev-expand完全不懂语义的,常常给扩展出一些莫名其妙的
内容来,semantic就不一样了。它至少是懂的语义的,expand的结果看起
来就合理的多,有的时候甚至能够认出某一个变量的类型来,让我激动了
老半天,当然,只是有时候阿。;-( semantic可以从
sf.net/projects/cedet上下载。别的还有一些东西,比如jde或者ecb都是
建立在semantic的基础上的,写java的话,也可以用jde,比elipse之类当
然是要轻的多了。ecb偶没用过。

  关于宏,c语言最麻烦的可能是宏了。常常是面对嵌套了若干层的宏,
看不出一个所以然来。 这个时候,可以直接用C-c C-e,对已经选定的区
域做预处理,预处理的结果会显是在另外的buffer里面。这项工作缺省使
用cpp来做,不过只要编译器支持从标注输入读入代码,好像都可以正常工
作。另外有一些简单的宏,比如用来做平台选择的,直接用
hide-ifdef-mode就可以摆平,都免去了调用预处理器的麻烦。

  关于代码隐藏,其实偶一般只用一个C-c @ C-c,hs-troggle-hiding。
基本上能够满足要求了。 不过用之前记得先打开M-x hs-minor-mode。

  关于文件,有一个很常用的命令,ff-find-related-file。在编辑某
一个程序文件的时候,想打开所有包含的头文件,用
ff-find-related-file就可以了。有时候可能需要调整一个参数,自己用
C-h f ff-........看看就搞定了。

  关于查看帮助,有的选的有info和woman。woman可以用来看man能查到的帮助。
一般可以把下面这点代码绑定到f1上。

(global-set-key [(f1)] (lambda()
          (interactive)
          (let ((woman-topic-at-point t))
          (woman))))

  也可以用C-h C-i在info里面查看函数。这些都很简单了。如果你还不
满足,那就直接google吧,可以考虑利用browser-url。 ;-)

--

C programmers think memory management is too important to
be left to the computer.
Lisp programmers think memory management is too important
to be left to the user.


※ 来源:·BBS 水木清华站 smth.org·[FROM: 211.150.210.145]
Posted: 2004-04-26 22:51 | 4 楼
galilette
级别: 嘉宾


精华: 30
发帖: 2139
威望: 1382 点
金钱: 0 静电币
支持度: 0 点
在线时间:3012(小时)
注册时间:2002-05-01
最后登录:2019-03-12

 

发信人: hhuu (归来,从某个地方), 信区: Linux    
标 题: Emacs的日常生活 6
发信站: BBS 水木清华站 (Fri May 9 14:01:44 2003), 转信

*5   还是关于写程序

  首先给上次的内容打个补丁。ff-find-related-file是偶自己的一个
函数,时间长了也忘记了。更ft的是,现在ff自己就带了酱紫一个东西,
不过是ff-find-other-file的alias。函数大致如下,大家看自己需要更改,
名字就不在叫ff-find-related-file了,换成my-find-related-file吧。

(defun my-find-related-file ()
"Find all related files in this buffer"
(interactive)
(save-excursion
  (let ((my-buffer (current-buffer)))
  (goto-char (point-min))
  (while (search-forward-regexp " *# *include" (point-max) t)
    (progn
    (ff-find-other-file)
    (switch-to-buffer my-buffer)
    )))))

  还有就是注意,ff-search-directories早一点设定,用过一次ff函数
以后,再setq就晚了。 ;-) 以上。

  关于自动排版。自动排版算是一个比较重要的功能,特别是对于那些
版式和程序结构没有影响的语言,让代码的排版比较迎合个人的喜好,这
个不过分吧。对于整个文件做重排,一般要C-x h选定整个buffer,然后
C-M-\重新排版。 这个一般比较耗时间,如果代码文件确实很长的话。折
中的做法是在一个代码端开始的地方,就是{处,用C-c C-q,酱紫可以排
版一个代码段。排版的风格可以用c-set-style来设定,偶一般用
stroustrup,表达偶对他的仰慕。如果对于具体的某一个设置不满意,可
以在不满意的地方用C-c C-s看一下,这里缩进的设置是取决于什么的;然
后可以用C-c C-o修改之。

  关于移动。程序代码里面移动来移动去,也是一个问题。最直接的办
法当然是用鼠标了。不过各种模式里面一般也都会对常见的移动键位做修
订,可以自己试一试,找出比较常用的键来。几乎所有的模式都会支持以
函数定义为单位移动,这个一般都很好用。

  关于tag,Emacs附带的etags可以用来生成TAGS文件。在某个源文件中
M-.,Emacs会询问访问哪一个TAGS文件,这个基本上和vi差不多。更强悍
一点的是ebrowser,生成一个BROWSER文件,只要find-file这个文件,就
会进入ebrowser的模式,有一点类似于cscope。speedbar在这个时候可以
来帮忙,试试看就知道了,不过好不好使就完全是一个见仁见智的问题。
上次说到的ecb(sf.net/projects/ecb),也着眼于解决这一类问题,有
兴趣试试?

  关于grep,Emacs自己没有grep功能(ft)。不过好在grep这个东西不
管哪个平台都有,win32底下叫做findstr(ft again)。可以尝试一下
grep,grep-find。 前者是直接把参数传递给grep的,后者是把参数传递
给find + grep,两者都会在当前buffer对应文件所在的目录下面进行。反
正和直接在console下面玩没什么两样的。

  关于diff,ediff模式很不错的。比较爽的做法是在eshell里面用。
ediff a.c.orig a.c。 特别注意的是,ediff的session控制区是一个小
窗口,那个小窗口关掉,就算是退出ediff了哦。ediff可以忽略空格的。
对应的epatch较之直接用patch的优点就在于,patch完了以后就直接进入
ediff模式,什么地方做了改动一目了然。

  关于注释,虽然最简单的做法是用C-c C-c注释掉整块已经选定的区域,
但是这种做法不一定是最好的。如果是想将暂时不需要的代码抹掉,还是
用#if 0/#endif 比较合适,因为我一般用flyspell-prog-mode来检查注释
里面有没有单词拼写错误。如果你不想看到代码里面被指出很多拼写错误
来,那还是不要滥用C-c C-c的好。 ;-)

--
  搞了半天,其实class和typename还是不能互换的。有种受骗上当的感觉。
    template<
          class Boy,
          class Girl,
          template <typename, typename> class Baby = SomethingHappend
    >


※ 来源:·BBS 水木清华站 smth.org·[FROM: 211.150.210.42]
Posted: 2004-04-26 22:51 | 5 楼
galilette
级别: 嘉宾


精华: 30
发帖: 2139
威望: 1382 点
金钱: 0 静电币
支持度: 0 点
在线时间:3012(小时)
注册时间:2002-05-01
最后登录:2019-03-12

 

发信人: hhuu (归来,从某个地方), 信区: Linux    
标 题: Emacs 的日常生活 7
发信站: BBS 水木清华站 (Sat May 17 19:59:37 2003), 转信

*6   收邮件,发邮件

  邮件系统很早就在Emacs里面占有重要地位了。从最早的rmail到vm到
gnus,各种各样的mail mode,乱花迷人眼。VM似乎是界面最友好的了,还
记得第一次用xemacs的时候,那还是4年前,VM就已经支持很好看的图标按
钮了。虽然如此,我当时对xemacs是如此ΘΘΘΘ,还是没法把VM好好的用起
来 ;-(

  不过我转回到Emacs收信也是最近的事情了。要知道能让我从becky转
过来,这个诱惑一定要不一般才可以。 ;-)

  gnus就提供了这样的诱惑。这个号称世界上最好的news客户端,也能
作一个世界上最好的maillist客户端。如果你不上news,不混maillist,
那么gnus的强大对你来说并没有意义,不如早点放弃吧。hehe

  设置用gnus收信,或者发信,其实是很容易的。gnus支持多个pop3服
务器,Emacs支持smtp发信认证(需要升级你的Emacs lisp部分,2.3.1的
还没包括这部分的内容),如果你希望pop3收信的时候不删除服务器上的
邮件,Emacs现在还不行,你要自己动手去安装一个epop3.el的扩展。偶没
用装过,因为偶没有这样的需求。在开始M-x gnus之前,记得在.emacs文
件里面添上一些东西:

(require 'gnus-load)

(setq gnus-startup-file "~/emacs/config/newsrc")
(setq gnus-init-file "~/emacs/config/gnus-config")

  把gnus-config从.emacs中分出来的做法比较清楚,因为你以后会经常
有改gnus-config的需要的。在gnus-config中需要加上这些内容:

(setq gnus-select-method '(nnfolder ""))
(setq gnus-secondary-select-methods '((nntp "news.gnus.org")))
(add-to-list 'gnus-secondary-select-methods '(nntp "perl.org" (nntp-address "nntp.perl.org")))

  上面的第一行指明的是gnus对邮件使用的backend,偶觉得nnfloder比
较好,你可以先这样用着,反正backend以后还是可以换的,等你熟悉了
gnus以后。然后就可以给secondary-select-methods加各色的news服务器了,

(setq mail-sources '(
              (pop :server "263.net" :user "huxwcn" :password "pighead")
              (pop :server "knight.6test.edu.cn" :user "huxw" :password "pighead")
              ))

  然后设置backend去哪里收信,除了pop3,还支持imap,或者本地的
maildir之类的冬冬,以此类推,还能加很多。还有就是希望你不会naive
的以为上面的密码是真的。 ;-)

  最后,就是发信的设置。

(setq smtpmail-auth-credentials '(("smtp.263.net" 25 "huxwcn" nil)))
(setq smtpmail-smtp-server "smtp.263.net")
(setq user-full-name "Robin Hu")
(setq user-mail-address "huxw@knight.6test.edu.cn")

  前两行是说发信服务器的位置,后两行是给收信人看的。人家回信就
会回到那个user-mail-address 上去。以后会看到这种东西都可以很灵活
的修改。

  这些都搞定的时候,你就可以尝试开始gnus之旅了。我最后offer一点
不好的消息,你要是觉得不爽的话,现在停止尝试gnus还来得及。因为
Emacs不是一个多线程的程序,而gnus也没有打算和别的程序合作,你打开
gnus的时候,Emacs的所有frame都会失去相应一段时间,时间的长短视
gnus把所有的邮件收回来需要的时间而定;如果你在家慢慢拨号的话,而
且信有很多的话,这段时间可能会长达15分钟。事实上,news.gnus.org里
面的同学似乎都是开了两个Emacs的,一个专门起gnus,另一个干活,酱紫。

  好了,如果你连这个也不在乎的话,那就开始吧。M-x gnus。你会什
么也看不见。这是因为gnus缺省以为,你收的邮件,都是属于某一个列表
的,就好像bbs上的版面一样,你不订阅,就什么也看不见。订阅很容易,
用^可以进入*Server Buffer*,在nnfolder上按RET,看到mail.misc以后
按u就可以订阅它。 缺省所有没有分类的邮件都会跑到mail.misc里面去。
你以后在慢慢改吧。

--
  搞了半天,其实class和typename还是不能互换的。有种受骗上当的感觉。
    template<
          class Boy,
          class Girl,
          template <typename, typename> class Baby = SomethingHappend
    >


※ 来源:·BBS 水木清华站 smth.org·[FROM: 211.150.44.69]
Posted: 2004-04-26 22:53 | 6 楼
galilette
级别: 嘉宾


精华: 30
发帖: 2139
威望: 1382 点
金钱: 0 静电币
支持度: 0 点
在线时间:3012(小时)
注册时间:2002-05-01
最后登录:2019-03-12

 

发信人: hhuu (归来,从某个地方), 信区: Linux    
标 题: Emacs的日常生活 8
发信站: BBS 水木清华站 (Mon Jun 2 19:00:20 2003), 转信

*7   邮件分类

  收到很多信的时候,需要分一下类。所有能用的mail客户端都支持对
收到的mail做分类,包括gnus。在gnus当中,你可以通过指定的规则,将
某一些邮件归成一类;在gnus看来,这样的一类邮件,基本上等同于news
服务器上的一个讨论组。

  给邮件分组的工作,是通过设置nnmail-split-methods来实现的。
gnus里面所有的设置名字都很长,容易敲错,一个简单的判别方法,是在
变量上面C-h v看看有没有文档。 有文档的至少能够说明这个变量名没有
敲错。

  我推荐使用nnmail-split-fancy来实现邮件分类,因为从个人经验来
看,用fancy分类,至少可以把判别规则写的好看一点。这里先给一个sample。

(setq nnmail-split-fancy
    '(|
;;     (: gnus-group-split-fancy)
    (any ".*-?current@\\(freebsd\\|FreeBSD\\)\\.org" "maillist.freebsd.current")
    (any ".*-?ipfw@\\(freebsd\\|FreeBSD\\)\\.org" "maillist.freebsd.ipfw")
    (any "emacs-devel@gnu\\.org" "maillist.emacs.emacs-devel")
    "mail.misc"))

(setq nnmail-split-methods 'nnmail-split-fancy)

  其实就是一些正则表达式。需要注意的是,如果将
nnmail-crosspost设置为nil,那么就不会出现“一稿多投”的情况,也就
是说一封邮件在这些判别规则上遇到符合的就会直接break了。还有就是不
建议在这里用太复杂的正则表达式,偶曾经试图在一行里面对所有
freebsd的邮件列表进行分类,结果死的挺难看的。 ;-(

  一旦邮件分类了。你应该也期望对不同类别的邮件作出区别对待。林
林总总的需要都可以通过设置group parameter完成。对group parameter
的设置可以在gnus里面完成,使用G p或者G c:前者是字符界面的,后者
是能跳出一个类似于cunstomize的界面来。也可以通过setq
gnus-parameters,在.gnus文件里面手工设定。典型的例子比如:

(setq gnus-parameters ;;别写错了名字
    '(
    ("maillist\\.freebsd\\.\\(.*\\)$"
      (to-list . "\\1@freebsd.org")
      (posting-style
      (name "Me me me")
      (address "me2@whoami.com")
      (signature "Smile and Retain Smile.")) ;;签名档也可以是文件
      (total-expire . t)
      (expiry-wait . 7)
      (broken-reply-to . t)
      (subscribed . t))
))

  注意,这里也可以用正则表达式哦 ;-)

  group parameter中的to-list,可以被自动收集起来;酱紫如果你在
nnmail-split-fancy里面用gnus-group-split-fancy来自动分类,免去自
己重写一遍分类规则的麻烦。不过设置gnus-parameters,是没办法利用这
种能力。

  设置好了group parameter能够简化很多事情。比如现在在freebsd的
某个list里面按一下a,收件人地址就自动设成to-list了。很多时候比
bbdb还要方便的多。

--
  搞了半天,其实class和typename还是不能互换的。有种受骗上当的感觉。
    template<
          class Boy,
          class Girl,
          template <typename, typename> class Baby = SomethingHappend
    >


※ 来源:·BBS 水木清华站 smth.org·[FROM: 210.74.191.34]
Posted: 2004-04-26 22:55 | 7 楼
galilette
级别: 嘉宾


精华: 30
发帖: 2139
威望: 1382 点
金钱: 0 静电币
支持度: 0 点
在线时间:3012(小时)
注册时间:2002-05-01
最后登录:2019-03-12

 

发信人: hhuu (归来,从某个地方), 信区: Linux    
标 题: Emacs的日常生活 9
发信站: BBS 水木清华站 (Mon May 26 15:44:12 2003), 转信

*8   支持中文GBK

  何曾几时,中文支持是Emacs的强项。在Emacs里面开一个shell上水
木几乎是我唯一的选择。 时代变了,Emacs的中文支持就渐渐的落后了。

  Emacs内部有一套表示多国的方法,就是所谓的emacs-mule。我们能够
在同一个emacs buffer里面能够同时看中日韩文字,能够同时看到阿拉伯
文,能够同时看到德文,丹麦文;这都拜emacs-mule所赐。不幸的是
emacs-mule并没有成为事实上的编码标准。emacs-mule除了emacs自己能够
认识以外,其他的编辑器都不支持。所以Emacs必须在和其他文本处理器交
互的时候重新编码内部的emacs-mule。这里没有必要谈太多的细节,
Emacs是一个self-document的编辑器,上面这些细节都可以在
coding.[ch]和charset.[ch]中找到。
               
  为了能和键盘交互(可以认为键盘是一个文本处理器,Emacs从键盘中
读入文本),Emacs将从键盘中读入的文本“解码”为emacs-mule(我们这
里说到编码解码,都是从Emacs的角度来看),为了文件能被其他的文本编
辑器打开,比如vi,Emacs在存盘的时候将emacs-mule编码为
chinese-iso-8bit。这就是我们平常用到的各种coding system起到的作用。

  为了让Emacs支持gbk,我们需要做的,就是让所有的gbk编码字符,都
能够在emacs-mule中找到自己的座位。虽然实际上emacs-mule里面所有的
座位都已经被人坐满了,我们还是可以假设那些很少有人出现的座位依然
是空的。前面给出的chinese-gbk就强占了cns11643-5, 6, 7的座位。这些
座位的汉字几乎不可能出现在我们这些人的屏幕上,所以这种做法基本上
是可行的。所以如果有一天,你在使用chinese-gbk的时候,又试图用
cns11643的编码来保存,还请你回到这里来想想可能会发生的事情。

  因为Emacs已经开始支持unicode了,所以让utf-8或者utf-16编码的
gbk汉字的文件在Emacs中显示并不是麻烦。而且Emacs已经在这里预留了
hook,只需要给一个translate-table,那就一切ok了。

  让Emacs支持从X拷贝过来的gbk汉字,很难直接在lisp代码中实现。因
为X和emacs一样是个历史悠久的软件,所以它同样也有一套自己的多字节
编码格式。在Emacs中,缺省是采用compound-text-with-extension来处理
这种编码格式的。从作者当初开发的思路来看,我们让它支持gbk编码,只
需要添加一项("GBK-0" . chinese-gbk)到
non-standard-icccm-encodings-alist中去,就可以简单的扩展支持gbk编
码了。然而,因为实现上bug,和X本身的问题,这终究只是一个美好的愿
望。如果你坚持的话,可以尝试一下这个补丁。注意这个时候就不能再使
用compound-text-with-extensions作为selection的coding system了,而
应该用chinese-gbk。

--- /home/huxw/src/Resp/emacs/src/xselect.c   2003-04-07 04:35:06.000000000 +0800
+++ xselect.c   2003-05-26 11:17:42.966829744 +0800
@@ -1496,6 +1496,11 @@
    Lisp_Object target_type; /* for error messages only */
    Atom selection_atom;     /* for error messages only */
{
+     // by huxw start here
+     XTextProperty text_prop;
+     char** local_list;
+     int local_number = 0;
+     // by huxw end here
  Atom actual_type;
  int actual_format;
  unsigned long actual_size;
@@ -1554,12 +1559,70 @@

  /* It's been read. Now convert it to a lisp object in some semi-rational
    manner. */
+ //by huxw start here
+ if (XSupportsLocale()) {
+       int local_status;
+
+       text_prop.value = (char*)data;
+       text_prop.encoding = actual_type;
+       text_prop.format = actual_format;
+       text_prop.nitems = actual_size;
+
+       local_status = XmbTextPropertyToTextList(display, &text_prop, &local_list, &local_number);
+       if (local_status < Success || !local_number || !*local_list ) {
+       } else {
+           xfree((char*)data);
+           data = strdup(*local_list);
+           XFreeStringList(local_list);
+       }
+ } else {
+ }
+ //by huxw end here
+
+#if 0
  val = selection_data_to_lisp_data (display, data, bytes,
                        actual_type, actual_format);
+#else
+     val = selection_data_to_lisp_data (display, data, strlen(data), actual_type, actual_format);
+#endif

  /* Use xfree, not XFree, because x_get_window_property
    calls xmalloc itself. */
- xfree ((char *) data);
+
+ // by huxw start here
+// xfree ((char *) data);
+ if (local_number == 0) { // Xmb is not used to not successed
+       xfree((char*)data);
+ } else {
+       free(data);
+ }
+ // by huxw end here
  return val;
}

--

C programmers think memory management is too important to
be left to the computer.
Lisp programmers think memory management is too important
to be left to the user.


※ 来源:·BBS 水木清华站 smth.org·[FROM: 210.74.191.34]
Posted: 2004-04-26 22:56 | 8 楼
galilette
级别: 嘉宾


精华: 30
发帖: 2139
威望: 1382 点
金钱: 0 静电币
支持度: 0 点
在线时间:3012(小时)
注册时间:2002-05-01
最后登录:2019-03-12

 

发信人: hhuu (归来,从某个地方), 信区: Linux    
标 题: Emacs的日常生活 10
发信站: BBS 水木清华站 (Mon May 26 21:45:17 2003), 转信

*9   支持中文GBK(续)

  Windows的国际化一向做的很好,可是Emacs没有打算依赖它。在
Windows里面跑的Emacs看起来很像在X里面跑的Emacs,很像,还是有一些
要注意的地方。

  Windows里只定义了GB2312_CHARSET,这把Emacs搞糊涂了。如果在
Emacs里面列出可用的所有字体,会发现没有字体是以gbk结尾的,这也使
得Emacs无法处理所有gbk编码的汉字,只能显示一个方框代替。处理方法
一样简单,只要把("gbk" w32-charset-gb2312 . 936)加到
w32-charset-info-alist中去就可以了。另外一个常见问题是Emacs有时无
法正确处理字体名称中的中文编码,这种时候很是少见,找出问题之前,
绕开就是了。

  Windows下的粘贴拷贝并没有额外的编码,所以把
clipboard-coding-system设成chinese-gbk就可以了,没有X底下的困扰。

  Emacs的中文支持虽然看起很繁琐,但是它却是最完善的。比如我们
知道动感超人的口号是“啊哈\{6,8\}”,这种正则表达除了在Emacs里面,
还能在哪里用呢?或者说“段?誉儿?”(有点肉麻,hoho)。


--

Sure. ``Aahz's law: The best way to get information on BBS is
not to ask a question, but to post the wrong information.'' ;-)


※ 来源:·BBS 水木清华站 smth.org·[FROM: 211.157.204.131]
Posted: 2004-04-26 22:58 | 9 楼
帖子浏览记录 版块浏览记录
狗狗静电BBS - wwW.DoGGiEhoMe.CoM » 电脑全方位 Computer Guide

沪ICP备05008186号
Powered by PHPWind Styled by MagiColor