义乌之旅

Preface

借着学校开运动会的间隙,自己是一个人流向义乌,小杰由于“学习实践”原因还 留守在校园。早上很不情愿地从温暖的被窝里爬出来了,早上的太阳莫如昨日的太 阳来的给力。匆匆的收拾打点后,也就奔向学校南门了。只是在哪里打的着实困扰 了我,还好在去往骆家塘的路上遇到了师傅,遂上路到了东站。买票,安全检查, 一个小时有余的奔波后总算到了义乌。

继续阅读

烧烤之旅

又进入了了碌碌无为的生活状态,却没有可以停下时间好好整理下自己的心情。 烧烤的周末已经过去好久了,却于运动会的现在才可以静下心整理这些过往 的记忆。

继续阅读

轻量标记语言的比较

轻量标记语言

txt2tags

最开始接触的轻量标记语言,是在啄木鸟社区浏览 python 时意外收获的。于自己 使用 markdown 记录心得和写文章之前一直使用 txt2tags。txt2tags 给自己的影 响很好,使自己在庞大而强大的TeX 也有了另外的选择。

  • txt2tags 的语法很简洁,但还是基本可以满足要求,

  • 它的一个特点是输出格式非常丰富,有些格式自己还真是很少有机会接触到,这 也是很体现了此软件的哲学思想:“ont to all”。

  • txt2tags 也支持 css 对输出的html 进行美化,所以 html 输出还是有很大的自定义性的。

自己而言,不是很喜欢其语法,后来有预见了很偏爱的 markdown,遂弃之。 github 现在还是不支持 txt2tags,当然此为后话。

asciidoc

LinuxToy 也有对 asciidoc 做过介绍,自己也有看到过,但当时对 此软件也未有任何的在意。后来也是慢慢的了解轻量标记语言才开始真正的有接触 和使用。

  • asciidoc 理论上可以支持所有常见的文档格式,因为 asciidoc 的后端 (backend) 为 html 和 docbook。通过 docbook 作为中间格式,自然可以实现 groff,pdf 等格式的支持。

  • asciidoc 的功能很完备,可以当作是完整的排版系统,一些功能也很贴心,例 如 'verse' ,很多项目也是选用此作为文档工具,例如韦诺之战GitVimperator

  • asciidoc 的中文支持不好,或者言之为对 utf-8 支持不佳,但是有相应热心网 友相应的改进版本。另外关于 asciidoc 的中文介绍和使用也很少,使用还是要 参考文档,但还是很简单的。

reStructeredText

reStructeredText 简称为 rst,是 python 的 docutils 的组成部分,可以称 之为 python 的官方文档工具。

在轻量标记语言里,rst 应该可以算是功能最完备的,但是自己不是很习惯,但是 使用起来总是感觉不是很顺手,写 rst 文章都要查阅语法,推荐 pythoner 使用。

github 的 中文 rst 文件渲染还是会乱码,因此现在使用的很少了。

markdown

  • markdown 的语法可读性很好,很偏爱 markdown 的语法,非常的简洁而且也很 符合自己的偏好。但是比较麻烦的是对于表格没有语法支持,这也是由于 markdown 自身的哲学所致,其初衷并不是替代并 html,只是为了提高文件的可 读性。最近写作文章和记录笔记,经常要插入表格,只能使用内嵌的 html,对 于不熟悉 html 的自己来说也实在是很折腾。

  • markdown 另一个很吸引自己的是其语言实现非常丰富, perl(原始实现), c, java, lua, python, javascript 都有相应的实现,对于 想 hacking 的自己也是很好的素材。当然,你可以整合这些插件,例如可以把 lua 的插件整合进 scite 编辑器,scite 也可以成为 blog 文章编辑器。

  • github 也可以很好的支持 markdown 格式,这对于自己太方便了。

orgmuse

org 以及 muse(原来的 emacs-wiki) 都是只存在于 emacs 世界的轻量标记语言。 muse 使用很方便而且语法高亮也很强大(依赖于 htmlize 插件),原来也有使用写 作文章的经历。muse 现在基本慢慢被 org 替代了,虽然它们的初衷不一致。 org 最近发展很快,从 emacs23 开始已经成为了其标准组件,语法与 muse 基本兼容。

  • org 的功能很完善,把它列为轻量标记语言或许也不是太完善。org 的功能主要 分为文档发布(wiki)或者其本来的 GTD 管理。自己使用 org 也基本只是用其日 程规划的功能,文档发布功能很少用。在 emacser 中文站 大伙基 本都是用 org 来撰写文章的,只有自己是用 markdown 的“异类”了,自己太过 偏爱 markdown 了。

  • “背靠大树好乘凉”,有了 emacs(elisp) 的支持,org 可拓展性非常好。但是由 于应用只限于 emacs,你在使用 org 之前还要先进入 emacs 的世界,要付出很 多的学习代价,但是学习代价应该还是值得的,毕竟 emacs 是 “神的编辑器”。

summary

可以参考下 wiki 的比较介绍,看一下众多轻量标记语言的语法差异和输出格 式支持,选择自己喜欢的。

当然,由于轻量标记语言很丰富,因此它们之间的语法相差还是很大。如果经常要 在不同的标记语言之间切换,那大脑的思维转换太累了,那要好好查阅手册了。

