时之殇

豆豆蛙的记忆碎片

在Emacs中实现翻译功能

| Comments

源起

不习惯在Linux下用专门的客户端翻译软件, 每次查个单词什么的都用web版的google-translate. 因为E文不好, 每次写东西时都要在网页和Emacs之间频繁切换, 效率极低, 十分不爽. 既然Emacs称之为一个操作系统, 想想有什么办法能将翻译功能给丫加上, 放狗一搜果然有办法, 已经有人写了一个翻译插件(google-translate.el), 貌似还是个俄国佬写的=.=, 果断拿来用! 感谢伟大的Emacs社区~~

步骤

  1. 从elpa包管理器上找到google-translate, 装之
  2. 给.emacs文件加上如下语句把google-translate配置起来
    (require 'google-translate)
    (global-set-key "\C-ct" 'google-translate-at-point)
    (global-set-key "\C-cT" 'google-translate-query-translate)
    (global-set-key (kbd "C-c r") 'google-translate-at-point-reverse)
    (global-set-key (kbd "C-c R") 'google-translate-query-translate-reverse)
    
  3. 设置默认源语言与目标语言
    用自定义设置变量方式修改(M-x customize-variable)
    输入google-translate-default-target-language, 找到Chinese Simplified, 保存之(这个是目标语言)
    输入google-translate-default-source-language, 找到English, 保存之(这个是源语言)
    
  4. O了

快捷键

C-c t 将当前光标的英文单词翻译为中文
C-c r 将当前光标的中文翻译为英文
C-c T 自己输入英文进行翻译
C-c R 自己输入中文进行翻译

今天你应当学习Emacs Lisp的5点理由(译)

| Comments

前言

Emacs Lisp是一种神秘莫测的黑客编程语言. 它的弱点是众所周知的, 它很慢, 它是单线程的, 同时它的变量是动态绑定的, 等等等等. 我当然还能继续说下去, 但这些不是主要目的. 尽管有这些看得见的弱点, 但Emacs Lisp仍然是github上最流行的lisp方言, 这一点有许多程序员对此发誓. 至于我, 能平均每天写50到100行之间的Emacs Lisp代码.

当然, 我决定投资我的时间去学习它, 并且发现这样做了以后更加高兴. 我真的希望以后也能如此. 我所遇到的主要问题是劝阻我不要将时间投资到编程语言上. 但是现在, 我真的希望在多年前就能花时间去学习它.

尽管遇到这样的问题, 又是什么使它如此的棒呢? 为什么任何人都应当学习Emacs Lisp呢?

所以, 事不宜迟, 下面我就给出当今应当学习Emacs Lisp的5点理由:

不管学习多少Emacs Lisp都会立即使你的生活变得更美好

你学习到的东西能够立即改变你的生活, 不是从现在起一年, 不是毕业以后, 也不是当你的团队开始下一个项目时你才会使用到这门语言, 而是 现在!

许多Lisp方言位于理论的范围内, 这很好, 也有它们的位置. 但是Emacs Lisp显得”更快更脏”. Emacs Lisp是非常有实践性的, 它能帮助你解决你每天所遇到的问题.

如果你不懂任何Emacs Lisp, 那么你的.emacs文件有可能充满了为了安装所需的包而复制粘贴的各种代码, 这很正常. 但问题是这会迅速的变得难看. 不久之后你的.emacs文件就会变得非常难以维护. 学习Emacs Lisp会使你的Emacs生活更有秩序.

如果你需要获得关于Emacs的任何帮助, 很有可能帮助你的那个人将会带来一些Lisp代码. 你很难对他说”对不起, 我不懂任何elisp!” 在##emacs站点, 会一点Emacs Lisp能使你更好的融入社区.

今天, 学习Emacs Lisp, 会使你的生活更美好.

Emacs Lisp和Emacs是一个真正有趣的编程平台

你并不一定非要是一个狂热的Emacs党. 但我想任何人都会同意Emacs是有趣的.

Chances are that you have some exposure to the ideas behind Smalltalk, such as, you know, that whole “objected oriented” thing.(不知道怎么翻)另外, Samlltalk不仅仅是一种编程语言, 同时也是一种编程环境. 在Emacs上也拥有这种同样强大的精神. 因为对用户来讲一切东西都是立即可见的. Emacs是类似有这种精神的系统的一种主要继承者.

想要知道一个键绑定是做什么的吗? 按”C-h k”. 想要知道函数是做什么的吗? 按”C-h f”. 想要看函数的源代码, 单击刚才出现的buffer上的链接即可. 或者你想要在你需要的时候修改它, 仅仅改变函数定义出的代码同时按”C-x C-e”使之生效

当用Emacs Lisp编程时, 你会觉得在这个系统上完成工作就像当今社会与石器时代相比. 另外还有红利: 这不仅仅是一些智力上的练习, 同时也是实践性的, 精彩的, 同时还能立即可用.

动态绑定确实很棒

让我们快速回顾一下动态绑定, 同时对比另一方面, 词法绑定(lexical binding).

首先, 让我们看看变量绑定, 特别的, 用Javascript伪代码来表示, 如下:

function createAdder(num_to_add)
{
  function(new_num)
  {
    return num_to_add + new_num;
  }
}

add2 = createAdder(2);

add10 = createAdder(10);

console.log(add2(6));  // = 8

console.log(add10(13)); // = 23

我们来看看这段代码. createAdder函数用来返回另一个函数, 它是用来”创建”和”增加”的. createAdder将返回一个参数和一个新函数的和.

重要的一点是, 无论createAdder什么时候返回, 它都仍然返回传给它的参数–num-to-add. Whatever variables are within a parent’s scope when a function gets created remain available to it for its execution(不知道怎么翻).

词法作用域非常棒, 它能真正优雅地解决问题, 正式这点使Ajax和Node.js更加合理.

动态作用域是不同的, 在动态作用域中, 变量在求值时绑定和计算. 计算变量在任意调用栈之上.

用伪代码举个例子, 动态绑定的Javascript如下所示:

function adder(new_num)
{
  return num_to_add + new_num;
}

function add2(new_num)
{l
  num_to_add = 2;
  return adder(new_num)
}

function add10(new_num)
{
  num_to_add = 10;
  return adder(new_num)
}

console.log(add2(6));  // = 8

console.log(add10(13));  // = 23

关键的不同点是adder函数, 变量 num-to-add 似乎不涉及任何东西. 然而当语言是动态绑定的, 变量会在它被调用的地方引用. 因此add2函数设置的变量num-to-add, 当adder函数被调用时, 它才有可能被引用.

你可能会想这听起来就好像是全局变量, 没错, 的确如此. 这就是为什么当今绝大部分语言都是词法绑定的, 而不是动态绑定的.

实践中, 这这的不容易变糟. 你所想的变量改变是有据可查的. 当需要时代码仅仅使用动态范围解析, 当然这不需要经常进行.

动态绑定事实上相当方便. 举个例子, 它可以使你的变量基于配置改变.

另外还有一种宏, 叫做lexical-let, 能使你得到词法绑定的功能.

如果这还不够, Emacs24现在支持词法作用域. 你只需要用elip文件设置一个变量告诉你想要的词法作用域.

所以, 动态绑定确实很酷.

单线程是件好事

Emacs Lisp是单线程的, 很可能永远都会是. 这可能会有点限制, 但却带来了相当大的简化.

老实说, 如果你真的想处理锁和它们的同胞, 你不得不去其他地方看看.

当你理解Emacs Lisp后关于Emacs的一切都会更有意义

你可能已经注意到Emacs有相当纯净的文档, 而它的文档又相当广泛. 然而, 绝大部分文档仅仅在有Lisp代码的上下文中才有意义. 因此如果你不懂Emacs Lisp, 那么许多文档都是没用的.

举个例子, 为了明白Emacs键绑定系统, 你需要了解键绑定的组成结构, 而这就意味着Lisp.

老实说, 在Emacs中到处都是Emacs Lisp, 不了解Lisp也能用Emacs, 但当你理解了它的原生语言–Emacs Lisp后, 将会更好的使用Emacs.

因此你应当学点Emacs Lisp. 它是一个相当迷人的编程环境, 而且很有可能使你的生活变得更容易. 另外, 对我来说, Emacs Lisp的问题是没有足够明显的dissuading. 事实上, 应该考虑加强它们.

总之, 用Emacs Lisp工作使人兴奋, 我强类推荐给那些认为自己是一个严肃的程序员的人们.

30分钟搭建一个octopress博客

| Comments

缘起

早都有搭一个个人blog的想法了, 作为一名IT行业从业者:) 怎么能没有自己的独立博客呢. 当然, 将博客托管在csdn,cnblog上也不符合我们的折腾精神. 本着生命不惜,折腾不止的信念, 终于利用这个51假期, 在参考了众多资料后, 搭建了一个完全免费, 不限流量的基于octopress的个人博客(本着能省则省的原则, 连域名都用免费的). 同时作为一名Emacs党, orgmode也是标配, 用orgmode直接发布文章也就是刚需了, 这篇文章就是用orgmode写的

我的搭建环境

ubuntu12.04 + emacs24.2

安装ruby

很简单, 一句命令搞定

sudo apt-get install ruby1.9.3

安装octopress

git clone git://github.com/imathis/octopress.git octopress
cd octopress
sudo gem install bundler
rake install

Github账户配置

  1. 首先在Github上注册一个账户, 然后建一个名为username.github.com的resporitory(username就是Github的账户名)
  2. 如果本机没有ssh keys的话, 还需要为Github帐号设置一个本机的ssh keys, 参考 https://help.github.com/articles/generating-ssh-keys

把octopress部署到Github上

回到octopress根目录下

rake setup_github_pages

此处注意, 当出现提示填写url地址时, 千万不能按照那个坑爹的提示来, 应按照如下形式填写 (关于这个问题, 可以参考陆彦帑这哥们的回答http://stackoverflow.com/questions/12060903/github-error-repository-not-found-when-installing-octopress )

git@github.com:wyj2046/wyj2046.github.com.git

接着执行下面的命令, 当出现”Github Pages deploy complete”就表示部署成功, 可以在浏览器上输入username.github.com看看效果了

rake generate
rake deploy

基本的blog配置

编辑_config.yml文件

这个文件是基本的配置文件, 博客标题, 作者姓名等基本信息就从这里改

开启disqus

  1. 在disqus上申请个号, 绑定到博客的url, 同时定义一个shortname
  2. 在_config.yml中, 找到与disqus相关的, 该改的改, 该填的填(如下)
    # Disqus Comments
    disqus_short_name: wyj2046
    disqus_show_comment_count: true
    

在侧边栏加新浪微博

  1. 在_config.yml文件中将default_asides处代码改为如下,即去除不要的侧边栏,并加入微博侧边栏
    default_asides: [asides/recent_posts.html, asides/github.html, custom/asides/weibo.html]
    
  2. http://app.weibo.com/tool/weiboshow 获取自己微博秀的代码
  3. 在source/_includes/custom/asides文件夹下新建weibo.html文件并编辑如下,将获取的微博秀代码插入到相应位置: (参考http://easypi.github.io/blog/2013/01/05/using-octopress-to-setup-blog-on-github/)
    <section>
      <h1>新浪微博</h1>
      <ul id="weibo">
      <li>
    
      <!-- 在此插入获得的微博秀代码 -->
    
      </li>
      </ul>
    </section>
    

将修改好的octopress配置提交到Github上去

在octopress根目录下

git add .
git commit -m "commit reason"
git push origin source

此处注意, 是source不是master

写文章

1. rake new_post['title']
2. rake generate 生成静态网页
3. rake preview 在localhost:4000上预览
4. rake deploy 发布到Github上  

增加org-mode导出功能

在.emacs里加上如下语句

*hideshowvis*(setq org-publish-project-alist
  '*hideshowvis*(*hideshowvis*("blog" .  *hideshowvis*(:base-directory "~/octopress/source/org_posts/"
              :base-extension "org"
              :publishing-directory "~/octopress/source/_posts/"
              :sub-superscript ""
              :recursive t
              :publishing-function org-publish-org-to-html
              :headline-levels 4
              :html-extension "markdown"
              :body-only t))))

修改octopress目录下的Rakefile文件

找到## – Misc Configs – ##,在下面加这两句

org_posts_dir = "org_posts"
new_org_post_ext = "org"  # default new org post file extension when using the new_org_post task

找到# usage rake new_post[my-new-post] or rake new_post[‘my new post’] or rake new_post (defaults to “new-post”)这段,在下面另起一段加上

   # usage rake new_org_post[my-new-org-post] or rake new_org_post['my new org post'] or rake new_org_post (defaults to "new-post")
desc "Begin a new org_post in #{source_dir}/#{org_posts_dir}"
task :new_org_post, :title do |t, args|
  if args.title
    title = args.title
  else
    title = get_stdin("Enter a title for your post: ")
  end
  raise "### You haven't set anything up yet. First run `rake install` to set up an Octopress theme." unless File.directory?(source_dir)
  mkdir_p "#{source_dir}/#{org_posts_dir}"
  filename = "#{source_dir}/#{org_posts_dir}/#{Time.now.strftime('%Y-%m-%d')}-#{title.to_url}.#{new_org_post_ext}"
  if File.exist?(filename)
    abort("rake aborted!") if ask("#{filename} already exists. Do you want to overwrite?", ['y', 'n']) == 'n'
  end
  puts "Creating new post: #{filename}"
  open(filename, 'w') do |post|
    post.puts "#+BEGIN_HTML"
    post.puts "---"
    post.puts "layout: post"
    post.puts "title: \"#{title.gsub(/&/,'&amp;')}\""
    post.puts "date: #{Time.now.strftime('%Y-%m-%d %H:%M')}"
    post.puts "comments: true"
    post.puts "categories: "
    post.puts "---"
    post.puts "#+END_HTML"
  end
end

以后即可以使用命令在org_posts目录下生成以org为后缀名的文章

rake new_org_post['title']

编辑org文件后用快捷键”C-c C-e F”即可发布到_posts目录下