• 我的Emacs折腾经验谈(四) 也谈Yasnippet


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

    正题开始之前先说点题外话,最近使用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 "
    " (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吧.

     
  • 相关阅读:
    TypeScript 2.0 正式发布
    亚太物联网市场前景巨大 2020年预计达到793亿美元
    亚太物联网市场前景巨大 2020年预计达到793亿美元
    亚太物联网市场前景巨大 2020年预计达到793亿美元
    亚太物联网市场前景巨大 2020年预计达到793亿美元
    QTP VBScript RegExp对象的运用
    QTP VBScript RegExp对象的运用
    QTP VBScript RegExp对象的运用
    base64 编码和解码
    nginx 4层负载多个端口
  • 原文地址:https://www.cnblogs.com/qazwsxedc121/p/3285552.html
Copyright © 2020-2023  润新知