Pulpcode

捕获,搅碎,拼接,吞咽

0%

高效的emacs

这篇文章用来总结自己对emacs的理解。本人之前使用过vim和sublime,现在主要使用emacs

Start

就编辑速度来说,是不会有编辑器比vim更快的了。我也常常将代码片段,或者日志,xml,考到sublime进行分析。多行编辑很实用。

但我在平时,主要还是使用emacs,无论是用它写博客,写代码,执行代码,写GTD,管理文档…都非常的方便。

键绑定

一个高效的编辑器,就是能够做到不用鼠标,编辑时在鼠标和键盘之间进行切换是一件很恼人的事情。这点在你抱着笔记本进行写作的时候会深有体会。

常用的快捷键:(C代表Ctrl,A代表Alt)

C-n 向下移动一个字符
C-p 向上移动一个字符
C-b 向左移动一个字符
C-f 向右移动一个字符
A-b 向左移动一个单词
A-f 向右移动一个单词
C-a 移动到行首
C-e 移动到行尾
C-@ 设置选择下标
C-w 剪贴选中区域
A-w 复制选中区域
C-l 将光标所在行,作为中心行,刷屏
C-x H 全选整个缓冲区。
C-k 删除光标后的整行内容
C-d 删除一个字母
M-d 删除一个单词
C-_ Undo
C-? Redo
C-s 查找
A-j 换行,与上一行保持同样的缩进
A-< 移动到文件头部
A-> 移动到文件尾部
C-x 3 左右分屏
C-x 2 上下分屏
C-x 1 除此屏全部关闭
C-x 0 关闭此屏
A-/ 补全

其它的一些也是因为不常用,基本不会去记它们的。

除了emacs自己的keybinding,我还特意做了些键绑定,提高效率。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
(global-set-key (kbd "C-M-h") 'backward-kill-word)
;; (bash中的回删单词,也是这三个键)
(global-set-key (kbd "C-x f") 'recentf-ido-find-file)
;; (在最近打开文件列表中,选择要打开的文件,这个很实用)
(global-set-key (kbd "C-x t") 'insert-current-date)
;; (插入当前日期,在写博客或者gtd的时候,经常用日期作为文件名的一部分)
(global-set-key (kbd "<f8>") 'insert-current-file-fill-path)
;; (插入当前文件的完整路径,这个也比较实用)
(global-set-key (kbd "M-g") 'goto-line)
;; (跳转到某一行,是没有vim中的:n快)
(global-set-key (kbd "C-x w") 'copy-word)
;; (复制一个单词,只要光标落在单词上,就可以复制整个单词)
(global-set-key (kbd "C-x y") 'copy-line)
;; (emacs是没有这个快捷键的,只能自己去实现了。在vim中,yy就可以了)
(global-set-key (kbd "C-c C-b") 'comment-or-uncomment-region)
;; (快速的对代码进行注释与反注释)
(define-key global-map (kbd "C-c a") 'wy-go-to-char)
;; (跳到此行的某个字母,vim的f和t,比这个快得多)

实用的多功能

多窗口编辑,文件管理器,都是emacs多功能的一部分。甚至还可以配置git等外部程序,仅仅打开一个emacs就够了。

我的emacs还配置了以下实用的多功能

1
2
3
4
5
6
7
8
9
10
11
12
13
;; 快速的使用bing查找(直接在emacs中查找,然后就会弹出网页上的查找结果)
(prelude-install-search-engine "bing" "https://cn.bing.com/search?q=" "Search Bing:" )
(global-set-key (kbd "C-c b") 'prelude-bing)

;; emacs 弹窗 (我常常退弹出一个cmd,运行python,或者运行git)
(defvar popup-terminal-command
(cond ((memq system-type '(windows-nt cygwin))
'("cmd" "/c" "start" ))
(t '("x-terminal-emulator"))))
(defun popup-term ()
(interactive)
(apply 'start-process "terminal" nil popup-terminal-command))
(global-set-key (kbd "<f5>") 'popup-term)

写博客

我的博客是使用jekyll进行搭建的,所以日常,基本就是用markdown编辑完之后,用git推送到服务器。

这里要提的就是snippet,因为jekyll扩展了一部分的markdown语法格式,配置成snippet后,快速的插入模板片段非常有用。

比如我的sinppet:hl就对应jekyll的语法高亮扩展。这要比markdown自带的语法高亮(缩进),功能强大一些。

markdown 高亮:

if i == 3:
    print "人生苦短"
else:
    print "我用python"

jekyll 高亮:

1
2
3
4
if i == 3:
print "人生苦短"
else:
print "我用python"

写代码

我用emacs主要写的代码就是python,或者是其它的脚本,像是bash,反正我是不会用它写c#的,没有什么编辑器会比vs更适合写c#。

sinppet 是必不可少的了,python中能用到的snippet我都有配置,之前还配置过一部分和tornado相关的snippet。

我将emacs配置成可以弹窗出一个shell,我一般就在这个shell中执行python

或者直接弹出显示结果,但是这样不能错误信息,而且你的python代码末尾必须要有raw_input() 否则一闪

1
2
3
4
5
6
7
;; emacs弹窗,执行,当前的python
(defun popup-expython()
(interactive)
(let ((filename "test.py")
(args (list "cmd" "/c" "start" "python" (buffer-name))))
(apply 'start-process "terminal" nil args)))
(global-set-key (kbd "<f6>") 'popup-expython)

不仅仅是键盘绑定,这些有关编程的emacs配置,也值得一提。

1
2
3
;; 好代码一行不应该超过80个字符
(add-hook 'python-mode-hook
(lambda () (highlight-lines-matching-regexp ".\\{81\\}" "red")))

还有我的emacs主题是zenburn,这种主题看起来不扎眼,代码高亮美观。很舒服。

写GTD

我对GTD的理解,是要单独写的,这里只介绍用emacs写gtd的一部分内容。

emacs使用org模式来写GTD,基本上可以看作是*做的一棵树,可以切TODODONE,展开,折叠,打标签。

这里插入我gtd的一部分:

* Blog
** DONE 我应该将我购买的域名挂到自己的网站上
   CLOSED: [2014-09-11 Thu 13:30]
** TODO 翻译相关内容
* Book
** DONE 写给上班族的世界史
   CLOSED: [2014-09-05 周五 22:15]
** DONE 方与圆
   CLOSED: [2014-09-21 周日 23:30]
* 周末写两篇博客
** DONE 使用python的函数式编程和c#的linq来实现操作,而非迭代器
   CLOSED: [2014-11-24 周一 11:29]
** 写一篇关于c#的迭代器和python的迭代器,

不要神话emacs

之前在学习emacs和vim的时候,网上有许多文章神话这两个编辑器,说是什么神的编辑器和编辑器之神。
其实如果说智能,它们是不会比VS智能的,emacs和vim最多也就是文本匹配,而vs却真正的在内部构建代码对象。emacs只是比较方便,比较自由而已,比较能折腾而已,要从实用角度出发,而不是做一个脑残粉。