個人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吧.

相關文章
相關標籤/搜索