gofujita notes

on outline processing, writing, and human activities for nature


Yasnippet を試す

Emacs での snippets の展開を可能にするパッケージ yasnippet.el を試している。

ここでいう snippets の展開とは、たとえば数文字の記号やアルファベットをタイプし、あらかじめ登録した文章や記号などのテンプレートを展開すること。これをつかってたとえば「May the force be with you」みたいなよくつかうメールの締めことばを「may」のような略号から展開し、カーソルの位置などへ出力できる。

Emacs に出会うずっと前から snippets の展開には macOS アプリの TextExpander をつかってきた (感謝..)。TextExpander と IM の合わせ技で Emacs をつかっている最中も snippets の展開はナンとかなっていたので、Emacs だからこその snippets 展開をつかうのは後まわしにしていた。

で、ランダムノートを意識した構造のノートをとるようになったのと (経緯はたとえば「Scripting News のしかけを考える」)、org mode でコードブロックをよくつかうようになり、そろそろ本腰入れて Emacs の snippets 展開の機能を試すことにした。

(コードブロックは、こうした文章のあいだにコードをかいて小さく実行するしかけで、たとえば「#+begin_src emacs-lisp」と「#+end_src」とかいた2つの行ではさんだ範囲に Emacs Lisp のコードをかき、C-c C-c で評価 (実行) できる)

パッケージ yasnippet.el をインストール。今回は github の説明に沿って terminal で以下のコマンドで実行。

$ cd ~/.emacs.d/plugins
$ git clone --recursive https://github.com/joaotavora/yasnippet

あっという間に終わる。終了後、Emacs へ戻って設定ファイル (ぼくの場合は .spacemacs (defun dotspacemacs/user-config ()) の下位階層) に、以下のコードを入れる。

(add-to-list 'load-path "~/.emacs.d/plugins/yasnippet")
(require 'yasnippet)
(setq yas-snippet-dirs '("~/.emacs.d/snippets"))
(yas-global-mode 1)

1行目は yasnippet のファイル群の入ったフォルダまでのパスをとおすコードで、2行目は yasnippet を Emacs に呼び出すコード。3行目では、yasnippet が snippets 展開のためのデータをよみにいくフォルダ (この場合は snippets という名前のフォルダ) を指定している。

4行目では yasnippet の機能を global mode、つまり Emacs のどんな場所からでもつかえる mode として設定している。

この設定ファイルを再度よみこむか、Emacs を再起動すると yasnippet がつかえるようになる。

Yasnippet で新しい自分の snippets を設定する。まず M-x yas-new-snippets で snippets 設定 buffer がひらく。そこには、以下のような文字列がならんでいる。

# -*- mode: snippet -*-
# name: 
# key: 
# --

name は snippet の名前。たとえば greeting (あいさつ) とする。key が、展開するためのキーワード。ここでは may の3文字にする。そして "# --" 下の空白に展開したいセンテンスや記号などを入れる。たとえば "May the force be with you!"。

# -*- mode: snippet -*-
# name: greeting
# key: may
# --
May the force be with you!

これを先に指定した snippets というフォルダに名前をつけて保存する。このとき、たとえば org mode でかいていると yasnippet が snippets フォルダの下に org mode というフォルダを予測してつくってくれたりするので、名前を変えてもいい。ファイル名には ".yasnippet" という拡張子をつける。たとえば上のジェダイたちのあいさつ文なら greeting.yasnippet。

つかい方。設定したテンプレートは key のあとに TAB で展開できる。この場合は may TAB とタイプすると "May the force be with you!" が point (カーソル) の位置などに展開する。

Snippets を展開する機能は、とくに org mode のような dynamic documents で効果を発揮すると、ぼくは考えている。

この機能の延長として、たとえば timestamps (タイプしている瞬間の時刻や日付) をテンプレートの一部あるいは全部として自動展開する機能もある。たとえば dd TAB で "06-04-2023"、 tt TAB で "06:44" といった感じ。

そして Yasnippet では snippets 展開を有効にする mode を限定できる。だからたとえば org mode では tt TAB をタイプすると "** 06:44" と bullet 記号つきで展開するが、他の mode の tt TAB は "06:44" になる、という使い方ができる。"** 06:44" は org で時刻名の項目名になり、その下にかく文章をそこで折りたたんだりフォーカスしたりできる。

さらに yasnippet には、多くの人がつかうテンプレートをつくってまとめたパッケージもいくつか準備されている。

こうしたパッケージすべてをつかいこなすつもりはないけれど、「text expansion」と呼ばれる機能の中で、自分のノートにかきながら考える作業を助けてくれそうなものを探っていきたい。

で、次回はこの yasnippet を試している中で出会った、それとは別の機能「text dynamic expansion」を短く紹介する予定。