自己一直很偏爱 markdown,现在文章写作基本都是用其描述的。而且也可以很方便与 html 整合。

Auctex Emacs 中的 TeX 排版系统

简介

unix 世界的邮件客户端很丰富,有跨平台的 thunderbirdevolution, 无穷定制性的 muttemacs 上的邮件客户端有强大的 gnus,作为 新闻组阅读器实在舒适。

unix 的哲学思想为 "do one thing better",因此在 unix 的世界中,邮件程序 依据功能可以细分为 [MUA],[MTA] 和 [MDA]。mutt 和 gnus 这些定制性强的邮件客户端也很依赖这些强大 的工具,功能的实现也依赖于这些工具的搭配,曾经自己也有几番尝试 mutt 的经 历,但都失败了。

几番搜索比较后,选择了 mew 作为邮件客户端,一如 所有的 emacs 的插件,强大和无穷的定制性。

继续阅读

转换 pdf 为 png 图片

写作论文时,时时需要画流程图。原来有用 pgf 画流程图,很方便而且生 成的 pdf 插入 tex 也很方便。但是论文必须要用邪恶的 word 排版,智能用 imagemagick 中的 convert 将 pdf 转换成 png 格式,但是转换后的图片很 模糊,插入 word 之中根本无法入眼,很影响文档的美观,遂只能作罢。后来换用 了 edraw,倒还凑合,但总是感觉不是太满意。

最近,阅读了 LiYanrui 的文档,才发觉是 convert 的参数设置问 题导致输出的图片模糊。

convert 命令有许多选项参数,本文用到的选项如下:

  • -trim:裁剪图像四周空白区域;
  • -transparent color:去除图像中指定的颜色;
  • -density geometry:设定图像的 DPI 值,通常为 96;
  • -antialias:让图像具有抗锯齿的效果;
  • -quality:图像压缩等级。

然后用如下的 convert 命令对 pdf 文件转换:

convert -quality 100 -antialias -density 96 -transparent white -trim test.pdf test.png

转换输出后的 png 图片非常好,插入 word 也很好了。

win7 下的超级终端替代软件

windows7 默认已经不再提供“超级终端”组件,但是 arm 的开发始终无法离开对串 口的调试,需要相应的串口调试软件。

  • putty 寻找超级终端的替代品的途中,一直遗忘了 putty 这个强大的工具。后来发现 putty 也是支持串口调试的,只需要在"Connection type"选择 "Serial",再选择 合适的串口和通信波特率即可。

  • realterm realterm 是设计用于采集,控制和调试二进制文件以及其他数据流的终 端软件,它的调试功能强于超级终端,可以一试。teraterm 也是不错的替代 软件。

  • dnw samsung 为 s3c2440 等提供的串口以及 usb 调试软件,学习 arm 时最初 使用的串口调试软件。现在唯一还有用的为 usb 烧录功能,其他功能是在是软肋,串 口只能选择 com1-com4,字体无法选择。

  • linux 下用 kconsole+minicom 的组合,非常方便,而且字体功能都很强大。

mew-emacs下的邮件客户端

简介

unix 世界的邮件客户端很丰富,有跨平台的 thunderbirdevolution, 无穷定制性的 muttemacs 上的邮件客户端有强大的 gnus,作为 新闻组阅读器实在舒适。

unix 的哲学思想为 "do one thing better",因此在 unix 的世界中,邮件程序 依据功能可以细分为 [MUA],[MTA] 和 [MDA]。mutt 和 gnus 这些定制性强的邮件客户端也很依赖这些强大 的工具,功能的实现也依赖于这些工具的搭配,曾经自己也有几番尝试 mutt 的经 历,但都失败了。

几番搜索比较后,选择了 mew 作为邮件客户端,一如 所有的 emacs 的插件,强大和无穷的定制性。

  • 可以自给自足,不依赖于 MTA 和 MDA,因此 mutt 的跨平台要好的多,可以在 windows 上使用。
  • 强大的过滤器定制,在 mew 中称为 refile。而且 mew 自动 refile 还是比较 准确和人性化的。
  • mew 为来自日本的作品。因此相比 gnus 对 cjk 的支持要完善。
  • mew 内建的丰富模式,一共六种,有 summary, virtual meaaage, draft, header, edit, addrbook mode。
  • mew 的配色相比 gnus 实在是非常的舒服,也是最初吸引自己的原因。
  • mew 内建的无处不在的强大的补全机制,使得撰写处理阅读邮件很便捷。

安装

mew 的安装在 linux 下很简单,如果是 gentoo 的话,可以直接通过命令 "emerge app-emacs/mew" 安装。如果是想要手动管理各个 elisp 拓展,那可以 通过 autotools 进行安装,更推荐前者。mew 在 windows 上的安装可以参考 mew 目录下的 "00readme.w32" 文件。

mew 在 windows 的安装上比较折腾,不得不说, emacs 在 windows 上使用相较 于 unix 要辛苦的多。mew 对于邮件附件的处理依赖于 unix 的各个组件, windows 上的 mew 基本是无对附件的处理能力。如果需要 mew 的 ssl 加密连接功能,必须要安装 stunnel3 版本,stunnel4 的版本总是会处于无法相 应的状态。

