歡迎您光臨本站 註冊首頁

linY is not Yasnippet

←手機掃碼閱讀     火星人 @ 2014-03-12 , reply:0
  

首先感謝 xfq 同學,他幫我解決了一堆問題的同時,順便幫我解決了一個最核心的問題:一個拉風的名字!而且現在我也不用再費勁想一個文章的標題,難道這就是傳說中的 DRY?-_-!!!

其次要感謝 xfq 同學——本來我是可以一直忍著不用 snippet 的,後來從他處聽說 emacs 25 要對 snippet 進行官方的調整,尤其是調整的周期比較長……然後我就不淡定了。凡事就怕惦記著,有一天我終於忍不住了,你懂的

至於 liny 是作什麼的,感興趣的同學可以從標題中看出來,不感興趣的同學還是閉上眼吧 

進入正題,簡單介紹 liny 的一些特性(可能有些我一時忘記了,但是不代表沒有;可能有些我從來都不知道,但是不代表你不知道) 

  1. 速度方面:

    在運行速度方面我不敢作出保證,因為還會有一些功能加入。不過 snippet 並不是插入時解析,而是預解析並緩存的

    在啟動速度方面應該不成問題,snippet 是按需載入的,用的時候解析並緩存——也就是說你沒有用到的 snippet 不會解析和緩存。

    另一方面,liny 的體積相當小巧,啟動時只載入引擎和擴展,如果用上 autoload,那麼 emacs 啟動時 liny 佔用的時間可以直接無視 (其實我也承認,任何東西用上 autoload ,啟動時間都可以無視……所以呢,liny 實際啟動也還蠻快的) 

  2. 定製方面:

    除了角色需要在插入時確定外,其它的基本都可以自定義:比如默認用 ${xxx} 和 $123 這樣的標記作為 snippet 中的域,裡面用 : 表示 prompt,用 $ 表示需要計算的表達式,這些都提供列表可以方便的定製……甚至可以同時使用多種不同的格式

    這個 snippet 里用的是另外一種格式,並且和其它的 snippet 互不影響

    當然,有些差別是解析方式造成的,所以要兼容 yas textmate 等格式可能比較難,其實運行時定製語法格式主要是為了擴展用的(好像目前還沒有用到 -_-!!!)

    另外在編寫的時候考慮到擴展的需求,總體來說還是比較容易擴展的……為了測試擴展的方便程度,我甚至還寫了幾個擴展

    見這裡 

  3. 用戶界面

    支持兩種匹配模式:

    傳統模式按模式和別名,通過一定規則生成相應的文件名,然後根據文件名載入,必須說這種方式比較二逼, 比如說 for 的兩種循環,很多語言里長得都跟親兄弟似的,完全沒有必要每種模式都寫一遍;

    這種模式的好處是:snippet 文件中不需要定義額外的信息,比較簡單…… 不過話說回來,很多人習慣在任何文件的頭部寫上註釋,只恨不得把七大姑八大姨的芳名也寫進去, 反正寫什麼都是寫,不如寫點有用的東西不是?

    所以這種匹配模式我已經在第一時間給廢掉了……當然,如果你就喜歡這個調調,啟用也是很簡單的……只要禁用另一個名為 smart-match 的擴展就可以了

    因為需要按需載入,所以需要有索引,而又要同時支持這二種匹配模式,所以索引文件也有二個……似乎有點二,不過總比每次啟動要重新讀取一遍要強

    第一種索引只要生成文件列表就可以了,相當簡單,智能匹配也只是讀取 snippet 文件中的相關欄位

    智能匹配現在還不太完善,因為相關的規則還在摸索中,不過勉強可用了 

  4. 功能方面

     首先按順序編輯域和鏡像域是必須的,這個不用多說;

    還有縮進的方式,是按定義時的還是按上下文的,這個也可以選擇(目前是由一個變數控制,有時間改下,可以在 snippet 文件中單獨控制), 可能有點小問題(目前在我的使用中還沒有出現相關情況,不過我知道那裡有點問題,還沒有空改,等攤上事兒的時候再說吧)

    skeleton ,參見 head 和 remove-overlays 兩個 snippet

    另外還有一些特色的功能,通過擴展實現的:

       

    • 動態插入,f 這個 alias 的參數部分,隨便輸點什麼按空格,後面會再插入一個域

        

    • 模板擴展,這個比較強大,不過目前還沒有弄好,這塊相當的複雜,co 這個 alias 多 tab 幾下可以看到效果

       

    • 跳轉時可以選擇按插入時的順序,或者是按 snippet 定義中的編號順序

     

     還有一些計劃中的功能:

     

    ……差不多了,等發布0.01版的時候,就這些功能吧……先寫在這裡,如果我忘了,記得提醒我

     

  1. 嵌套定義域,由於支持模板擴展的需要,在解析時是匹配括弧的,也就是說,忽略內嵌的域定義(其實這樣反而更麻煩)。 因此對於嵌套定義域不是原生支持,不過要支持它難度不大,主要是有沒有更廣泛的應用方式 這個特性目前的應用方式我知道的只有:默認語句中的默認參數,如果不同意該語句,全部換掉,如果同意該語句, 下一個域繼續修改參數
  2. 自動折行,這個可能要增加一個折行點的定義,貌似比較棘手
  3. 增加一個快速添加 snippet 文件的介面
  4.  

最後,抱歉的是,目前 liny 還沒有一個單獨的版本庫,所以 https://github.com/ran9er/init.emacs/tree/master/liny 這個文件夾里的東西想辦法全部下載, 當然你也可以直接同步我的配置文件,以表示對於 github.com 工作的支持和肯定。

在配置文件中這樣寫

  (let ((key "\C-q")                                        ;; 這裡是快捷鍵      (path (expand-file-name "liny/liny.el" *init-dir*)) ;; 這裡可以寫 liny.el 的絕對路徑      (setq liny-expand-maybe-instead-command (key-binding key))      (autoload 'liny-expand-maybe path "" t)      (global-set-key key 'liny-expand-maybe))  

 



[火星人 ] linY is not Yasnippet已經有424次圍觀

http://coctec.com/docs/linux/show-post-64984.html