我的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 "\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吧.

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM