Atom package自作③-② -ファイル構成-keymaps- -menu-

# 概要
前回は、皆のリーダ　package.jsonの説明をしました。
今回は、実行する際のトリガーの定義である**keymaps**と**menu**を説明したいと思います。


|| ファイル名 | 概要 |
|:-:|:-:|:-:|
|★| keymaps  |  アクションに対するショートカットキーを設定するファイルを格納|
|| lib  | メインスクリプトとかビューファイルとかが格納される  |
|★| menus  | ヘッダーに表示されるメニュー等を作成するファイルを格納  |
|| spec  |  コードの検証用ツールが格納されている |
|| styles| GUIを設定するlessファイルを格納  |
|済| [package.json](https://qiita.com/kanemall666/items/1811921f9750fd0c2f71)| パッケージの設定ファイル  |
|| .gitignore| git上で管理する為の設定ファイル  |


# keymaps
この処理をショートカットで呼び出したい！
このパッケージをショートカットで自由にしたい。
そんな思いを適える**keymaps**
様は任意のショートカットキーとコマンドを紐付ける設定を記述するファイルです。

## 階層
[package]
　 Ｌ**[keymaps]**
　　　Ｌ**areans.json**

## デフォルト　コード
`
{
  "atom-workspace": {
    "ctrl-alt-o": "areans:toggle"
  }
}
`
## 書式
`
{
　　"実行する際にアクティブとなっているクラス":{
　　　　"ショートカットキー":"実行コマンド"　　　　
　}
}
`
## 解析

### **実行する際にアクティブとなっているクラス**
デフォルトだと**"atom-workspace"**となっている。
どの層がアクティブになっている時に受け付けますかっていうのを指定する。
これが無いと例えばブラウザ？開いている時にショートカットの競合が発生するかも...
(やった事がないからわかんないけど。。。)

#### **ショートカットキー**
実際に使用したいショートカットキーをここで指定しちゃいます！
デフォルトだと**"Ctrl-alt-o"**なんやけど、これって毎回同じのが指定されちゃうから
複数パッケージを作成する際は重複しない様注意しないといけない、、、(自動で割り当ててくれてもいいのに。。。)
重複した時ってどうなっちゃうんだろう、、、気になります！

#### **実行コマンド**
ここでショートカットキーに割り当てるコマンドを指定します。
指定する際は、前回説明した**package.json**に指定したコマンド名を使用します。
ここにその儘指定したらどうなるのだろう。。。まぁjsonだから出来ないだろう。。。

##　まとめ
**keymaps**は単純なjsonファイルだからそんなに難しい感じではない。断じてない
まぁ、纏めていく内に下記の事について気にはなったが追々調査・検証していくつもりです。。。
### - 気になった事
 - keymapsは複数ファイルを実装できる様になっているが、実装した際に優先順位等が発生するか？
 　もしくは、設定等によって呼び出すファイルを変更する為なのか？
 - アクティブになっているクラスを指定する事が可能であるが、どのクラスを指定する事が出来るのか？
 - ショートカットキーにて重複して指定した際の挙動
 - jsonに直接ワンライナー的な感じでコマンドを指定する事は可能であるか？

---

じゃあ次は**menu**について説明していきます
---

# menu

## 階層
[package]
　 Ｌ**[menus]**
　　　Ｌ**areans.json**

## デフォルト　コード
`
{
　"context-menu": {
　　"atom-text-editor": [
　　　{
　　　　"label": "Toggle areans",
　　　　"command": "areans:toggle"
　　　}
　　]
　},
　"menu": [
　　　{
　　　　"label": "Packages",
　　　　"submenu": [
　　　　{
　　　　　"label": "areans",
　　　　　"submenu": [
　　　　　　　{
　　　　　　　　"label": "Toggle",
　　　　　　　　"command": "areans:toggle"
　　　　　　　}
　　　　　　]
　　　　　}
　　　]
　　}
　]
}
`
## 書式
### 基本
**【メニュー定義クラス】:{**
　　　　**"label":【ラベル名】**
　　　　**"command":【実行コマンド】**
**}**

### 入れ子
**【メニュー定義クラス】:{**
　**"label":【ラベル名】** 
　**"submenu":{**
　　　　**"label":【ラベル名】**
　　　　**"command":【実行コマンド】**
　　**}**
**}**

## 解析
デフォルトを見ると階層がかなり深くてわかりづらいですが、
基本的な型は[書式]-[基本]みたいな感じです。簡単だよねー
要は、【メニュー定義クラス】でどこに入れるかを指定、【ラベル名】でメニューのタイトルを指定【実行コマンド】で処理するコマンドを指定するという形となってます。
詳細は下記となります。

### **メニュー定義クラス**
どこにそのメニューを定義したいかを指定します。
デフォルトだと３つ定義されています。[context-menu]・[atom-text-editor]・[menu]
[context-menu]・[atom-text-editor]は入れ子になっています。
[context-menu]の中にある[atom-text-editor]エリアにメニューを追加したいという感じです。
因ってデフォルトにて定義している箇所は２つ[context-menu]・[menu]となります。
階層的には
**[context-menu]**
　 Ｌ**[atom-text-editor]**
**[menu]**

みたいな感じです。

#### **context-menu**
右クリックで出てくるメニューです。
テキスト等を修正とかする際にポインタを上迄持っていくのが面倒な時とかに使えます。
**context-menu**は複数のクラスがあるので入れ子で指定してあげます。デフォルトだと後述する**[atom-text-editor]**が指定されています。

#### **atom-text-editor**
コマンドが挿入されるデフォルトの領域になります。基本的にコマンド類はこのクラスに定義すれば良いかなと思ぅよ
その他のクラスについては追々書いていけたらなと思います。

#### **menu**
上部にあるメニューバーの事です。
**menu**には[file]・[Edit]・[Selection]・[Find]・[Packages]・[Help]等が並んでるかなと思いますが、
同じ様に自分で定義した名称にてメニューを追加する事は可能です。
既存のメニューに入れ子でメニューを追加する事は可能です。
デフォルトだと、**[Packages]**の中に作成する様になっています。

### **label**
ここにメニューに表示させたいタイトルを記述します。
jsonなので、**"label":【タイトル】**ていう感じで指定しちゃいます。

### **command**
カッコ内に指定した**label**を選択した際に実行したコマンドを指定します。
指定方法はこいつも前回説明した**package.json**で定義されているコマンドを指定します。

### **submenu**
カッコ内に指定した**label**をタイトルとしてサブメニューを作成します。
サブメニュー内での指定方法は基本書式と同一です。
なので、サブメニューの中にサブメニューとか細かく神経質に分けたい人はどんどん分ける事が可能となっています！
で、**label**タイトルとして使用するので、同階層に**command**を定義する事は出来ない事に注意が必要です。


## - まとめ
- デフォルトだと、右クリック時に展開される[context-menu]・上部にある[menu]が定義されている。
- 基本的にメニューに表示させる**label**、実際に実行する**command**が対となる
- 入れ子にする際は、**command**の代わりに**submenu**を定義する。

# まとめ
今回 **keymaps**と**menus**を説明したが、前回説明した**package.json**に定義した内容が重要となっている。
また、jsonファイルにて定義している為、目視上結構解り易くなっているかな、
基本的に最初は、基本の方を弄らず弄ばずむしろ修正しなくても何とかなるし、触れない様にしても良いかも。。。。
私的には結構変えちゃいたいと思っているので、弄り倒しちゃいますが、、、

まぁ今回はこんな感じ、次回は、いよいよ本題の**lib**を纏めて行きたいと思っています。