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

正题开始之前先说点题外话,最近使用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. krpano音量控制(我们已经转移到krpano中国网站 krpano360.com)

    需求: 实现音量控制,这是官网的样例, 本文已经转移 到 krpano中文网 p=148">http://krpano360.com/? p=148 很多其它教程关注微信公众号 krp ...

  2. 基于Http替补新闻WebService数据交换

    该系统的工作之间的相互作用.随着信息化建设的发展,而业界SOA了解并带来低TOC(总拥有成本)其他优势.越来越多的高层次的信息使用者关注. 这里暂且不提SOA这种架构规划.在系统间集成协议简单的讨论. ...

  3. cform 开发框架介绍

    CForm是从2012年开始研发的一套灵活,易用,简单,成熟的中小型应用系统开发框架.目前已成功应用在浙江大学.温州科技职业学院.广西农业局.青岛市农业局.乐清妇保院.老博会.婚尚起义结婚网等单位. ...

  4. Apache启动失败,请检查相关配置。MySQL5.1已启动成功

    解决办法 一: 把左下角的SSL钩上了,如果你没有用证书,就把那个去掉,有的朋友去掉就可以了.也可能再装了证书钩上SSL也可以用了. 二: 看了说的把SSL勾掉的办法,也解决不了.后来就去查卡巴,也没 ...

  5. JAVA学习课第五十三届 — IO流程(七)File打靶 &amp; Properties设置

    一个.锻炼 深度遍历目录 深度遍历非常自然而然想到递归,而递归就非常自然的想到事实上现的底层算法是栈 对指定文件夹下列出全部内容(包括子文件夹的内容) PS:建议不要遍历C盘 import java. ...

  6. AutoMapper 创建嵌套对象映射(原创)

    之前在做DTO转换时,用到AutoMapper.但DTO的层次太深了,无奈官方没针对嵌套类型提供好的解决方案,于是自己实现了一下: 思路:采用递归和反射很好的避免手工创建嵌套对象的映射. 第一个版本, ...

  7. jQuery弹出窗口完整代码

    jQuery弹出窗口完整代码 效果体验:http://keleyi.com/keleyi/phtml/jqtexiao/1.htm 1 <!DOCTYPE html PUBLIC "- ...

  8. Building Modern Web Apps-构建现代的 Web 应用程序

    Building Modern Web Apps-构建现代的 Web 应用程序 视频长度:1 小时左右 视频作者:Scott Hunter 和 Scott Hanselman 视频背景:Visual ...

  9. 我的Android 4 学习系列之创建用户基本界面

    目录 使用视图和布局 理解Fragment 优化布局 创建分辨率无关的用户界面 扩展.分组.创建和使用视图 使用适配器将数据绑定到视图 使用视图和布局 1. Android UI 几个基本概念 视图: ...

  10. 开辟html5和css3学习随笔(2015-3-2)

    1.移动端超出指定行数隐藏并显示省略号 <!DOCTYPE html> <html> <head> <meta http-equiv="Conten ...