存档

‘Emacs’ 分类的存档

Build Emacs As A Python IDE

2014年12月30日 没有评论

众所周知在很久很久以前, 初学者要把 Emacs 搭建成比较容易上手的环境, 需要 一点精力和耐心, 但这恰恰是 Emacs 的魅力所在(超高度的可定制化), 但对初学者来说, 由于 el-get包管理器 的出现, 情况变得越来越好了. 比如要马上开始用 Emacs 来作为开发 Python 的工具, 现在已经很简单了.

安装 el-get

将下列配置写入到 .emacs 中

(add-to-list 'load-path "~/.emacs.d/el-get/el-get")
(unless (require 'el-get nil 'noerror)
  (with-current-buffer
      (url-retrieve-synchronously
       "https://raw.github.com/dimitri/el-get/master/el-get-install.el")
    (let (el-get-master-branch)
      (goto-char (point-max))
      (eval-print-last-sexp))))
 
(el-get 'sync)

just it! 启动 emacs 的时候会自动初始化 el-get 需要的配置信息

jedi

jedi 主要是一个自动补全的插件, Emacs 已经有一个名为 auto-complete 的强大的 补全插件了, 通吃所有语言. 没错, jedi 的自动补全就是利用该插件作为后端了, 不仅如此, 他还可以在编写代码的时候实时查看函数的成员信息, 函数的参数信息和文档信息等, 总之很强大.

使用 el-get-install 回车, 输出 jedi 安装, 借助 el-get 的强大, 所有的依赖都会 自动安装(.e.g. auto-complete, epc)

M-x el-get-install

在 .emacs 里加入 jedi 的配置

add-hook 'python-mode-hook 'jedi:setup)
(setq jedi:complete-on-dot t)

ropemacs

ropemacs 是借助 rope, pymacs 来做 python 的工程管理的东西, 在它面前, 神马 代码重构, 代码跳转, 自动模块导入, 类成员补全神马都是浮云. (注意, 所有代码 补全我都使用 jedi 来做, 不用到这里的功能)

安装也很方便, 直接 el-get-install 然后回车输入 ropemacs 就可以了

安装完成在 .emacs 里加入

(pymacs-load "ropemacs" "rope-")
(setq ropemacs-enable-autoimport t)
 
(autoload 'pymacs-apply "pymacs")
(autoload 'pymacs-call "pymacs")
(autoload 'pymacs-eval "pymacs" nil t)
(autoload 'pymacs-exec "pymacs" nil t)
(autoload 'pymacs-load "pymacs" nil t)

flycheck

该插件是一个实时代码检查的工具, 也就是在编代码的过程中, 会根据改语言的编码 规范, 实时检查和提示源代码的错误, 然后给出警告, 比如语法错误, 编码规范 等. 该插件也是通吃所有语言, 这里我们只关注 python 相关的

直接 el-get-install 然后回车输入 flycheck 安装.

在 .emacs 里面加入

(add-hook 'after-init-hook #'global-flycheck-mode)

注意, flycheck 需要一个检查语法的后端程序, 如果是 python 的话, 推荐 pylink,

# pip install pylink

后记

不考虑其他的配置, 什么强大的 ido, ibuffer, 按键绑定配置, 窗口配置等等, 一个 标准的 python IDE 就配置好了, 就这么简单.

附上所有的 .emacs 配置

(add-to-list 'load-path "~/.emacs.d/el-get/el-get")
(unless (require 'el-get nil 'noerror)
  (with-current-buffer
      (url-retrieve-synchronously
       "https://raw.github.com/dimitri/el-get/master/el-get-install.el")
    (let (el-get-master-branch)
      (goto-char (point-max))
      (eval-print-last-sexp))))
 
(el-get 'sync)
(add-hook 'python-mode-hook 'jedi:setup)
(setq jedi:complete-on-dot t)
 
(add-hook 'after-init-hook #'global-flycheck-mode)
 
(pymacs-load "ropemacs" "rope-")
(setq ropemacs-enable-autoimport t)
 
(autoload 'pymacs-apply "pymacs")
(autoload 'pymacs-call "pymacs")
(autoload 'pymacs-eval "pymacs" nil t)
(autoload 'pymacs-exec "pymacs" nil t)
(autoload 'pymacs-load "pymacs" nil t)

分类: Emacs, python 标签: ,

Emacs 中默认使用空格来缩进

2014年4月1日 没有评论

我讨厌 TAB, 在 QEMU 的开发中, python 代码的编写, 在和别人共同完成的项目中,
等等, 用 TAB 缩进就是一场灾难.

每次开始接触一种新语言的时候, 都要设置类似一堆

(add-hook 'ruby-mode-hook (lambda ()
                            (setq indent-tabs-mode nil)))

今天无意中在一个 elisp 代码文件里面看到有这么一个函数:

; Set the default value of variable VAR to VALUE.
(setq-default indent-tabs-mode nil)

这下, 妈妈再也不用担心我的缩进问题了.

分类: Emacs 标签:

建立 Lisp 开发环境

2013年1月30日 1 条评论

Slime 是 Emacs 下的一个写 Common Lisp 的一个插件

Download

如果是从源代码安装的话, 需要从 Slime 的官网上下载安装包, 然后进行安装.

Install

在 Gentoo 上安装很简单:

# emerge -av slime

Configuration

(setq inferior-lisp-program "/usr/bin/sbcl")
(add-to-list 'load-path "/usr/share/emacs/site-lisp/slime/")
(require 'slime)
(slime-setup)

装好后, 在我的机器上, 会显示以下错误

  ASDF 2 is not compatible with ASDF-BINARY-LOCATIONS, which you are using. 
ASDF 2 now achieves the same purpose with its builtin ASDF-OUTPUT-TRANSLATIONS, 
which should be easier to configure. Please stop using ASDF-BINARY-LOCATIONS, 
and instead use ASDF-OUTPUT-TRANSLATIONS. See the ASDF manual for details. 
In case you insist on preserving your previous A-B-L configuration, but 
do not know how to achieve the same effect with A-O-T, you may use function 
ASDF:ENABLE-ASDF-BINARY-LOCATIONS-COMPATIBILITY as documented in the manual; 
call that function where you would otherwise have loaded and configured A-B-L..

Gentoo 中 asdf 默认的配置文件(/etc/gentoo-init.lisp)有点问题, 注释掉以下几行 就可以了

(asdf:oos 'asdf:load-op :asdf-binary-locations)
(setf asdf:*centralize-lisp-binaries* t)
(setf asdf:*source-to-target-mappings* '((#p"/usr/lib/sbcl/" nil) (#p"/usr/lib64/sbcl/" nil)))

修改为

;; (asdf:oos 'asdf:load-op :asdf-binary-locations)
;; (setf asdf:*centralize-lisp-binaries* t)
;; (setf asdf:*source-to-target-mappings* '((#p"/usr/lib/sbcl/" nil) (#p"/usr/lib64/sbcl/" nil)))

注意该配置文件是在 /etc/sbclrc 定义的

;;; The following is required if you want source location functions to
;;; work in SLIME, for example.
 
(setf (logical-pathname-translations "SYS")
    '(("SYS:SRC;**;*.*.*" #p"/usr/lib64/sbcl/src/**/*.*")
      ("SYS:CONTRIB;**;*.*.*" #p"/usr/lib64/sbcl/**/*.*")))
 
;;; Setup ASDF2
(load "/etc/gentoo-init.lisp")

Enjoy

使用 M-x slime 就可以启动 slime 了, 启动画面做得很炫

分类: Emacs, Lisp 标签: ,

Emacs 下的输入法问题

2011年8月26日 没有评论

最近让我的本本重新回到了 Gentoo 的怀抱, 不愧是 i5 的核, 构建整个系统比在公司 的那台老爷机快多了. 一切都是那么良好, 只是当我 emerge emacs 完, 打开 emacs 开始用 jabber-mode 聊天以后, 不对劲了, 中文输不出来. 用 C-SPC 的时候直接 提示 “mark set”, 原来我的 ibus 激活键直接被绑定到 “set-mark-command”, 我把它 global-unset-key 以后, 还是输不出来, 在 google 老师的帮助下, 我猜到以下的原因.

如果是 XIM 的问题, 需要修改各种环境变量, 而且还不一定对, 如果是 Xorg-server 的字体问题, 需要去修改 xorg.conf, 做各种符号链接, 安装一大堆根本不需要的字体 神马的. 最终我在 emacswiki 上找到了终极的解决办法. IbusMode, 这个扩展 除了解决我的 emacs 不能调用 ibus 输入法之外, 还有其它的一些我暂时没有用到的 附加功能.

以下简化版的安装过程:

$ wget http://launchpad.net/ibus.el/0.2/0.2.1/+download/ibus-el-0.2.1.tar.gz
$ tar xfz ibus-el-0.2.1.tar.gz
$ cp -f ibus-el-0.2.1/ibus-el-agent ~/.emacs.d
$ cp -f ibus-el-0.2.1/ibus.el ~/.emacs.d
$ echo "(add-to-list 'load-path \"jabber/share/emacs/site-lisp\")" >> ~/.emacs
$ echo "(require 'ibus)" >> ~/.emacs
$ echo "(add-hook 'after-init-hook 'ibus-mode-on)" >> ~/.emacs

分类: Emacs 标签:

Emacs 下的输入法问题

2011年8月26日 6 条评论

最近让我的本本重新回到了 Gentoo 的怀抱, 不愧是 i5 的核, 构建整个系统比在公司 的那台老爷机快多了. 一切都是那么良好, 只是当我 emerge emacs 完, 打开 emacs 开始用 jabber-mode 聊天以后, 不对劲了, 中文输不出来. 用 C-SPC 的时候直接 提示 “mark set”, 原来我的 ibus 激活键直接被绑定到 “set-mark-command”, 我把它 global-unset-key 以后, 还是输不出来, 在 google 老师的帮助下, 我猜到以下的原因.

如果是 XIM 的问题, 需要修改各种环境变量, 而且还不一定对, 如果是 Xorg-server 的字体问题, 需要去修改 xorg.conf, 做各种符号链接, 安装一大堆根本不需要的字体 神马的. 最终我在 emacswiki 上找到了终极的解决办法. IbusMode, 这个扩展 除了解决我的 emacs 不能调用 ibus 输入法之外, 还有其它的一些我暂时没有用到的 附加功能.

以下简化版的安装过程:

$ wget http://launchpad.net/ibus.el/0.2/0.2.1/+download/ibus-el-0.2.1.tar.gz
$ tar xfz ibus-el-0.2.1.tar.gz
$ cp -f ibus-el-0.2.1/ibus-el-agent ~/.emacs.d
$ cp -f ibus-el-0.2.1/ibus.el ~/.emacs.d
$ echo "(add-to-list 'load-path \"jabber/share/emacs/site-lisp\")" >> ~/.emacs
$ echo "(require 'ibus)" >> ~/.emacs
$ echo "(add-hook 'after-init-hook 'ibus-mode-on)" >> ~/.emacs

分类: Emacs 标签:

用 org-mode 写 LaTeX

2011年8月17日 2 条评论

最近要离职了, 要写移交文档, 以前写文档的一般都是用 org-mode 写好以后转为 html 或者 mediawiki 的格式, 偶尔给国外的客户写技术文档才转成 pdf 格式. 这次想正式一点, 顺便再回顾一下上次 FJLUG 上学到的 XeLaTeX.

话说我以前用 LaTeX 处理中文都是用 CJK 的方式, 直到上次去 FJLUG 上被 鱼一尾 告知我用的技术是几年前的, 被狠狠鄙视了一把之后, 我才知道原来用 XeLaTeX 处理中文如此简单.

Org-article 模板

我用的 latex 模板是 org-modeThe Org-article LaTeX class

NOTE!!! 以下假设 xeLaTeX 和 xeCJK 环境已经安装好了. 并且 org-mode 最好是7.0以上的版本, 不然 org-babel-tangle-file 函数可能找不到

安装很简单

$ git clone git://github.com/tsdye/org-article.git
$ cd org-article
$ emacs -batch --eval "(org-babel-tangle-file \"article-class.org\")"
$ sudo cp org-article.cls /usr/share/texmf-texlive/tex/latex/base
$ sudo mktexlsr
$ kpsewhich org-article.cls

其中 usr/share/texmf-texlive/tex/latex/base 不同平台可能会不一样

如果提示

reference 'gantttest' not found in this buffer

则在 Org-article.org 里面搜索 ganttest, 把相应的片段删除, 我这里删除了三处.

xeCJK 模板

以下设置假设你有相关字体, 用 fc-list 查看你系统的字体, 如果你想要其他 字体, 执行类似的代码添加提供的字体

$ fc-list
$ sudo cp your_fonts.ttf /usr/share/fonts/your_fonts_dir
$ cd /usr/share/fonts/your_fonts_dir
$ sudo mkfontdir 
$ sudo mkfontscale
$ sudo fc-cache -fv

然后 fc-list 找到你添加的字体名, 最好选英文的那一列

将以下代码保存为 /usr/share/texmf-texlive/tex/latex/base/zhfontcfg.sty /usr/share/texmf-texlive/tex/latex/base 是我的 latex 能找到的目录, 不同 平台可能不一样

% xetex/xelatex 字体设定宏包
 
\ProvidesPackage{zhfontcfg}
\usepackage[utf8]{inputenc}
\usepackage{fontspec,xunicode}
 
\usepackage[slantfont, boldfont, CJKtextspaces, CJKmathspaces]{xeCJK} % 允许斜体和粗体
\setCJKmainfont{WenQuanYi Micro Hei} % 设置缺省中文字体
\setCJKmonofont{WenQuanYi Micro Hei Mono} % 设置等宽字体
 
\setmainfont{Tahoma} % 英文衬线字体
\setsansfont{Tahoma} % 英文无衬线字体
\setmonofont{Monaco} % 英文等宽字体
\punctstyle{kaiming} % 开明式标点格式
 
\usepackage{indentfirst} % 首段缩进
 
\defaultfontfeatures{Mapping=tex-text} %如果没有它,会有一些 tex 特殊字符无法正常使用,比如连字符。
 
% 中文断行
\XeTeXlinebreaklocale "zh"
\XeTeXlinebreakskip = 0pt plus 1pt minus 0.1pt

emacs 设定

保存下列代码到 ~/.emacs

(require 'org-latex)
(setq org-export-latex-listings t)
(add-to-list 'org-export-latex-classes
             '("org-article"
               "\\documentclass{org-article}
                 [NO-DEFAULT-PACKAGES]
                 [EXTRA]"
               ("\\section{%s}" . "\\section*{%s}")
               ("\\subsection{%s}" . "\\subsection*{%s}")
               ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
               ("\\paragraph{%s}" . "\\paragraph*{%s}")
               ("\\subparagraph{%s}" . "\\subparagraph*{%s}")))

开始写文档

每一个 org-mode 的头部要添加一下代码.

#+TITLE: 用 org-mode 写 LaTeX
#+AUTHOR: mathslinux <riegamaths@gmail.com>
#+DATE: [2011-08-17 三 16:30]
 
#+OPTIONS:   H:3 num:t toc:t \n:nil @:t ::t |:t ^:nil -:t f:t *:t <:t
#+OPTIONS:   TeX:t LaTeX:t skip:nil d:nil todo:t pri:nil tags:not-in-toc
 
#+EXPORT_SELECT_TAGS: export
#+EXPORT_EXCLUDE_TAGS: noexport
#+LINK_UP:   
#+LINK_HOME: 
#+XSLT: 
#+BABEL: :exports code
#+LaTeX_CLASS: org-article
#+LaTeX_CLASS_OPTIONS: [koma,times,letterpaper,captions=tableheading,utopia,11pt,listings-sv,microtype,paralist,colorlinks=true,urlcolor=blue,secnums,secnumss,secnumsss,secnump,secnumsp]
 
#+LATEX_HEADER: \usepackage{zhfontcfg}

剩下的, 就是按照 org-mode 的格式来写文档, 神马代码高亮, 神马标题分类, 都不用 考虑 latex 的语法, 完全就是可见即可得.

分类: Emacs, LaTeX 标签: , ,

用 Emacs 写 Blog

2011年7月14日 5 条评论

作为一个 Emacs 控, 我喜欢把所有事情都在 Emacs 中完成, 今天看了一下 Emacs 写 Blog 的方案, 有 weblog 和 org2blog 等多种方式(再次说明 Emacs 太强大了). 我权衡了一下, 选择了 org2blog, 因为它是以 org-mode 为基础的, 可以很好的和很强大的 org-mode 结合, 而且我对 org-mode 相对更熟悉. 因此, 在写 blog 的时候, 很多 html 的样式我不需要去关心, 我只要像写 org 一样来写 blog 就好了. 这样做还有一个很大的好处是. 源文件会在本地有一个拷贝, 我的有一些文章有时候会共享到公司的 wiki 和论坛上, 所以 org2blog 对我是最方便的.

本文就是我用 emacs 写的第一篇文章哦.

废话不多说, 先上安装指南和使用方法

安装

由于 org2blog 基于 xml-rpc, 所以先要安装 xml-rpc.el, 我的 emacs 的插件放在 ~/.emacs.d/lisps 目录下, 而且 load-path 已经添加了该目录. 先下载相关文件.

# cd ~/.emacs.d/lisps
# wget http://launchpad.net/xml-rpc-el/trunk/1.6.8/+download/xml-rpc.el
# git clone http://github.com/punchagan/org2blog.git

然后在 ~/.emacs 加载 xml-rpc 和 org2blog

;; for org2blog
(require 'xml-rpc)
(add-to-list 'load-path "~/.emacs.d/lisps/org2blog/")
(require 'org2blog-autoloads)
(setq org2blog/wp-blog-alist
      '(("wordpress"
         :url "http://yourblog.wordpress.org/xmlrpc.php"
         :username "username"   
         :default-title "Hello World"
         :default-categories ("org2blog" "emacs")
         :tags-as-categories nil)
        ("my-blog"
         :url "http://yourblog/xmlrpc.php"
         :username "username")))

使用

M-x eval-buffer ~/.emacs 之后, M-x 输入 org2blog-login, 在 出来的提示 blog? 后面输入要登录的 wordpress 名 my-blog. 然后按照提示输入密码, 连接成功后, 用org2blog-new-entry 就可以开始 开始写 blog 了.

写完之后, 按 C-c d 保存草稿. 之后到 http://yourblog/?p=32&preview=true 查看预览(32是org 源文件文件里面的 #+POSTID: 后面的数字), 确认要发布后, 可以 C-c p 正式发布.

发布已有的 .org 文章到 blog, 把 #+TITLE, #+OPTIONS, #+TAGS, #+CATEGORY, #+DESCRIPTION, #+DATE. (所有均可选) 到 org 文件的开头 增加 #+POSTID 到 .org 文件开头, 表示编辑已存在的文件.

代码高亮

由于在 org-mode 的 #+BEGIN_HTML #+END_HTML 之间可以嵌入 html 代码, 所以 org-mode 可以和 wordpress 插件很完美的结合, 以我使用的 wp-syntax 插件为例, 其它类似.

确保 wordpress 安装启用了 wp-syntax 插件之后. 在 org 源文件里面使用下面的结构来高亮.

#+BEGIN_HTML
<pre lang="bash">
# wget http://launchpad.net/xml-rpc-el/trunk/1.6.8/+download/xml-rpc.el
</pre>

Note

由于 org2blog 使用 xml rpc 和 wordpress 通信. 所以在 wordpress 站点必须启用 xml-rpc 支持. 在 http://yourblog/wp-admin/options-writing.php 启用 xml-rpc 支持.

在 org2blog 的源代码目录下, 有一个 README.org 文件, 里面的文档已经足够详细了, 如果想查看 html 格式的帮助可以用 emacs 打开改文件, 然后用 C-c C-e b 来查看 html 格式的文档.

分类: blog, Emacs 标签: ,