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

正题开始之前先说点题外话,最近使用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. HDU 4006 The kth great number AVL解

    提供动态更新数据.第实时QK大量的值什么? 使用AVL统计数据结构做,比较先进的数据结构的内容. 不知道给出的数据为准值是否有反复.下面的程序是因为我能够处理重复数据出现的情况下,. 了repeat的 ...

  2. 【百度地图API】如何制作公交线路的搜索?如331路

    原文:[百度地图API]如何制作公交线路的搜索?如331路 摘要: 从A点到B点的公交导航大家都知道怎么做了,那么单独查询331路公交车的公交路线,如何制作呢?我们一起来学习一下~ --------- ...

  3. 【百度地图API】如何制作泡泡放大镜?

    原文:[百度地图API]如何制作泡泡放大镜? 任务描述: 我不喜欢API提供的缩放控件耶…… 我能不能使用其他方式放大地图勒? 当然阔以啦! 现在就来教大家如何动手制作一个可爱的泡泡放大镜! 使用它, ...

  4. TLD跟踪算法优化(一)并行化

    才学疏浅,仅仅言片语,仅仅求志同道的朋友一起交流研究. 并行化不算是算法的改进,仅仅是追求执行的实时性. 简要列举一个样例: TLD算法的C++版本号源代码里: LKTracker::trackf2f ...

  5. C# ---- 串口数据YSI实例

    原文:C# ---- 串口数据YSI实例 C#----串口数据接收发送中,发送接收数据已经可以模拟了. 本次YSI实例过程中 主要是:类型转换问题 .计算校验码 一.不同设备不同的规则,本次实例代码如 ...

  6. Android超炫日期日历控件:TimesSquare

    先看效果图: 使用说明: 在布局文件里: <com.squareup.timessquare.CalendarPickerView android:id="@+id/calendar_ ...

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

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

  8. 本学习笔记TCP/IP传输协议

    一个.通过网络发送数据,大致能够分为面向有连接与面向无连接两种类型: 1.面向无连接型包含以太网. IP.UDP等协议. 2. 面向有连接 型包含ATM.帧中继.TCP等 协议. 通过一张图了解一下: ...

  9. Chrome控制台 JS调试

    Chrome控制台 JS调试的一些小技巧 $ $_命令返回最近一次表达式执行的结果,功能跟按向上的方向键再回车是一样的,但它可以做为一个变量使用在你接下来的表达式中. $0~$4则代表了最近5个你选择 ...

  10. [Elasticsearch] 集群工作 - 第二部分

    本文翻译自Elasticsearch官方指南的life inside a cluster一章. 添加故障转移(Failover)功能 仅仅执行一个节点意味着可能存在着单点失败(Single point ...