又是好久没更新了,不过还好,现在慢慢有点感觉了,好长时间不写博客会心里有点感觉欠一点什么东西.觉得每次写了东西都往主页推搞得压力好大,以后就不往网站首页推了,纯留下来供参考,另外就是主要方便从搜索找过来的朋友,希望能帮助你们在折腾的道路上少走一些弯路.

正题开始之前先说点题外话,最近使用org-mode,深深的佩服org-mode的作者,一个科学家(非计算机科学),从2003年到2013年的现在仍然在持续更新org-mode,让更多的人认识到纯文字的力量与好处,并且把org-mode做到了成为emac生态中不可或缺的一部分,真是不容易,org-mode我用地不熟,以后应该会专门详细地讨论它.

另外还有件事,这个系列的标题以后就不再维持我的Emacs折腾经验谈了,有点文不对题.具体改成什么我再想想.

进入正题:Yasnippet

啥是snippet

对于文本编辑器来说,snippet这个东西应该算非常有用了,尤其是对于java/c++程序员来说,可以迅速而正确地写出一个块的基础框架,没有接触过snippet的同学可以想一想IDE里面的快速补全,虽然两个东西还是很有差别的.我们拿sublime举个例子:

我们写java的时候输入for,这时编辑器会有提示

我们可能会说for不是已经自动补全了嘛?为啥还可以选呢?别急,我们就tab一下试试看:

这是啥?这就是我们for语句循环体的必要的语法结构,我们本来把这个语法结构填满之后,就形成了我们完整的for语句,但是,怎么才能填满这个结构呢?可以看到,光标已经在第一个需要填的空上了,我们这时输入i=0什么的,然后再按下tab,发生了什么?

我们的光标越过了下一个分号,来到了应该填第二个空的地方.就像这样不断地输入+tab我们就填好了整个for语句结构.仔细想想,这样是不是很省事?是不是节省了很多时间?

其实,snippet就是一些自动的"填空题"机制,我们需要某种语法结构的时候,就召唤出相应"填空题",然后把空填上就可以了.说实在的,snippet就是这么个东西.

Yasnippet

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工作的,如果我们需要自定义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吧.

 

我的Emacs折腾经验谈(四) 也谈Yasnippet的更多相关文章

  1. Emacs折腾经验谈

    Emacs折腾经验谈 这几天都没有动力写mongodb的东西,我果然还是太懒了么~ 主要是没有一个系统的东西整理出来,加上我令人拙计的语言表达能力,这个坑只能慢慢再补了. 最近在折腾emacs这个东西 ...

  2. 我的Emacs折腾经验谈(二) Emacs上手难的原因

    既然之前说过要写我怎么继续折腾Emacs的,过了一个星期这里就是第二篇了,突然觉得我把blog这样分节不是很好,每次可能要凑一些东西才有该有的篇幅,而且说的东西可能东一点西一点,这样一篇看下来不利于检 ...

  3. 我的Emacs折腾经验谈(三) speedbar , tabbar 还有linum-mode

    离上一篇博客已经很遥远了,最近总是各种逛,但没有心思静下来写点东西,这回写一下我之前用的一些东西. Speedbar 首先是speedbar,这个东西是emacs自带的,效果立竿见影,请输入M-x s ...

  4. 我的Emacs折腾经验谈(一) 一些给新人的建议

    这几天都没有动力写mongodb的东西,我果然还是太懒了么~ 主要是没有一个系统的东西整理出来,加上我令人拙计的语言表达能力,这个坑只能慢慢再补了. 最近在折腾emacs这个东西,首先说我曾经算是个极 ...

  5. Windows折腾之路 兼谈纯净强迫情节

    早期新鲜感 想当年,终于有了第一台属于自己自由处置的电脑,1.2Ghz的CPU,256兆的内存.这在CPU刚刚上1G的年代,不说顶级,也算主流.操作系统呢,在别人的帮助下,装上新鲜的XP,各种的华丽, ...

  6. wr720n v4 折腾笔记(四):安装inode客户端njitclient

    前记: 既然折腾到这里,那就不怕再折腾一下了,之前说过最终还是安装南浦月大神的固件,折腾了一圈,怎么不直接在官方界面上安装呢,这里给出直接安装的方法,就是修改固件头为wr720nv4. 0x01 修改 ...

  7. K8s 系列(四) - 浅谈 Informer

    1. 概述 进入 K8s 的世界,会发现有很多的 Controller,它们都是为了完成某类资源(如 pod 是通过 DeploymentController, ReplicaSetControlle ...

  8. speedbar , tabbar 还有linum-mode

    我的Emacs折腾经验谈(三) speedbar , tabbar 还有linum-mode 离上一篇博客已经很遥远了,最近总是各种逛,但没有心思静下来写点东西,这回写一下我之前用的一些东西. Spe ...

  9. Linux下高cpu解决方案

    昨天搞定了一个十万火急的issue,客户抱怨产品升级后系统会变慢和CPU使用率相当高,客户脾气很大,声称不尽快解决这个问题就退货,弄得我们 R&D压力很大,解决这个issue的任务分给了我,客 ...

随机推荐

  1. WebService它CXF注释错误(两)

    WebService它CXF注解 1.详细报错例如以下 五月 04, 2014 11:24:12 下午 org.apache.cxf.wsdl.service.factory.ReflectionSe ...

  2. 怎样才能充分利用SQL索引

    原文:怎样才能充分利用SQL索引 背景:目前WEB的普及太快,很多网站都会因为大流量的数据而发生服务器习惯性死机,一个查询语句只能适用于一定的网络环境.没有优化的查询当遇上大数据量时就不适用了. 本文 ...

  3. JVM截至多少线程可以创建: unable to create new native thread

    最近的测试需要很长的连接server.这些数据需要达到100W长连接,试client.一个线程来保持连接.查找linuxserver创建者默认3200当多个线程.这个错误将得到"java.l ...

  4. Cocos2D-X2.2.3学习笔记3(内存管理)

    本章节介绍例如以下: 1.C/C++内存管理机制 2.引用计数机制 3.自己主动释放机制 1.C/C++内存管理机制 相信仅仅要懂oop的都知道NEW这个keyword吧,这个通俗点说事实上就是创建对 ...

  5. C语言库函数大全及应用实例四

    原文:C语言库函数大全及应用实例四                                    [编程资料]C语言库函数大全及应用实例四 couble fmod (double x, dou ...

  6. CSS3字体模块

    介绍 字体提供了包含字符的视觉表现的资源.在最简单的等级中,其包含由字符编码到表示这些字符的形状(被称为字形)的映射信息.根据一组标准字体属性被分入一个字体家族的字体共享一个通用设计风格.在一个家族中 ...

  7. android项目总体界面架构(可直接复用)

    文章解读.效果图.源代码下载链接 http://blog.csdn.net/gao_chun/article/details/37903673

  8. Installshield在安装结束时刷新系统

    原文:Installshield在安装结束时刷新系统 在OnEnd里添加代码,两种解决方案 群友kevin的解决方案 #include "ifx.h"  //Call to Win ...

  9. 算法如功夫——C++ 用递归函数计算n的阶乘n!

    算法如功夫,套路练久了,才干应用自如! 学功夫不能死练,知其所以然,取长补短! #include <iostream.h> int main(int argc, char* argv[]) ...

  10. Windows在结构objective C开发环境

    对于近期打算iPhone.iPod touch和iPad开发一些应用程序,所以.需要开始学习Objective C(苹果推出的类似C语言的开发语言).因为苹果的自我封闭的产业链发展模式(从芯片.机器. ...