如果網友常用 Notepad++ 寫程式而且又需要 Snippet 功能,進來這裡就對了。花個五分鐘時間,我介紹一下 Code Express 這個 plugin。

Notepad++ 已經有很多 plugin 了,雖然 Snippet 功能也不少,但我用起來總是不太順手。之前比較有人用的 QuickText 雖然操作簡單,但它改變 Notepad++ 的行為到了難以使用的地步,若是只為了 Snippet 功能實在得不償失。另外兩個非常優秀的實作是 FingerText 和 Zen Coding,其中 Zen Coding 專注在 WEB 開發上,和我平常的應用比較無關;FingerText 和 QuickText 一樣完全採用 Tab 鍵 觸發的方式,使用起來非常方便,並且採用特殊文字標記的方式完全避開 QuickText 的 bug。

我想要一個像 C macro 那樣取代文字的 snippet 功能,然後又有 FingerText 的味道,於是在週末做了一個小小的 weekend project: Code Express。目前還只是概念驗證的階段,沒有努力的把所有的東西調好,不過網友實際操作看看應該可以體會我想要的設計。

檔案和原碼現在暫存在http://ge.tt/9Z61DY5(過期,新專案頁見 https://code.google.com/p/code-express/
),下載解壓縮後把 bin 資料夾中的東西丟到 Notepad++資料夾下即可。因為某些很奇怪的原因,前幾次我註冊 Sourceforge 都失敗了(這不是一天兩天的事,而是過去一直都這樣。算了,反正我不是天生愛分享的人),或許晚點等到功能比較穩定了我再放到 Google code 上吧。

How to Use

Code Express 的驅動方法有兩種,其中 tab 觸發的方式和 QuickText、FingerText 完全相同。以下用內建的幾個 snippet 示範一下,假如網友安裝妥當,用 Notepad++ 開啟新文件,鍵入「lorem」然後再按 tab ,就會變成一大段 lorem ipsum文字:

Lorem ipsum dolor sit amet, consectetur adipisicing elit, ...

有些 Snippet 支援變數取代,只要輸入 snippet tag 之後緊接著「=」號就表示進行取代的意思。接下來可以試試鍵入「forit=it;vec」再按 tab 鍵,記住中間不可以有任何空白,然後會得到:

for (it = vec.begin(); it != vec.end(); ++it) {

}

鍵入「forit=it」加 tab 會得到

for (it = .begin(); it != .end(); ++it) {

}

鍵入「forit」後不加「=」號直接 tab 就不會進行任何取代,於是得到

for (@{iterator} = @{container}.begin(); @{iterator} != @{container}.end(); ++@{iterator}) {

}

中間那一大堆 @{...}的東西可以很簡單的使用快速鍵「alt+.」和「alt+,」逐一拜訪以及修正。本功能在 FingerText 是靠 tab 觸發的,但我發現有時候會搞混,所以用不同的快速鍵實作。

用 tab 觸發在功能上會有所侷限,因此 Code Express 也提供了以對話方塊輸入的模式,你可以在對話方塊輸入更複雜的文字,包含空白和各種運算符號。

現在先把剛剛的文字全選起來,然後用「alt+enter」叫出對話方塊,然後鍵入 「ifel=a > b」再按 enter,我們會發現所選取的文字會被下面的程式碼包圍住:

if (a > b) {
    // 剛才所選取的文字
} else {

}

How to Edit Snippets

以上只是內建用來 demo 的 snippet,接下來談談編輯 Snippet 的方法。Snippet檔案是以 xml 格式存在 [Notepad++]/plugin/config/CodeExpress底下,每一種程式語言都有專屬的 xml 檔,想要為自己常用的程式語言增加 snippet 檔案,只要新增一個「語言名稱.xml即可」。目前支援的程式語言名稱有:

txt      php      c        cpp      cs
objc     java     rc       html     xml 
makefile pascal   batch    ini      nfo 
user     asp      sql      vb       js 
css      perl     python   lua      tex 
fortran  bash     flash    nsis     tcl 
lisp     scheme   asm      diff     props
ps       ruby     smalltalkvhdl     kix
au3      caml     ada      verilog  matlab
haskell  inno     search   cmake    yaml 
external global

現在我還沒有時間製作專屬的編輯器,所以最好還是使用 Notepad++ 直接編輯這些 xml,使用折疊層次2(alt+2)的檢視模式會非常方便。

xml 檔的格式如下


<?xml version="1.0"?>
<CodeExpress>

<snippet tag="gpl">...</snippet>
<snippet tag="lorem">...</snippet>
...
</CodeExpress>

每個 snippet 的內容為

<snippet tag="ig">
<var name="def"></var>
<code>
<![CDATA[#ifndef @{def}
#define @{def}

@{SEL}

#endif
]]>
</code>
</snippet>
  • tag 是你希望用來觸發功能的文字
  • var 是變數名稱,程式碼模板中只要@{..}當中的文字和變數名稱相同就會被取代,最多只能設5個變數,超過的會被忽略
  • code 是程式碼區段,請注意程式碼一定要放在 CDATA 當中。
  • @{SEL} 是一個特殊標記,假如你有選擇任何程式碼的話會被插入到這裡。

不論使用 tab 或者對話方塊模式,都可以插入 ig 這個 snippet,鍵入 「ig=SAMPLE_H」後,所有 @{def} 就會被 SAMPLE_H 取代,假如有任何文字被選取,則會被插入到 @{SEL} 的位置上。

已知的問題

太晚了,明天再打....

novus 發表在 痞客邦 PIXNET 留言(1) 人氣()


留言列表 (1)

發表留言
  • west
  • 滿特別的proof of concept
  • 你喜歡這個想法嗎?歡迎提供任何意見。

    我正在做alpha版,操作會變得稍微單純一點,文字取代的功能更強大,只是 Snippet 檔的格式會變得比較複雜。這星期在忙別的事,所以進度緩慢

    novus 於 2011/07/07 19:39 回覆