又是很久没更新了,不过还好,如今慢慢有点感受了,好长时间不写博客会内心有点感受欠一点什么东西.以为每次写了东西都往主页推搞得压力好大,之后就不往网站首页推了,纯留下来供参考,另外就是主要方便从搜索找过来的朋友,但愿能帮助大家在折腾的道路上少走一些弯路.java
正题开始以前先说点题外话,最近使用org-mode,深深的佩服org-mode的做者,一个科学家(非计算机科学),从2003年到2013年的如今仍然在持续更新org-mode,让更多的人认识到纯文字的力量与好处,而且把org-mode作到了成为emac生态中不可或缺的一部分,真是不容易,org-mode我用地不熟,之后应该会专门详细地讨论它.python
另外还有件事,这个系列的标题之后就再也不维持个人Emacs折腾经验谈了,有点文不对题.具体改为什么我再想一想.c++
进入正题:Yasnippetgit
对于文本编辑器来讲,snippet这个东西应该算很是有用了,尤为是对于java/c++程序员来讲,能够迅速而正确地写出一个块的基础框架,没有接触过snippet的同窗能够想想IDE里面的快速补全,虽然两个东西仍是颇有差异的.咱们拿sublime举个例子:程序员
咱们写java的时候输入for,这时编辑器会有提示github
咱们可能会说for不是已经自动补全了嘛?为啥还能够选呢?别急,咱们就tab一下试试看:vim
这是啥?这就是咱们for语句循环体的必要的语法结构,咱们原本把这个语法结构填满以后,就造成了咱们完整的for语句,可是,怎么才能填满这个结构呢?能够看到,光标已经在第一个须要填的空上了,咱们这时输入i=0什么的,而后再按下tab,发生了什么?markdown
咱们的光标越过了下一个分号,来到了应该填第二个空的地方.就像这样不断地输入+tab咱们就填好了整个for语句结构.仔细想一想,这样是否是很省事?是否是节省了不少时间?框架
其实,snippet就是一些自动的"填空题"机制,咱们须要某种语法结构的时候,就召唤出相应"填空题",而后把空填上就能够了.说实在的,snippet就是这么个东西.编辑器
Yasnippet是Yet Another Snippet的简称,说明在snippet方面以前已经有很多前人作过工做了,而yasnippet最出名无疑是由于它最好的作到了你们心目中足够好用的snippet的标准.
安装yasnippet很简单,咱们的老办法list-packages和package-install均可以用,我我的以为这个东西在从此基本上都须要(本职工做码农),因此就和linum同样设置成了全局的,配置以下
;;yasnippet config (require 'yasnippet) (yas-global-mode 1)
而后,我常常写clojure,可是yasnippet并无针对clojure的默认snippet,因而又找了clojure-snippet,就在list-package里面,很是方便.
咱们一上来就是能够用默认的snippet工做的,若是咱们须要自定义snippet呢?毕竟做者在github里面说了再也不会加入更多的snippet,而是把这一工做开放给其余人,能够找一些好的snippet collection使用.
若是咱们要自定义snippet的话,能够任意打开一个snippet的文件:
# name: FILE *fp = fopen(..., ...);
# key: fopen
# --
FILE *${fp} = fopen(${"file"}, "${r}");
这个是c语言的fopen的snippet,很好懂,fopen后按tab,就会跳出最下面一行(模板),被${}包围的就是要填的"空",而包围的东西是默认值,若是直接按tab略过的话就会保留默认值.第二行key: fopen代表这个snippet的触发器是fopen,只有fopen+TAB才能触发这个snippet.
固然snippet编写远不止这么简单:
# -*- coding: utf-8 -*- # name: def # contributor: Orestis Markou # contributor: Yasser González Fernández <yglez@uh.cu> # key: def # -- def ${1:name}($2): """$3 ${2:$ (let* ((indent (concat "\n" (make-string (current-column) 32))) (args (mapconcat '(lambda (x) (if (not (string= (nth 0 x) "")) (concat "- " (char-to-string 96) (nth 0 x) (char-to-string 96) ":"))) (mapcar '(lambda (x) (mapcar '(lambda (x) (replace-regexp-in-string "[[:blank:]]*$" "" (replace-regexp-in-string "^[[:blank:]]*" "" x))) x)) (mapcar '(lambda (x) (split-string x "=")) (split-string text ","))) indent))) (if (string= args "") (make-string 3 34) (mapconcat 'identity (list "" "Arguments:" args (make-string 3 34)) indent))) } $0
以上是python-mode的def的snippet,比原始的更加智能一些.虽然我不知道写了什么....
好吧等我研究一下了再改,最后说点无关的:Emacs的C-a快捷键移到行首,C-e快捷键移到行尾,很好用,并且很是神奇的是在不少不少的编辑器里面均可以用,好比google的输入框(没作过实验究竟是由于google有这个设定仍是firefox有这个设定仍是vimperator有这个设定,可是博客园编辑器没有),还有markdown编辑器mou,以及命令行终端里,不少时候都不用去找HOME键和END键,先试试C-a和C-e吧.