iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 7
1
Software Development

Emacs 來寫程式系列 第 7

[Emacs-7] 管理程式碼片段 (Snippet) 的 yasnippet 套件

程式碼片段 (snippet)

  • 當編輯程式時,有時候會有一些固定的程式碼當作範本,然後在依照自己想要的部分加入,舉個例子,寫 HTML 時,最常用的片段就是
<!doctype html>
<html>
  <head>
    <meta charset="UTF-8"/>
    <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scal\e=1.0"/>
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
    <title></title>
  </head>
  <body></body>
</html>
  • 如果每次寫一個這種檔案,每次都要重新打一次,真的是浪費生產力,因此每個編輯器都會有讓使用者自己定義 Snippet 的功能,只要定義一次,配合所需要的關鍵字 (key),編輯器就會帶出相對應得程式碼,這就是 Snippet 的功能

安裝 Yasnippet

  • 前面 介紹過 Emacs 的套件管理,我們之後的套件都會使用 use-package 來做管理
  • 加入以下程式到 ~/.emacs.d/init.el
(use-package yasnippet
  :ensure t
  :config
  (yas-global-mode)
  (use-package yasnippet-snippets :ensure t)
  )
  • yasnippet 次模式設定為全區 (global) 模式,意思是不管什麼主模式,我們都會使用這個次模式,當然這個設定看使用者習慣,因為我用 Emacs 主要來寫程式,所以我會把這個選項開啟。
  • yasnippet 這個套件並沒有帶現成的 snippet, 因此我們會加入 yasnippet-snippets 這個套件,這個套件包含了相當多的程式預設 snippets snippets
  • 不同的主模式,可以定義自己的 snippet,舉個例子,在 C++模式 下的 mainPython 模式 下的 main 當然會不同
  • 我們也可以自己定義 snippet,或者使用別人定義過的

使用 yasnippet

  • 當進入一個新的模式時,你可以使用 Meta-x yas-describe-tables 來看在這個模式下現存的 snippets ,例如在 Emacs Lisp 模式下 Emacs-lisp
  • 要看它的定義時,只要將游標移到要看的目標的反白部分,按 Enter,就可以進入他的定義 Imgur
# -*- mode: snippet; -*-
#contributor: Xah Lee (XahLee.org)
#name: add-hook
#key: add-hook
#key: ah
# -- 
(add-hook '${1:name}-hook ${2:'${3:function}})$0  
  • # 來區分表頭,key 就是讓使用者啟動這個 snippet 的關鍵字
  • $1 或者 ${1:name} 是只游標停留的第一個位置,按 Tab 鍵會到 $2 或者 ${2: ...}$0 是完成輸入後游標預設的位置
  • 試試看,在 test.el 下,打入 ah,然後按 Tab 鍵,就會帶出如下 ah
  • 因為定義了 name,會將 name 選起來,等待使用者來打入新的字,打完後按一下 Tab 鍵會到下一個位置如下 next
  • 因為使用者可能會使用匿名函數,所以讓使用者停在第一個位置,如果直接打的話,就會將 'function 取代,如果的確要使用 function,那就再按一次 tab,就會停在 function 上,讓使用者來取代 function 的字,打完後再按一次 tab 就會將游標移到最後 final

自己定義 Snippet

  • 自己定義的 snippet 預設會在 ~/.emacs.d/snippets 下,如果你在 C模式 下定義,它會為你開一個 c-mode 的目錄,底下存放這些定義
  • Emacs 定義的方式,使用M-x yas-new-snippet 或者快速鍵 Ctrl-c & Ctlr-n,進入 new
  • 自己可以定義 namekey 以及要使用的程式片段,例如 test
  • Ctrl-c Ctrl-c 來儲存,它會猜你要存放的主模式,當然你也可以自己設定 mode
  • 接著會存放這個 snippet,系統會有建議的目錄 file
  • 如果目錄不存在,會問使用者要不要建立目錄,dir
  • y,後就可以存檔
  • 接著就可以使用

可以參考影片的介紹 Yes

也歡迎到我的部落格

程式的部分,放在 Github,你可以直接下載 init.el~/.emacs.d/ 下,啟動 Emacs,就會自動安裝這些套件


上一篇
[Emacs-6] 讓你更快速執行指令的套件, Ivy-mode
下一篇
[Emacs-8] 程式自動補全套件 : Company-mode
系列文
Emacs 來寫程式30

尚未有邦友留言

立即登入留言