存档

文章标签 ‘emacs’

emacs 的列编辑

2010年8月29日 wd 没有评论

列编辑我觉得是一个编辑器不能缺少的东西。在 vim 里面使用 C-v 就能进入列编辑,然后我通常用到的,也就是 d (删除) 和 I (插入)。在 emacs 里面一直没怎么用上这个,总感觉是操作很麻烦。最近操作了几次,发现也没那么难,呵呵。

emacs manual 里面关于列编辑的页面。emacs 里面那个默认的列编辑不会出来像 vim 里面那样的矩形选区(不过有别的方法好像可以做到),所以当你选择的时候,还是按行来选择的,你只需要关心选择的起始点和结束点之间的那个矩形就好了,你的操作只会在里面起作用。

对应到 vim 的 d,emacs 里面的应该是 C-x r d 或 C-x r k 了吧,对应到 I,应该是 C-x r t string 了吧,不过 emacs 里面这个是替换选择的东西为 string,你要是选个空的,应该就算是插入了吧。还有个 C-x r y 复制,我觉得会这几个应该就基本可以了吧。。

分类: Linux 标签:

emacs 的 emms 里面的乱码

2010年6月19日 wd 没有评论

emms 是基于 emacs 的一个播放器,不过其它他做的应该只是管理音乐,具体播放还是靠 mpg123 或 mplayer 这样的程序。

前几天下了一些 mp3, 这两天就又搞了搞 emms。emacser.cn 有篇文章就是介绍这个的,就不多说了。主要是被编码问题搞死了。

下载的 mp3 的 tag 是 gbk 的,可是设置了 emms-info-mp3info-coding-system 为 gbk 没效果,而用 mp3info 程序看了 mp3 的 tag,确实是 gbk 的,奇怪了就。后来发现 emms 还带了一个 emms-print-metadata 这个程序,这个程序貌似不需要设置编码,他会出来的结果直接就是 utf8, 可就算用这个 (通过设置 (setq emms-info-functions ‘(emms-info-libtag)) ),出来的结果还是乱码。

后来突然想起来是不是 cache 的问题,然后就发现有两个地方可能有 cache,一个是 emms-cache.el 一个是 emms-history.el,把这两个对应的 cache 文件删掉,再运行一次 emms 就没问题了。我还设置了下下面的。

(setq emms-cache-file "~/.emacs.d/emms/emms-cache"
      emms-history-file "~/.emacs.d/emms/emms-history")
分类: Linux 标签: ,

elisp 最最初级的一点入门知识

2010年4月25日 wd 没有评论

其实上次写 http://wdicc.com/how-i-became-a-emacser 的时候,是想写一点 eslisp 入门的东西的,结果总觉得好像也写不出来什么,就写成另一篇了,呵呵。(看这篇前最好先看看那个吧,那个更入门。)

不过我还是觉得,用 emacs 如果不会一点 elisp,那基本你是用不住的。记那些无聊的快捷键有什么意思,有意思的是你能让 emacs 用你希望的模式工作。今天 twitter 上面看到一个词”计算姬”,感觉很有点意思,呵呵,小蜜就是给你干活的嘛,不要被她折磨就好。

其实主要是我自我感觉目前了解的 elisp 的东西,好像基本就够用了,所以才想写出来,给比我还糊涂的指条明路。

1 数据类型。
elisp 是有类型在里面的,我看好像有什么 sequence, number 之类,具体有哪些不重要,重要的是你使用的时候,比如比较的时候,切记要弄明白他们是什么类型。我找到一个 format 函数,感觉很好用,可以转类型,具体可以查文档,可以多用用。

2 调试
调一个程序的时候,我觉得最基本的就是 print 和 message 这两个函数了吧,加上上面的 format,基本应该能搞定了。在一段 elisp 后面使用 C-x C-e 就能直接执行他,执行之后就能在当前的 emacs 里面起作用,不过对我等菜鸟来说,有时候会遇到一些奇怪的问题,不行就还是再启动一个 emacs 来验证结果吧。