(if (string-equal system-type "windows-nt")
    ;; Note,in windows,you must use replace stunnel4 with stunnel3 version.
    (setq mew-prog-ssl  "C:/Program Files/stunnel/stunnel.exe")
  (setq mew-prog-ssl "/usr/bin/stunnel"))

配置

mew 的 初始化必要代码建议写入 ~/.emacs 文件中,而 mew 单独的配置建议保存 在 ~/.mew.el 文件中,mew 在启动时会读取此文件中的配置内容。

初始化配置

安装完之后还需要在 ~/.emacs 文件中加入如下必要代码以告诉 emacs 如何启动 mew。

(autoload 'mew "mew" nil t)
(autoload 'mew-send "mew" nil t)

;; Optional setup (Read Mail menu for Emacs 21):
(if (boundp 'read-mail-command)
    (setq read-mail-command 'mew))

;; Optional setup (e.g. C-xm for sending a message):
(autoload 'mew-user-agent-compose "mew" nil t)
(if (boundp 'mail-user-agent)
    (setq mail-user-agent 'mew-user-agent))
(if (fboundp 'define-mail-user-agent)
    (define-mail-user-agent
      'mew-user-agent
      'mew-user-agent-compose
      'mew-draft-send-message
      'mew-draft-kill
      'mew-send-hook))

帐号设置

对于邮件服务的设置,在 mew 中即被映射为对 mailbox 的设置,mew 中对于 邮件的组织是通过 mailbox 完成的。相应的有 3 种类型的 mailbox,分别表示着 local/pop/imap/nntp/,即不同的邮件箱对应着不同的邮件协议,通过变量 proto 进行设置。

包含邮件的 mailbox 在 mew 中被称为 folder,而 folder 的名称由两部分组 成:proto + string。proto 相应的有三种类型,分别以 +/$/%/- 对应着 local/pop/imap/nntp, 如 +inbox 即为最典型的 folder。相应的 mew 的文件 夹分为两类,本地 folder 和 远程 folder,本地 folder 有四种类型, +inbox/+draft/+quene/+postq。远程 folder 根据协议既可以分为三种类 型,$folder/%folder/-folder,如$inbox/$inbox/-fj.mail.reader.mew。

通常来说,如果需要收发邮件,可以设置 'mew-name','mew-user', 'mew-smtp-server' 变量,然后根据收取邮件时使用的协议,再设置 'mew-pop-server' 或是 'mew-imap-server' 即可。

例如,如果你需要通过 POP3 的方式使用 Gmail,以下即为简单的示例。

(setq mew-name "username")
(setq mew-pop-user "popuser@gmail")
(setq mew-pop-server "pop.gmail.com")
(setq mew-smtp-user "smtpuser@gmail.com")
(setq mew-smtp-server "smtp.gmail.com")

当然,mew 也提供了通过 'mew-config-alist' 变量对相应变量进行集中设置管理 的方法。如下为相应的示例。

(setq mew-config-alist
      '(
        ("default"
         ("pop-server"           . "pop.gmail.com")
         ("name"                 . "username")
         ("user"                 . "user")
         ("mail-domain"          . "gmail.com")
         ("pop-user"             . "popuser@gmail.com")
         ("smtp-user"            . "smtpuser@gmail.com")
         ("smtp-server"          . "smtp.gmail.com")
        ))

从 mew 6.1 版本开始,mew 使用了改进格式的配置文件,但旧的配置文件格式也 可以同样兼容,更推荐采用新的配置文件格式。关于新旧配置文件之间的区别可以 参考 mew 的使用手册。

如下为上例对应的新的文件配置格式。

(setq mew-config-alist
      '(
        (default
         (pop-server            "pop.gmail.com")
         (name                  "username")
         (user                  "user")
         (mail-domain           "gmail.com")
         (pop-user              "popuser@gmail.com")
         (smtp-user             "smtpuser@gmail.com")
         (smtp-server           "smtp.gmail.com")
        ))

'mew-config-alist' 更强大方便的使用之处是实现 mew 对多账户的良好支持, 可以同时设置 imap/pop3/nntp/local folder。如下为 gmail 的 imap 和 smtp 的设 置和新闻组的简要示例,示例采用新的 'mew-config-alist' 配置文件格式。

(setq mew-config-alist
      '(
        ;; Default fetch mailbox is IMAP
        (default
         (mailbox-type          imap)
         (proto                 "%")
         (imap-server           "imap.gmail.com")
         (imap-user             "imapuser@gmail.com")
         (name                  "User Mew")
         (user                  "user")
         (mail-domain           "gmail.com")
         (imap-size             0)
         (imap-delete           t)
         (imap-queue-folder     "%queue")
         (imap-trash-folder     "%Trash") ;; This must be in concile with your IMAP box setup
         (smtp-auth-list        ("PLAIN" "LOGIN" "CRAM-MD5")) 
         (smtp-user             "smtpuser@gmail.com")
         (smtp-server           "smtp.gmail.com")

         ;; news group comp.lang.c
       (usenet
        (mailbox-type         . mbox)
        (proto                . -)
        (nntp-server           "news.aioe.org")
        (nntp-user             nil) ;; should be nil defaulty
        (nntp-header-only      nil)
        (nntp-newsgroup        "-comp.lang.c") ;; little '-'
        (nntp-size             0)
        (nntp-msgid-user       "User Mew")
        (smtp-auth-list        ("PLAIN" "LOGIN" "CRAM-MD5"))
        (smtp-user             "smtpuser@gmail.com")
        (smtp-server           "smtp.gmail.com")

        (mailinglist
         (mailbox-type          pop)
         (proto                 +)
         (pop-server            "pop.gmail.com")
         (name                  "User Mew")
         (user                  "user")
         (mail-domain           "gmail.com")
         (pop-auth              pass)
         (pop-user              "popuser@gmail.com")
         (smtp-user             "smtpuser@gmail.com")
         (smtp-server           "smtp.gmail.com")
        ))

在如上的示例中,我们分别定义了三个 folder,"default","usenet" 和 "mailinglist"。如果我们切换至 "usenet" folder,mew 默认会收取 comp.lang.c 新闻组上的帖子,而如过切换至 "mailing" folder,mew就会使用 pop 协议收取 Gmail 上的邮件。默认使用 mew 时,使用的为 "default" folder, 即使用 imap 协议 收取 Gmail 邮件。在 summary-mode 中,可以通过快捷键 "C" 方便地在不同 folder 之间切换。

引用,回复与签名档

mew 可以灵活的设置如何引用邮件上下文,定制引用的格式。mew的引用是由变量 mew-cite-fields 控制,有 From,Subject,Date 域,具体的引用样式由 mew-cite-format 设置。 mew 默认的配置如下:

(defvar mew-cite-fields '("From:" "Subject:" "Date:"))
(defvar mew-cite-format "From: %s\nSubject: %s\nDate: %s\n\n")
(defvar mew-cite-prefix "> ")

如果需要修改为 Gmail 的引用格式,可以只选择 From 和 Date 域,然后修改 mew-cite-format 即可。

(setq mew-cite-fields '("Date:"  "From:"))
(setq mew-cite-format "On %s %s wrote:\n\n")

如何回复,回复的位置,大概是邮件中争论最多的地方。基本上所有邮件的 web 客户端,Gmail,outlook 都默认使用上回复(top-posting),但是邮件列表和新闻 组(usenet)提倡下回复(bottom-posting),在一个社区中使用“错误”的风格,可能 被视作严重违反网络礼仪,从而遭致社区成员的激烈反应。 可以参考 wikipython的邮件列表规范 和礼节

回到 mew 的设置,通过设置变量 mew-summary-reply-with-citation-position 可以选择是使用上回复或是下回复。如果设置为 body,即回复出现在引文之前, 名为上回复,如设置为 end,在引文后回复,使用下回复样式。

mew 默认使用的邮件签名档位于 ~/.signature 文件,由变量 mew-signature-file 控制,快捷键 'C-c TAB' 会在光标处插入签名档。建议将签名档放置在邮件的末 尾,可以通过 mew-signature-as-lastpart’ 与 ‘mew-signature-insert-last’ 设置。如果需要在撰写或是回复邮件时,需要自动插入签名档,可以通过 mew-draft-mode-newdraft-hook 进行插入。

(setq mew-signature-file "~/Mail/signature")
(setq mew-signature-as-lastpart t)
(setq mew-signature-insert-last t)
(add-hook 'mew-before-cite-hook 'mew-header-goto-body)
(add-hook 'mew-draft-mode-newdraft-hook 'mew-draft-insert-signature)

refile

对于邮件列表和新闻组,邮件过滤和 thread 功能是不可或缺的。 mew 的邮件过滤功能,或是 mew 的术语称谓的 refile 很强大而实用。refile 功能对于 pop 邮箱而言非常实用,gmail 的 imap 由于可以使用 filter 与 label 的组合,也 非常的完美。

如果为设置任何的 refile rules,在 summary-mode 里面按 o 即可对当前邮件进 行分类,mew 会问你把邮件分类到哪个文件夹里面去,并提供了一个默认的选项, 通常情况下默认选项就是正确的选项,所以直接回车就可以了。

虽然 mew 的 refil-by-guess 很方便,但是更加使用的还是自定义 refile rules。 mew 提供的 refile 非常丰富,但感觉实用可定性好的还是 Guess by user defined rules。例如,如果你订阅了 octave,freebsd 的帮助邮件列表, 很自然的会需要把此三个邮件列表的邮件分开存放在不同的本地文件下,而通常的 邮件会存放到 inbox folder。相应的只需要把邮件头的 To 和 Cc 域里包含有 "@octave.org" 的邮件 refile 到 +math/octave 文件夹中,同时把 To 和 Cc 域里含有 "@freebsd.org"的邮件 refile 到 +unix/freebsd,就可以使用如下的实例代码。 更详尽的 refile rules 可以参考 mew 的使用手册。

(setq mew-refile-guess-alist
      '(("To:"
         ("@octave.org"                       . "+math/octave")
         ("@freebsd.org"                      . "+unix/freebsd"))
        ("Cc:"
         ("@octave.org"                       . "+math/octave")
         ("@freebsd.org"                      . "+unix/freebsd"))
        (nil . "+inbox")))
(setq mew-refile-guess-control
      '(mew-refile-guess-by-folder
        mew-refile-guess-by-alist))

完成 refile rules 后,在收取邮件后,按下 'M-o' 即可对当前 mode 下的邮件 按照定义的 rules 进行 refile。然后,你想要查阅 octave 邮件列表,只需要按 下 'g' 与 '+math/octave',就可以切换到 octave 文件夹,此时再按下 'tt', 既可以进入 mew 提供的 thread 功能,此时的 mode 称为 virtual folder mode,mew 会指示出各个邮件之间的层次关系,非常方便。

如果只使用小写字母命名自己的邮件文件夹的话,可以把 "mew-use-fast-refile" 设置为 t 用于加快速度。

使用 folder

在邮件服务设置完成后,就需要获取远程的邮件到本地的 +inbox folder。当输入 'M-x mew',mew 会依据 'mew-mailbox-type' 获取相应协议的邮件。但此时 位于 summary 模式时,只需输入 'i' 即可。如果用 mew 处理邮件一段时间后,需要再 查收远程 folder 上的邮件,试试 's' 快捷键。对于 IMAP 和 NetNews,更加建 议使用 's',而非 'i'。当按下 's' 时,mew 会向你询问 range,一般而言输入 'sync' 比较合适,这会同步本地 folder,即删除已在远程服务器上删除的邮件和 收取新接受的邮件。当使用 'C-u s'快捷键时,可以在仅获取邮件头和获取完整邮 件信息间切换,相应的这是由诸如 'mew-pop-header-only' 变量定义的。对于邮 件列表和新闻组而言,跟推荐获取完整的邮件信息,刻意离线查阅,非常方便。

使用 Gmail IMAP 非常方便,使用 mew 配合 Gmail 的 filter 与 label 可以对 邮件进行很有效的管理。如你当下在 %inbox,如果需要切换到 'All sent',只需 要输入 'g',然后输入 '%[Gmail]/All Mail' 或者使用 mew 提供方便的自动补全 机制。mew 使用 folder 管理邮件,而在各个 folder 进行切换的快捷键既是方便 的 'g'。

快捷键

mew 的日常使用可以通过各种 mode 上的菜单完成,使用快捷键也非常方便。

w 撰写新邮件
a 回复邮件,不带引用
A 回复邮件,带引用
f 转发邮件
r 重新发送邮件
SPC 阅读邮件
y 保存文件(可以保存信件全文、信件正文、附件)
C-c C-l 转换当前邮件的编码格式
C-c C-a 加入地址薄
C-u C-c C-a C-c C-a 多加入昵称和名字
C-c C-q 不保存退出
C-c C-a 准备插入附件
mew-attach-copy 用复制方式加入附件
mew-attach-link 用链接方式加入附件
mew-attach-delete 删除附件
C-c C-c 发送邮件
C-c RET 保存邮件到发送队列
C 如果设置了多个邮箱,用 C 命令切换
Q 退出Mew

Tips

summary-mode

各个 folder 的 summary-mode 显示邮件的样式由 "mew-summary-form' 控制,通 过对此变量的控制,你可以具体定制 summary-mode 显示的邮件域。特别的, summary-mode 中的 from 域还可以由变量 'mew-summary-form-extract-rule'进 行具体的设置,可以在 'nickname",'name",'address" 和 'comment。 自己为了使 summary-mode 显示看起来不是很拥挤,不显示 "Body:" 域,并且 增加了 "Subject:" 域,更改 from 仅仅显示寄件人的 name。

(setq mew-summary-form
      '(type (5 date) " " (14 from) " " t (0 subj)))
(setq mew-summary-form-extract-rule '(name))

在设置调整好变量后,你可能会发现 summary-mode 还是没有任何变化,这是由于 mew 的默认缓存机制所致,你可以手动删除缓存文件强制 mew 重新生成。缓存文 件位于相应 folder 下,例如:~/Mail/inbox/.mew-summary 。

Spam

设置 "mew-summary-form-mark-spam" 为 t 可以在 spam message 前制动添加 D。

introduce to vim configs structure

Introduction

此文章简要介绍一下此 vim 配置文件和分享 vim 的实用插件。

自己的平时文本编辑和 coding 很依赖 vim,无论是在 windows 还是在各种 linux distributions 上,因此必然就要设计到配置文件的适用性问题。windows的确是 比较累人的系统,vim 所写作的各种外围工具(ctags, cscope, grep)都需要额外安装, 而且 windows 处理路径与 unix 路径很不相同,非常不习惯。

为了实现各个平台的配置文件可以及时更新,源代码管理系统是必不可少的。自己 选择了 git。由于一年中只有中总有一段时间没有网络,因此 svn 不大适合自己。而分布 式的 mercurial 虽然跨平台性要明显优于 git,但是托管平台可供选择的余地不 大,而且 git 的各种客户端非常丰富,因此选择了 github 这个优秀的源代码 hoster。

Structer

由于自己的 vim 配置文件很庞杂,因此要好好的组织管理。

.vimrc(windows上是_vimrc) 是默认的配置文件,自己是将此文件作为对各个局部 文件的管理文件,可以灵活的控制载入多少配置文件,一般情况时都会载入,vim 还是比较轻便的 editor。

局部配置文件还直接放置在 HOME 目录下,感觉还不是很合理。其余相关的插件都 放置在 ~/.vim(windows 下是 ~/vimfiles) 目录。

" load appearance settings
source $HOME/appearance.vim
" load programming related settings
source $HOME/program.vim

现在还只有两个局部配置文件,以后随着自己对于 vim 使用深入还会再添加其他 的自定义文件。appearance.vim 文件主要是控制 vim 的外观,例如编码,字体和 颜色主题。program.vim主要用来控制各种编程相关的设置和一些插件。

外观设置

外观设置主要有文件 appearance.vim 文件控制。这里的外观比较广泛,包括 vim 的编码设置,中英文字体和颜色方案(colorscheme)。

编码设置

vim 默认是使用 UTF-8 编码的,vim 的编码功能很强大,对双字节语言的支持非 常完善。可以设置读取文件的编码顺序,也可以指定默认的保存文件编码。另外, 当然也可以设置 vim 的菜单栏和信息的语言。

在 vim 的编码系统中,filencodings 表示读取文件时编码的依次自动探测顺序。 如果要获得对于中文的支持,需要添加 "chinese,taiwan",就可以处理以 gbk 和 big5 编码的中文文件了。相应的 fileencoding 便是保存文件时的编码,由于要 经常跨平台编辑文件,首选 utf-8。encoding 表示 vim 内部使用的编码,设置为 utf-8 是 很妥当的。

默认情况下, vim 会根据当前的语言环境,例如如果是 "zh_CN.UTF_8",就会显 示中文界面和信息。但如果你喜欢英文的界面,你也可以更改设置。其中, langmenu 可以设置菜单栏的语言, $LANG 可以用来设置信息的语言。

在读取和保存文件时,还必然会碰到不同的文件格式,即 EOF 不同的问题。vim 也可以设置默认的保存格式。此处变量 fileformats 表示可以读取的文件为 unix 或 是 dos 格式,而fileformat 表示只用 unix 格式保存文件。

if has("gui_running")
    set encoding=utf-8              " always use UTF-8 as vim internal encoding
    " set input character to be encoded in utf-8
    let &termencoding = &encoding
    " configured to edit file encoded by utf-8,GBK,japanese and BIG5
    set fileencodings=ucs-bom,utf-8,chinese,taiwan,japan,korea,latin-1
    set fileencoding=utf-8          " always use utf-8 to save file

" solve menu characters unrecongnizable
    " menu language settings 
    source $VIMRUNTIME/delmenu.vim
    set langmenu=none               " use english menu defaultly
    source $VIMRUNTIME/menu.vim
    " solve console output characters unrecongnizable
    " set environment variable $LANG
    let $LANG = "en_US.UTF-8"
endif

" file fomats autodetection is enabled
set fileformats=unix,dos
" always use unix format to save files,Don't display ^M character
set fileformat=unix

字体设置

vim 的字体设置可以非常惬意,可以分别为中文和英文指定不同的字体。但是在 windows 上,可能默认不能使用所有系统中所有的中文字体,你可以下载另外一个 recompile and hacked 的 vim,就可以正常使用那些优雅的中文字体(雅黑)。 在 windows 上,使用 Consolas, 感觉要比 DejaVu Sans Mono 更舒服,在 linux 上, 肯定是当仁不让的 "DejaVu Sans Mono + WenQuanYi Zenhei" 的组合。

变量 guifont 控制默认的使用字体, guitontwide 可以另外设置双字节语言所使 用的字体,就是CJK,就可以设置使用的中文字体。

if has("win32")
let s:win_font = "Consolas"
let &guifont = s:win_font
elseif has("unix")
    let s:win_font = "DejaVu Sans Mono"
    let s:unix_chs_font = "WenQuanYi Zen Hei Mono"
    let &guifont = s:unix_font
    let &guifontwide = s:unix_chs_font
endif

这里的代码会涉及到一些 vim script 的用法,简单说明一下。

"s:win_font" 和 "s:unix_font" 以及 "s:unix_chs_font" 都是为了更好的模块 化而设置的局部变量,用来存放具体要设置的字体的名称(设计是用来从 .vimrc 传入的,现在还未实现,还在学习中),然后再把相应的值赋值给 guifont 变量。这里用到了 let 语句,如果有兴趣,可以参考 vim 的参考手册。

颜色主题以及工具菜单栏

由于 gvim 的工具栏不是很美观而且基本还是更多的倾向于 cli,因此默认不显示 工具栏。

if has("win32")
    "set guioptions-=m              " disabel menu
    set guioptions-=T               " disable toolbar
endif

vim 也可以变得很靓丽,可以很柔和,也可以很深沉。vim 的颜色主题非常丰富, 自己也有一些比较偏爱的主题。在淡系主题里,eclipse 和 pyte 很不错,在深色 系主题里,选择的余地很大,例如经典的 desert 以及 desertEx,oceandeep 和 zenburn 也是非常舒服。

vim 的颜色主题也分为两种,一种是只适用于 cli 的,另外是 cli 和 gui 都可 以使用。为了避免 cli 下可能的兼容问题(在 cmd 下曾出现过问题),在没有 gui 情况下, 默认不使用主题。

let s:theme = "tango-morning"
if has("gui_running")
    let g:colors_name = s:theme
else
    " colorscheme can't work in windows cmd 
    if has("unix")
        let g:colors_name = s:theme
    endif
endif

这里的代码为了更好地可能实现的模块化,舍弃了部分代码的可读性。

默认的颜色主题设置是通过命令 "colorscheme" 设置的,这里的颜色主题切换是 直接使用此命令背后的 vim 内置的全局变量 "g:colors_name" 变量了,通过定 义局部变量 s:theme 用于存放当前设置的颜色主题。

常规设置

如下是一些比较杂的使用常规设置。

set nocompatible                           " always in no compatible mode
set number                                  
set noerrorbells                           " No sound on errors.
set novisualbell
set t_vb=
set showmatch                              " show matching bracets
set mouse=a                                " mouse work in console well
set clipboard+=unnamed                     " share clipboard with windows system

" sometimes backspace can't delete characters in insert mode
" allow backspacing over indent, line breaks and start of insert
set backspace=indent,eol,start
set autoread                                
" Set to auto read when a file is changed from the outside
" status line
set laststatus=2                          " always display a status line
set statusline=%t%r%h%w%m\ [%Y]\ [%{&fileformat}]\ [%{&fileencoding}:%{&encoding}]\ Line:\ %l/%L:%c\ Percentage:\ %p%%-%P

coding相关设置

缩进(indent)

使用 vim 进行 coding 时,第一个要涉及的问题是如何处理程序代码之间的缩进, 以及缩进是使用 tab 还是 spaces 键,以及默认的缩进长度是4个字符还是8个 字符。对于所谓的 coding style,程序员们对此还是有所争执的。

自己推荐的 coding style 是只使用空格键做缩进,只是不想再被 tab 和空格键混 合所折腾,对于绝大多数的语言(python,ruby)是使用4空格的缩进。但是,对于 C 语言,还是使用 unix 传统的8个字符的缩进,vim 对此也是额外对 C 语言提供了 设置选项(cinoptions)。详细的可以参考 program.vim对于 coding style 的说明 。

在 vim中, shiftwidth 用来设置默认的缩进宽度,tabstop 为 tab 的宽度, expandtab 变量控制是否在自动缩进用等量的空格替代 tab 字符。对于 C 语言, 可以使用 cinoptions 进行详细的设置,vim 手册中也提供了 gnu style 相应的 设置,可以参考。

当然,你也可以用你喜欢的 coding style 去快乐的 coding,vim对此也有很强大 的支持,以后还会介绍。

另外,建议一行的字符数最好不要超出 80 个字符,也是 unix 历史传统。

set cindent
set cinoptions=>8       " tab characters for c is 8 characters.
set shiftwidth=4        " default indent width(not for c) is 4 characters
set tabstop=8           "  width is 8 characters set softtabstop=4       " Press an tab forward 4 characters set expandtab           " always use spaces to insert a  

折叠设置

vim 和 emacs 都是历史悠久优秀的 editor,但是个人体会折叠功能不如现在的编 辑器如 scite,eclipse 好用,但还可以,自定义的空间比较大。

vim 一共有 5 种折叠方法,依次为手工折叠、缩进折叠、语法折叠、标记折叠、 表达式折叠和根据标志折叠。可以通过变量 foldmethod 选择具体的折叠方式,常用的 为 syntax 和 indent。分别为根据缩进折叠这根据语法折叠。缩进折叠适用于绝大数的 编程语言,特别适用于python,而对于 C 语言,vim 提供了很好的 syntax folding 支持。

常用的快捷键为 zr 和 zm,分别为折叠的更少(reduce)更多(more),zR 和 zM 可 以打开或是折叠所有折行,实际上,这几个命令只是增减了变量 foldlevel 的值。 通过设置变量 foldlevel 可以设置折叠层级,例如 "set foldlevel=100" 可以设 置打开时默认不折叠,而 "set foldlevel=0" 时打开文件时会折叠所有可能的折行。

" Fold config
" use autocmd to set syntax foldmethod for c and h filetype.
autocmd BufNewFile,BufRead *.c set foldmethod=syntax
autocmd BufNewFile,BufRead *.h set foldmethod=syntax
if &filetype == "c"
    " FIXME: can't set right foldmethod when detect c filetype
    " fold based syntax file for c source files
    set foldmethod=syntax
else
    " fold based indent for mostly languages
    set foldmethod=indent
endif
"set foldlevel=100      " dont't fold when open
set foldlevel=0         " fold when open

coding convenient 设置

coding 时,语法高亮是必不可少的,打开了自动对长行的自动换行的设置。

syntax enable
set textwidth=72        " width of text for comments
set formatoptions+=mM   " vim can process multi-characters reformat
set wrap
set linebreak

在搜索时,高亮搜索词是很使用的,打开增量搜索可以实时性的更新,不忽略字母不大 写,不循环搜索。

" search setting
set hlsearch            " Highlight search thingss
set incsearch
set noignorecase
set nowrapscan          " no serach wrap

实用插件

使用过 vim 的很多插件以后,最后剩下的还在使用的插件也不多。只有[taglist], [autocomplpop],[bufexplorer]。关于插件还会做单独的介绍。

emms 使用简介

简介

emmsemacs 中的多媒体系统,可以用来在 emacs 调用外部的音乐播放器播放音乐。通过 [emacs] 的 elisp 脚本的控制,可以自定义播放列表的样式,状态栏的显示甚至歌词的自动下载 和动态显示。

安装

emacs 及 emms

在 windows 下,建议使用 emacsw32,[emms] 建议使用 emms-3.0 版本,也可以使用最新的 git 版本,看个人喜好。

外部程序

使用 emms 比较麻烦的是在 windows 下没有 native 的 cli 音 乐播放程序,因此你需要自己下载所需的音乐播放软件,建议使用 mplayermpg123。linux下,mpg321mpd 或许效果会更好。特别是 mpd,它的设计思想就是 c/s 架构的。

另外,为了显示歌曲信息,需要解析音乐文件的标签,如果你的音乐文件的 tags 比较有 序,那就可以使用 [mp3info]来对你的音乐读取标签,可以用来做播放列表和状态栏的进一 步处理。如果你的音乐文件的 tags 处于无序,也可以考虑直接使用音乐文件名作为标签。

自己选择的是 mplayer,emms 对它的支持比较好,mpg123 可能未来会考虑拓展。

配置

基本配置

emms 提供了一个 emms-setup.el 可以方便地进行必要的设置,按照功能需求可以使用 minimalistic, standard, all 以及包括了各种还在测试中的功能的 devel。 自己选择的是在 standard 的基础上增加自己需要的插件。

 
(require 'emms-setup)
(emms-standard)
;; no cli volume setup tools in windows
;(require 'emms-volume)
(require 'emms-score)
(emms-score 1)
;; autodetect musci files id3 tags encodeing
(require 'emms-i18n)
;; auto-save and import last playlist
(require 'emms-history)

播放列表

用 emms 大部分的时间,可能大部分的时间不大会关注播放列表的现实,但如果要做展示或 是查看一些音乐信息的话,还是需要自己定义的。可能这里也是 emms 的乐趣所在,因为默认的播放列表可能你不一定会满意,但是自定义需要一定 elisp 基础。

可以自定义一个显示函数,hook 到 emms-track-description-function 即可。

 
;; my customizable playlist format
(defun bigclean-emms-info-track-description (track)
"Return a description of the current track."
(let ((artist (emms-track-get track 'info-artist))
                (title (emms-track-get track 'info-title))
                (album (emms-track-get track 'info-album))
                (ptime (emms-track-get track 'info-playing-time)))
        (if title 
        (format 
                "%-35s %-40s %-35s %5s:%-5s"
                (if artist artist "")
                (if title title "")
                (if album album "")
                (/ ptime 60)
                (% ptime 60)))))
(setq emms-track-description-function
    'bigclean-emms-info-track-description) 

这个自定义播放列表不大完善的地方在于,当显示英文字符时,一切表现的很好,但是如果 中文和英文混合,就会显得很凌乱,原因在于 format 函数把一个汉字当做两个英文字符处 理,暂时还没有想到可以解决此问题的 tricks。

状态栏

同自定义的播放列表相似,只是需要把自定义的显示函数 hook 到 emms-mode-line-mode-line-function 就可以的。

 
;; format current track,only display title in mode line
(defun bigclean-emms-mode-line-playlist-current ()
"Return a description of the current track."
(let* ((track (emms-playlist-current-selected-track))
        (type (emms-track-type track))
        (title (emms-track-get track 'info-title)))
        (format "[ %s ]"
            (cond ((and title)
                title)))))
(setq emms-mode-line-mode-line-function
    'bigclean-emms-mode-line-playlist-current)

快捷键绑定

为了尽可能的与 emms-playlist-mode 状态下的快捷键兼容,因此大部分的全局快捷键只是添加了前缀 "C-c e" 而已,另外,也仿照这个规则,自己定义了一组相似的快捷键。

 
;; global key-map
;; all global keys prefix is C-c e
;; compatible with emms-playlist mode keybindings
;; you can view emms-playlist-mode.el to get details about 
;; emms-playlist mode keys map
(global-set-key (kbd "C-c e s") 'emms-stop)
(global-set-key (kbd "C-c e P") 'emms-pause)
(global-set-key (kbd "C-c e n") 'emms-next)
(global-set-key (kbd "C-c e p") 'emms-previous)
(global-set-key (kbd "C-c e f") 'emms-show)
(global-set-key (kbd "C-c e >") 'emms-seek-forward)
(global-set-key (kbd "C-c e <") 'emms-seek-backward)
;; these keys maps were derivations of above keybindings
(global-set-key (kbd "C-c e S") 'emms-start)
(global-set-key (kbd "C-c e g") 'emms-playlist-mode-go)
(global-set-key (kbd "C-c e t") 'emms-play-directory-tree)
(global-set-key (kbd "C-c e h") 'emms-shuffle)
(global-set-key (kbd "C-c e e") 'emms-play-file)
(global-set-key (kbd "C-c e l") 'emms-play-playlist)
(global-set-key (kbd "C-c e r") 'emms-toggle-repeat-track)
(global-set-key (kbd "C-c e R") 'emms-toggle-repeat-playlist)
(global-set-key (kbd "C-c e u") 'emms-score-up-playing)
(global-set-key (kbd "C-c e d") 'emms-score-down-playing)
(global-set-key (kbd "C-c e o") 'emms-score-show-playing)

快捷键的定义,只要自己觉得合理,好记就可以。仅作参考。

emms 也可以显示指定目录中的歌词文件,也可以利用脚本自动下载歌词,自己没有配置, 不再赘述。

tips

主要是编码的设置。

 
;; coding settings
(setq emms-info-mp3info-coding-system 'gbk
    emms-cache-file-coding-system 'utf-8
    ;; emms-i18n-default-coding-system '(utf-8 . utf-8)
    )