个人Emacs折腾经验谈(四) 也谈Yasnippet

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

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

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

 

进入正题:Yasnippetgit

啥是snippet

对于文本编辑器来讲,snippet这个东西应该算很是有用了,尤为是对于java/c++程序员来讲,能够迅速而正确地写出一个块的基础框架,没有接触过snippet的同窗能够想想IDE里面的快速补全,虽然两个东西仍是颇有差异的.咱们拿sublime举个例子:程序员

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

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

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

咱们的光标越过了下一个分号,来到了应该填第二个空的地方.就像这样不断地输入+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吧.

相关文章
相关标签/搜索