3 emacs 简单设置
掌握了上面两个,基本就可以定义自己的东西了。一般用的是 setq,比如下面这个

;; 防止页面滚动时跳动, scroll-margin 3 可以在靠近屏幕边沿3行时就开始滚动,可以很好的看到上下文。
(setq scroll-margin 3
            scroll-conservatively 10000)
(set-terminal-coding-system 'utf-8)
(add-to-list 'auto-mode-alist '("\\.py\\'" . python-mode))

可以看到他一次设置了两个变量,其实写两个括号也是可以的。

还有下面的两行,他是执行了一个函数,这个函数里面干的什么,他接受什么参数,直接在 emacs 里面按 C-h f 然后输入你要查的函数的名字,就会显示 help 信息,很方便吧。

4 hook
下面稍微高级一点,了解下 hook 怎么用。hook 这个东西翻译过来应该是钩子的意思吧,其实就是别人的程序预留的一些接口,可以让你在他的程序里面插入一些你自己的程序。比如下面这几个。

(add-hook 'weblogger-start-edit-entry-hook (lambda()
    (auto-fill-mode -1)
    (abbrev-mode -1)
    (auto-complete-mode 1)
    ))
(add-hook 'cperl-mode-hook (lambda () (abbrev-mode -1)))
(add-hook 'view-mode-hook 'view-mode-keybinding-hook)
 
(defun weblogger-edit-entry (&optional entry)
  "Edit a entry.  If ENTRY is specified, then use that entry.
Otherwise, open a new entry."
   ...........
  (run-hooks 'weblogger-start-edit-entry-hook)
)

第一个是在 weblogger.el 开始编辑文件的时候,把那些 mode 关掉。第二个是 cperl-mode 启用的时候,把 abbrev-mode 关掉。第三个是在 view-mode-hook 执行的时候,执行那个函数。

最后是在实际代码里面这个 hook 是怎么执行的,能看到当调用 weblogger-edit-entry 的时候,就会在这里面某个时候去执行之前设置的 hook,这样个性化设置的目的就达到了。

eamcs 的各种 mode 一般都有各种的 hook,这应该能完全达到个性化的目的了,可有些时候想定制的地方没有 hook 怎么办?暴力一点,直接改他的程序好了。。。温柔一点的,那就看下面这个。

5 defadvice

defadvice 在文档里面写的很清楚,大概应该是可以在一个已有函数执行前或后执行你定义的东西。比如下面这个。

;; use this to auto cancel notify
;; (add-hook 'erc-send-pre-hook
;;           (lambda(s)
;;             (erc-tray-change-state nil)))
(eval-after-load 'erc
  '(progn
     (defadvice erc-send-input (before change-tray-status activate)
       (erc-tray-change-state nil))))

我设置了 erc 在收到消息的时候会发送 notify 到 tray,我想做到只要我在 erc 里面输入了一些东西(即使是空的),就把 tray 的状态标记为已读,就不用继续提醒我了。

erc 有个 erc-send-pre-hook,可以在发送一条消息前执行 hook,可是如果输入的是空行,是不会触发这个 hook 的,使用 defadvice 可以解决这个,具体使用方法还是看文档吧,我突然觉得我很罗嗦。。。。屁大点东西也能发一篇?。。。

我会的基本就说完了,其它高级玩意有需要的时候应该可以从文档里面去看吧,目前来看,会用 hook 和 defadvice 我就知足了,不行就来 irc 里面找牛人问一个,经过提示后,应该还是能解决的吧。反正不求能自己去写一个 mode,当时最少也要能看明白别人的那点东西,然后自己能改一下吧,要不用 emacs 会很痛苦的。

分类: Linux 标签: ,

我是怎么从 vim 转向 emacs 的

2010年4月18日 wd 1 条评论

从尝试用 emacs,到现在基本(有些地方还不是很适应)习惯用 emacs,算起来得有 n 年了,我都忘记最早接触 emacs 是什么时候了。在 2010-3-20 之前尝试过很多次,基本都是记几个快捷键,过几天就又忘记了。后来自己想了下为什么不能持续的原因,我觉得有两个。

1 没有在日常工作里面使用。
之前我的开发工作基本都是直接在某台服务器上面的,这样就开发调试会比较方便,而那些机器一般要不会装 emacs,这样不常用就会导致记住的快捷键过几天就忘记了。最近刚好需要在本机写点程序,也就刚好用上了。

2 不会 elisp。
emacs 的配置文件都是 elisp 写的,而不经过配置的 emacs 就编辑文件来看,我觉得还不如去用 vim,vim 好用多了。我想刚看到 elisp 的时候一般都会觉得这个语言太变态了,全是一堆的括号。。。而不会 elisp 就会导致你只能去机械的复制别人的配置,如果刚好是你想要的,那还好,而如果还想做点小的修改,那就会很郁闷,用起来郁闷,不用可能更郁闷。不爽多了,就干脆不用 emacs 了。

如果你能在日常工作中经常使用,并且会写程序(比如 php,perl 什么的,随便哪个都行),那么对于基本没怎么配置过 .vimrc 的用户来说,切换到 emacs 其实应该还算是一个比较简单的事情。

1 emacs 是无模式的。
这就是说你不用经常去按那个 Esc 来切换模式了。没有模式也就意味着你不能使用像 vim 那么简短的命令了,因为像 a,i,o,h,j,k 这些对 emacs 来说,这些都是正常的输入字符,所以我们不得不在这些字符前面加上 C(control), M(Meta 一般是 Alt), S(super 一般是 win) 这些前缀。在 emacs 里面需要按的可能还远不止这些控制字符加一个普通字符,比如我定义的 C-c n E 来打开 erc。不要被这些吓着了,并不需要你记住所有的,你只要记住你常用的就好了。

2 emacs 里面的 buffer。
打开一个文件,就会出现一个 buffer。调用帮助,也会打开 buffer。使用 emacs 绝对不要和一些自动出现的 buffer 过不去,使用 emacs 的理念就是一个编辑器 n 个 buffer,编辑文件的,看 mail、news 的,上 irc 的等等。你需要的是一个方便的 buffer 切换的工具,推荐的有 ido-mode 和 ibuffer。

3 emacs 里面有各种 mode。
vim 里面是通过设置 filetype(ft) 来达到语法高亮等功能的。emacs 里面是通过各种 mode。emacs 里面有主模式(main mode),和辅模式(minor mode)。上面说的 ido-mode 就是一个辅模式。打开一个文件后,一般有一个主模式(通过一些方法也可以有多个),多个辅模式。比如我打开一个 js 文件,会同时使用到 js2-mode 这个主模式,和 highlight-tail-mode, autocomplate-mode 这几个辅模式。

4 写点 elisp。
elisp 基本就是一堆的括号,括号最左半边的是操作符或函数,后面的都是他的参数,比如 (- 10 3),具体这个是什么意思,就要去看看 “-” 是干嘛的,他会对后面的参数做什么事。再比如(setq xwl-at-company? (xwl-at-company))。先去看看那个 setq 是干嘛的,查完好像是设置变量的,他会把第二个参数的值赋给第一个参数。那第二个变量是个表达式,那就等于会把这个表达式的值赋给他,对吧。这个括号表达式是干嘛的呢?xwl-at-company 这个是自己写的函数,不需要参数,他会根据一些信息返回是不是在使用公司的网络。是返回 t,不是返回 nil。ok,这不就明白了么?呵呵。还有一些像 (if, (when, (progn 等等,都是这么个理解方法。
写程序就避免不了调试,最简单的调试方法应该就是直接打印了吧,呵呵。elisp 里面可以使用 print, message 来输出一些调试信息。比如 (print (format “value of t: %s” t)),具体啥意思可以参考前面说的方法去查查。这些信息可以在一个叫 *Messages* 的 buffer 里面看到。

5 emacs 里面的帮助。
C-h 是调用帮助,可以在后面再输入 ? 来看看有什么可用的帮助。我一般用的是 m(看当前 mode 的一些快捷键设置),k(查某个快捷键是干嘛的),v(查 emacs 变量的值)。

分类: Linux 标签: ,

看了 12 怒汉 ( 12 Angry Men )

2010年3月14日 wd 没有评论

12 怒汉下了好久了,一直没看,正在看,还没看完就忍不住要写点什么。

俄语实在不好听,忍着看了 10 分钟,这个片子就开始吸引人了。12 个陪审团成员,还有其它人,几乎所有人都认为 20 分钟应该就会完事,因为这之前已经听法院审了三天了。在 12 比 1 的情况下,怎么说服其它人同意小孩是无罪的,这就是整个片子的内容。当然是有理有剧的。

当你手里掌握着别人的生命的时候,你会怎么做?今天上午还看了几集哈佛大学的那个关于公正的课,里面几个例子。

如果你是一个电车司机,刹车失灵了,轨道那头是 5 个工人,开过去肯定会把他们撞死,关键时刻你发现有个叉道,那边是 1 个工人,如果你打方向盘的话,那就是撞死一个人,你会怎么做?

再如果司机不是你,没有叉道,而你当时你站在桥上,你旁边有个胖子,如果把那个胖子推下去,车就会停,你会怎么做?

如果你是一个医生,医院来了 6 个病人,其中一个病的很重,其他几个轻一点。如果你救那个病重的,因为需要的时间会很长,那其它几个就会死。如果你先救那 5 个,那么病重的一个就肯定死,你怎么办?

再如果,来了 5 个病人,他们分别需要移植 5 个器官,可是没有现成的。这时候你想起来旁边屋子里面有一个健康的人,如果把他的器官换给那 5 个人的话,那 5 个人就会得救,当然,这个人会死,你会做么?

还有一个真实的案例。4 个人座船出去,路上遇到风暴,逃到了逃生艇上。没有吃的,里面有个孤儿,不听劝告,喝了海水,病的很严重,其它三个人把那个人杀了,然后挺了过去,得到了救助,到了岸上,他们供认了经过。然后你觉得他是有罪还是无罪呢?

之前还看过一个文章,讲什么是民主的。看 这里 吧。

民主就是少数服从多数么?好像不是这样的,那民主是什么呢,我也不知道,gcd 说他们统治的国家就是民主的,可好像我连想上的网站都上不了,还不经过我同意,这个好像不那么民主。那倒底民主是什么呢?

看了明朝那些事,头一次知道原来内阁是可以驳回皇帝的圣旨的,原来也不是说皇帝说什么就算什么的,他也得和大臣讲道理的。如果给你 10 个人让你管,那很简单,是不是,要干什么的时候,一个人一个人和他说明白就好了。如果是 100 个呢?ok,虽然累点,好像也还是可以说清楚的。可如果是 1000 个呢,显然一个一个说就不靠谱了,得想别的办法,那就是从 1000 个人里面选 10 个人,每人分给他们 99 个人,你有什么事,教会这 10 个人就好了,然后由他们去和手下的 99 个人说明白,简单了吧。用这个模式,不管有多少人都可以搞定了,是不是?实际上军队不就是这个模式么。但发现没有,实际上你的权力被分到了那 10 个人的手上,如果他没有和手下的 99 个人表达你的意思,而表达的是他自己的意思,那么。。。皇帝有时候就得面对这个,想让内阁替你办事,那你就得把权力分给他们。

再来说民主。选举其实就是一个分权的过程,你把你的一部分权力分给了你选的代表,如果你都不知道这个代表你的人是男是女,或是太监的时候,这其实是很恐怖的,对吧。

这个片子没想到看到最后居然还转折了一下,有点意思,呵呵。

分类: Heart 标签: , , ,

用 emacs 写 blog

2010年3月10日 wd 3 条评论

不想看大段文字的可以直接看 http://github.com/wd/work/tree/master/weblogger.el/。

先看看 这个, 我用的weblogger.el 就是从那来的,这个 el 打了 html 支持和 tags(summary) 的支持。

因为写中文 title 的时候,生成的 url 会有一堆的中文字符,看起来就是乱码,不可读,这时候可以在 wp 的后台指定一个 post-slug,url 会根据这个生成。这里我主要是研究了一下对 post-slug 的支持。

weblogger.el 里面 应该是在 weblogger-determine-capabilities 里面判断一下你的 blog 支持的类型,我看了 wordpress 的支持的 methods,里面metaWeblog.newPost, 和 blogger.newPost 应该都是支持的,他应该首选的是 metaWeblog 那个。

然后呢,就是看 wp 的 xml-rpc 文件,里面有个 mw_newPost 对应的就是 metaWeblog.newPost 应该是。在这个函数头试了一把,用的确实是这个。然后就看这里面是怎么处理的了。

这里面最后用的是 wp_insert_post 发的贴子,再看这个函数,能看到里面用的是 post_name 来生成的 post-slug。那么我们只要设置一下这个变量就可以了。在这个函数里面,搜一下 post-name 能看到

// Let WordPress generate the post_name (slug) unless
// one has been provided.
$post_name = "";
if(isset($content_struct["wp_slug"])) {
    $post_name = $content_struct["wp_slug"];
}

我们只要在 weblogger.el 里面 post 一个这个变量就好了。在 post 里面能看到如果有个 X-url 的话,他会 post 一个 link 字段出来。那就好了,把上面那个 wp_slug 改成 link,然后写 blog 的时候加一个字段 X-url 就会使用这个你指定的 url 了。

这个文章就是用 emacs 写的。 :D

又研究了下,再补充点内容,呵呵。(2010-03-10)

问题是这样的,新建一个 post 的时候会出来 subject, keywords, newsgroup 这三个字段,怎么能让他加上 summary 和 x-url 呢,这样我就不用每次都手动写了,怎么弄呢,我就找啊找啊,总算找到方法了。

新建的 buffer 里面不是会有个提示么,什么 ‘–text follows this line –’, 就找这个,看是哪里提供的。在 weblogger.el 里面,找了半天,发现没有这个提示。怎么回事?要相信程序,肯定是会有的,只能是找错了地方。

看看这个 el 的看头,引用了 message.el,搜了一下,这个原来是 gnus 提供的,找到这个 el,搜了一下,找到那几个字符了。原来是在这里面添加的。然后我就尝试定义 message-required-news-headers 这个变量,发现不好用,看来还是得在 weblogger.el 里面弄。在这里面找到 weblogger-edit-entry 这个函数,这个就是发帖子的时候用的,在里面有个顺序往下看,这个 message-goto-keywords 比较可疑,在 message.el 里面搜了下,果然,同时还看到一个 message-goto-summary,加上看看,嘿嘿,果然就搞定了。再找找 x-url,没找到,那就仿 summary 的写一个呗

(defun message-goto-x-url ()
  "Move point to the x-url header."
  (interactive)
  (message-position-on-field "X-url" "Subject"))

这不完了么,这下就爽多了,嘿嘿。。不过如果能把那些 keywords, summary 等字段改成什么 categories,tags 就好了。。。有时间看看。。。

又研究了一下,加点内容。。(2010-03-11)

其实就是上面留的这点东西,我自己改吧了一下,好像能用了。地址在 http://github.com/wd/work/tree/master/weblogger.el/,里面的 permlink 就是指定 url 的。我看发文章好像没问题了。

另外,我试着在这个 mode 里面让他自动启动 auto-complete-mode,可是怎么弄都不行,不知道怎么回事。下面是我在 .emacs 用的代码。

(add-hook 'weblogger-start-edit-entry-hook (lambda()
    (auto-fill-mode -1)
    (abbrev-mode -1)
    (auto-complete-mode 1)
    ))

有人能帮忙不。。。

又修改了一些东西。。可以看看 github 的 commit log 。。。。(2010-03-12)

分类: Linux 标签: ,

昨天和 sssslang 和 xwl 聚了个会

2009年11月29日 wd 没有评论

和 sssslang 倒是很早就见面来着,好像是他那会刚回北京?聊了聊 linux 相关的东西,呵呵。

说起来 linux 用户也挺郁闷的,平时旁边没几个用的,就算是用的,好像也都是 ubuntu 用户,基本就是当 windows 用的,很少主动去挖掘 linux 的一些东西,这些用户比较务实,主要还是在工作方面,开发的东西也都是工作相关的,比较少去做一些无聊的开发。。。所以和他们好像也没什么好聊的。

前两天 #emacs-cn 的 xwl 提议聚会,大家一拍即合,呵呵,定了时间地点,那就聚一个。 :D

聊的东西基本围绕在 emacs, linux, mac 上面。最主要的是 xwl 秀了下他的小黑 macbook 和他的 emacs,sssslang 倒是很详细的问了下 xwl 用的 elisp 扩展,可我对那些不是很明白,我觉得 elisp 就是一个变态的语言。。。对我来说,还记得的可能有下面几个吧。

1 他的 emacs 的标题会显示宋词,会定时变化。
2 有个渐变的扩展,叫做 highlight tail 的,很 cool 吸引小 mm 的必备啊,呵呵。
3 他用了很多定时器,比如执行完编译后,会 split 出来一个新的窗口显示一些编译信息,如果没有错误,那等 3 秒,这个窗口就会自动关掉。还有 1 里面说的那个,也是定时器弄的。
4 有个叫 woman 的东西不错。
5 xwl 和 sssslang 一直强调 ido 是个很不错的东西,不过我是不太明白的。呵呵。
6 xwl 设置打开文件默认就进只读,因为一般来说打开文件都是看看,同时也不可能写很多文件。只读后,还能设置很多单键的快捷键,比如 vim 里面的 hjkli 这些,这样让 emacs 变的有模式起来,我觉得很 cool。不过居然没有别人想到么?那应该有个 vimoper-mod 吧。。。
7 还有个用来画图的 graphviz 很 cool 的。

因为 xwl 用的是 mac,linux 也就是我和 ssslang 了,ssslang 没有本带,基本就是我秀了下我的 kde,openbox,conky 这些,好像也没别的了。说到 linux 有个郁闷的,就是我没使用什么 networkmanager,wicd 之类,都是手动配置的 wpa_supplicant ,这样就需要知道 wifi 的 key 的类型什么的,没办法得到的话就只能猜,很不方便。人家 mac, windows, s60 都连上 wifi 上网了,我这还在猜 key 的类型。。。 刚发现,iwlist 实际是能显示 key 信息的。

mac 的效果还是很不错的,国内的很多 mac 用户真是白瞎了这个尤物了,装什么 windows。xwl 可真是 apple 的忠实 fans,花 200 块钱升级系统。。。

说了这么多,我感觉我很像是去打酱油的。。。

说实话 Starbuck 的咖啡好像也不怎么样。。。尤其一会就凉了。。很郁闷,不过回来和老婆说,老婆说:你个傻子,就不知道点一个冰的啊。。。是啊,我为什么没点一个冰的呢?。。。。

分类: Linux 标签: , ,

把 emacs 做为 python ide

2009年7月13日 wd 1 条评论

emacs 用的其实不是很多,不过他实在是个好东西,各种 mode,用熟了肯定能帮你提升不少工作速度。

我用 emacs-cvs , ropemacs( dev 版, > 0.6 ), rope ( > 0.9.2 ), company-mode ( > 0.4.2 ) 这几个软件在 gentoo 里面都还没有,我自己写了几个 ebuild。

装好之后,基本就是 require 一下就好,我没做什么设置,效果如下。

here

分类: Linux 标签: ,