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

正题开始之前先说点题外话,最近使用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. 了解了解你自己的话zookeeper(从那时起,纠正了一些说法在线)

    1,先看看官方的定义吧: ZooKeeper is a distributed, open-source coordination service for distributed applicatio ...

  2. Bootstrap-maxlength使用

    这是一个很酷jQuery实现Bootstrap小工具,输入用户同意的字符数.它可以让你显示字符用户插入的最大长度. 1.引入jquery.js及bootstrap-maxlength.js 2.给页面 ...

  3. Introducing Visual Studio’s Emulator for Android

    visual studio 2015支持Android开发了. Microsoft released Visual Studio 2015 Preview this week and with it ...

  4. JS 数组array方法push, pop, unshift, shift, slice,splice,contact, join, sort

    Array:数组对象用来在单独的变量名中存储一系列的值   定义数组:         1. var arrayObj = new Array();         2. var arrayObj = ...

  5. Windows socket之最简单的socket程序

    原文:Windows socket之最简单的socket程序 最简单的服务器的socket程序流程如下(面向连接的TCP连接 ): 1. WSAStartup(); 初始化网络库的使用. 2. soc ...

  6. Silverlight中的Path

    原文:Silverlight中的Path 在Silverlight中Path可能由直线.曲线.或者其他简单的图形对象组成.这篇文章旨在介绍如何使用XAML和C#来创建Path. 废话先行 Path可能 ...

  7. 第4章1节《MonkeyRunner源码剖析》ADB协议及服务: ADB协议概览OVERVIEW.TXT翻译参考(原创)

    天地会珠海分舵注:本来这一系列是准备出一本书的,详情请见早前博文“寻求合作伙伴编写<深入理解 MonkeyRunner>书籍“.但因为诸多原因,没有如愿.所以这里把草稿分享出来,所以错误在 ...

  8. C#yield return和yield break

    C#yield return和yield break 晚上好,各位.今天结合书中所讲和MSDN所查,聊下yield关键字,它是我们简化迭代器的关键. 如果你在语句中使用了yield关键字,则意味着它在 ...

  9. yii中登录后跳转回登录前请求的页面

    当我们请求一个经过权限控制的请求不通过时,会跳转到一个地方请求权限,请求结束后需要跳转回之前的页面.比如我们请求一个需要登录的action,会被跳转到login页面,我们希望登录成功后跳转到我们之前希 ...

  10. 大批量烧写openwrt系统

    http://wiki.openwrt.org/toh/tp-link/tl-wr1043nd OEM mass flashing Flashing hundreds of devices using ...