Dashboardで起動画面を素敵にしよう✨

この記事は[Emacs Advent Calendar 2018](https://qiita.com/advent-calendar/2018/emacs)の20日目の記事です。

こんにちは🤗
初Emacs Advent Calendarです。

今日は起動画面に様々な情報できるEmacs Dashboardを紹介します。

# Emacs Dashboardとは

昨年のアドベントカレンダーで[@kiwanamiさんからも紹介](https://qiita.com/kiwanami/items/d10fac42d30a14c6c28d)されていますが、
Emacs起動時の初期画面にロゴやRecent files, Bookmarksなど便利な情報を表示してくれるパッケージです。

<img width="872" alt="screenshot.png" src="https://qiita-image-store.s3.amazonaws.com/0/15684/ee32569a-6b45-d9af-d050-7dcca60d0b7c.png">

[GitHub - rakanalh/emacs-dashboard: An extensible emacs dashboard](https://github.com/rakanalh/emacs-dashboard)


パッケージを入れた後、 `dashboard-items` に値をsetqしてあげることで、以下の情報が表示できます。


-   Recent files
-   Bookmarks list
-   Recent projectile projects list (Depends on \`projectile\` package)
-   Org mode agenda
-   Register list

```elisp
(setq dashboard-items '((recents  . 5)
                        (bookmarks . 5)
                        (projects . 5)
                        (agenda . 5)
                        (registers . 5)))
```

何も設定しない場合、Recent files, Bookmarks list, Org mode Agendaが表示されます。


# Dashboardに表示情報を追加するには

Dashboardには上記の以外にも、
表示用の関数を用意し、 `dashboard-item-generators` リストに追加することで、独自の情報を表示することができます。

下記サンプルとなります。


```el:dashboard-item-editors
;; dashboard-item-generatorにエディタ名を表示する関数を追加する
(add-to-list 'dashboard-item-generators
             '(editor . (lambda (list-size)
                          (dashboard-insert-heading "Text Editors:")
                          (mapc (lambda (el) (insert "\n" el))
                                '("Emacs" "Vim" "VSCode" "Atom")))))
;; dashbord-item（表示する項目）のリストに上記で定義した情報を設定する
(setq dashboard-items '((editor . nil)))
```

![editors.png](https://qiita-image-store.s3.amazonaws.com/0/15684/5dad5ce7-7a6a-ca82-8737-ca79714a13b6.png)

# 様々な情報を表示させる

`dashboard-item-generators` と独自関数を組み合わせることで様々な情報を表示することができます。

例えば、QiitaのAPIをコールし記事を表示する！みたいなことが可能です。

```el:dashboard-item-qiita
;; APIコールにrequest.elを利用
(require 'request)

;; アイテム表示用関数
(defun dashboard-qiita-insert-list (list-display-name list)
  "Render LIST-DISPLAY-NAME and items of LIST."
  (dashboard-insert-heading list-display-name)
  (mapc (lambda (el)
          (insert "\n    ")
          (widget-create 'push-button
                         :action `(lambda (&rest ignore)
                                    (browse-url ,(cdr (assoc 'url el))))
                         :mouse-face 'highlight
                         :follow-link "\C-m"
                         :button-prefix ""
                         :button-suffix ""
                         :format "%[%t%]"
                         (decode-coding-string (cdr (assoc 'title el)) 'utf-8))) list))

;; 記事を取得し、表示する関数
(defun dashboard-qiita-insert (list-size)
  "Add the list of LIST-SIZE items from qiita."
  (request
   (format "https://qiita.com/api/v2/items?page=1&per_page=%s" list-size)
   :sync t
   :parser 'json-read
   :success (cl-function
             (lambda (&key data &allow-other-keys)
               (dashboard-qiita-insert-list "Qiita:" data)))))


;; dashboardに記事を追加
(add-to-list 'dashboard-item-generators '(qiita . dashboard-qiita-insert))
(setq dashboard-items '((qiita . 20)))
```

![update.png](https://qiita-image-store.s3.amazonaws.com/0/15684/b0ab11ab-f691-af8c-e55f-b96b29c2f9f8.png)

# まとめ

簡単でしたが、
簡単に軌道画面をカスタマイズできるEmacs Dashboardを紹介しました。
Dashboardでお好みの起動画面にコーディネートしてみましょう！

明日はconao3さんの「use-packageからの移行のすゝめ - leaf.elでバージョン安全なinit.elを書く」です！