【Windows10】JupyterNotebookでスニペットを使えるようにする方法1
Windows10のJupyterNotebookでスニペットを使えるようにする記録。
【目次】
【実行環境】
Windows10
Anaconda
JupyterNotebook
Python3.7
コマンドプロンプト
【スニペットSnippetとは?】
スニペットとは英語でSnippetと書き、「断片」や「切れ端」という意味だそうです。
プログラミング用語ではコードの切り貼りができるテクニックのようなものを指しているようですが、定型文
を呼び出せるツールを想像したら判り易いかと思います。
文章による定型文の替わりにプログラミングコードをスニペットとして登録しておいて、キーワードを入力すると瞬時に自動補完でコードがレンダリングされる。置き換わるわけです。
それにより素早いコーディングや文章生成が可能となる。YouTubeなどでそれを使った「10分でWebサービスを作る!」みたいな実演されてたりします。
画面上に次々とコードが出現して、あっという間に形作られる。魔法のようです。
【JupyterNotebookでスニペットを使えるようにする】
JupyterNotebook専用の拡張機能を使ってスニペットを使えるようにします。
まずは拡張機能のファイルをインターネットからダウンロードしインストールします。
◆拡張機能jupyter_contrib_nbextensions
のダウンロードとインストール
コマンドプロンプト(その他ターミナル)から次のコマンドを実行します。
pip install jupyter_contrib_nbextensions
21MBほどのサイズでした。Successfully built なんちゃらかんちゃら と出たらOK。
そしたら次のコマンドを実行。
jupyter contrib nbextension install --user
これで拡張機能のインストールは完了。
◆JupyterNotebook起動
JupyterNotebookを起動します。開いてる人は閉じて再起動。
jupyter notebook
このコマンドでJupyterNotebookが起動します。
◆Nbextensionsタブで拡張機能のON/OFF設定
jupyter contrib nbextension
のインストールが済み、JupyterNotebookを起動すると画面に「Nbextensions」というタブが追加されます。
「Nbextensions」タブをクリックした画面
Configurable nbextensions
の下のチェックを外す。
チェック disable configuration for nbextensions without 云々
は、拡張機能を全部「無効」にするチェック。
デフォルトで全て無効になっている。
「ONにし過ぎるとnotebookの環境を壊すかもしれんばってん、役に立つばい」と書いてある。
一覧にある一つ一つが拡張機能で、チェックを入れれば使えるようになる。
チェックするとその下に拡張機能名や使い方などが表示される。
◆2種類あるスニペット拡張機能
一覧に「Snippets」と「Snippets Menu」の2つがあります。
微妙に違いますが、今回は「Snippets」を見ていきます。
◆Snippets(ドロップダウン)の設定
★ Snippets(ドロップダウン)の説明
スニペットが貼り付けられたセルが新規作成される。
「Snippets Menu」とは別物です。注意。
SnippetsをONにするとNotebookにドロップダウンメニューが出現します。
- NbextensionsタブでSnippetsをONにしたら一番左の「Files」タブをクリック。
- 適当な
ipynbファイル
かNew
で新規ipynb
を作成。ブラウザの新しいタブが開く。 - JupyterNotebookのToolbar(保存アイコンなどが並んでる所)の一番右に「Snippets」ドロップダウンメニューが追加されている。
↓
★ Snippets(ドロップダウン)の使い方
ドロップダウンメニューのどれかをクリックすると選択中のセルの上側にスニペットが貼り付けられた新規セルができる。
codeセルのみっぽい。Markdownセルなどにしたければ、貼り付けた後に変更する方法しかない?
★ Snippets(ドロップダウン)のスニペット登録方法
スニペットの新規追加方法
追加方法は「Nbextensionsタブ」のConfigurable nbextensionsでSnippetsにチェックを入れた際にその下に表示された中にあるAdding new snippetsに書いてあります。
$(jupyter --data-dir)/nbextensions/snippets/snippets.jsonというJSON形式のファイルを書き換えてスニペットを登録する。
パスを取得するために次のコマンドをターミナルから実行します。
jupyter --data-dir
我がPCは「C:\Users\ユーザー名\AppData\Roaming\jupyterに入っている」とおっしゃっております。
注)ユーザー名は実際のユーザー名が入っています。
残りのパスnbextensions\snippets\snippets.json
をつなげてパス指定し、JSONファイルの中身を見てみます。
!type C:\\Users\\ユーザー名\\AppData\\Roaming\\jupyter\\nbextensions\\snippets\\snippets.json
{
"snippets" : [
{
"name" : "example",
"code" : [
"# This is an example snippet!",
"# To create your own, add a new snippet block to the",
"# snippets.json file in your jupyter nbextensions directory:",
"# /nbextensions/snippets/snippets.json",
"import this"
]
}
]
}
キー「"snippets"」と対応するバリューがリストになってます。
そのリストの中には{"name" : "example", "code" : #の並んだ文字列要素のリスト}
で辞書が入ってます。
example
がスニペット名で、code
がスニペットの内容のようです。
キー | バリュー | 注意 |
---|---|---|
snippets | 項目名? | 変更するとスニペットが読まれなくなる。snippetsのままで。 |
name | スニペット名 str型 | 適当に。 |
code | スニペット内容 list型 | 1行ずつダブルクオートで囲み、行をカンマ区切りでリスト化する。 |
従って自作スニペットを追加するには、"snippets"のvalueになっているリスト内にスニペットを定義した辞書をリスト要素として追加すれば良さそうです。
snippets.jsonデータの手動書き換え
元々のデータ↓
{ "snippets" : [ { "name" : "example", "code" : [ "# This is an example snippet!", "# To create your own, add a new snippet block to the", "# snippets.json file in your jupyter nbextensions directory:", "# /nbextensions/snippets/snippets.json", "import this" ] } ] }
新規データ↓
{ "name" : "contents", "code" : [ "<br><br>", "# 目次", "---", "[:contents]", "<br><br>", "# 実行環境", "---", "Windows10<br>", "Anaconda<br>", "JupyterNotebook<br>", "Python3.7" ] }
上の2つを手動のコピペで追加したのが ↓
{ "snippets" : [ { "name" : "example", "code" : [ "# This is an example snippet!", "# To create your own, add a new snippet block to the", "# snippets.json file in your jupyter nbextensions directory:", "# /nbextensions/snippets/snippets.json", "import this" ] }, { "name" : "contents", "code" : [ "<br><br>", "# 目次", "---", "[:contents]", "<br><br>", "# 実行環境", "---", "Windows10<br>", "Anaconda<br>", "JupyterNotebook<br>", "Python3.7" ] } ] }
ぶっちゃけ面倒くさい。
snippets.jsonをPythonで上書き
手動でコピペしたが書き換えは次のPythonコードで行った。
import json # snippets.jsonを手動のコピペで書き換えたデータ snippets=""" { "snippets" : [ { "name" : "example", "code" : [ "# This is an example snippet!", "# To create your own, add a new snippet block to the", "# snippets.json file in your jupyter nbextensions directory:", "# /nbextensions/snippets/snippets.json", "import this" ] }, { "name" : "contents", "code" : [ "<br><br>", "# 目次", "---", "[:contents]", "<br><br>", "# 実行環境", "---", "Windows10<br>", "Anaconda<br>", "JupyterNotebook<br>", "Python3.7" ] } ] } """ # snippets.jsonのパス file = "C:\\Users\\我がPCのユーザー名\\AppData\\Roaming\\jupyter\\nbextensions\\snippets\\snippets.json" # 上書き保存 with open(file, "w", encoding='utf8') as f: write = f.write(snippets)
スニペットを追加登録したら、タブを開き直すと書き換えが反映される。
作ったスニペットを貼り付けたのが↓
<br><br> # 目次 --- [:contents] <br><br> # 実行環境 --- Windows10<br> Anaconda<br> JupyterNotebook<br> Python3.7
ついでなのでsnippets.jsonをPythonで読み込んでみる
import json file = "C:\\Users\\我がPCのユーザー名\\AppData\\Roaming\\jupyter\\nbextensions\\snippets\\snippets.json" with open(file, "r", encoding='utf8') as f: read = f.read() sni = json.loads(read) #snippetsの中身 dict型 sni_value = sni["snippets"] #snippetsのvalue list型 print("【snippets.jsonの中身】\n\n", sni) print("\n\n") print("【snippets.jsonの中身】\n\n", sni_value)
【snippets.jsonの中身】
{'snippets': [{'name': 'example', 'code': ['# This is an example snippet!', '# To create your own, add a new snippet block to the', '# snippets.json file in your jupyter nbextensions directory:', '# /nbextensions/snippets/snippets.json', 'import this']}, {'name': 'contents', 'code': ['<br><br>', '# 目次', '---', '[:contents]', '<br><br>', '# 実行環境', '---', 'Windows10<br>', 'Anaconda<br>', 'JupyterNotebook<br>', 'Python3.7']}]}
【snippets.jsonの中身】
[{'name': 'example', 'code': ['# This is an example snippet!', '# To create your own, add a new snippet block to the', '# snippets.json file in your jupyter nbextensions directory:', '# /nbextensions/snippets/snippets.json', 'import this']}, {'name': 'contents', 'code': ['<br><br>', '# 目次', '---', '[:contents]', '<br><br>', '# 実行環境', '---', 'Windows10<br>', 'Anaconda<br>', 'JupyterNotebook<br>', 'Python3.7']}]
おわりに
いろいろやってたら長くなってしまった。
JSONファイルを手書きで書き直してスニペットを新規登録するのが面倒なのでどうにかしたい。
スニペット新規登録用スニペットを作って、セルに貼り付けて実行すればもう少し楽になるかな。
今回は以上です。