【Slack】Command + Enter で送信できるようにするための設定(Mac)

<strong> 現在のクライアントでは設定から変更可能になりました。</strong>

---

注：この記事は<strong> Mac の Slack App 向け限定 </strong>で書いております。

# Slackで Command + Enter => 送信に

チーム開発等でのコミュニケーションツールとして`Slack`を使ってる人は少なくないと思うのですが、他の`Messenger`,`Twitter`,`LINE`等のメッセージングアプリで

`Commnad(⌘) + Return`  =>  <strong>送信</strong>　　

と設定しているため、Slackで改行ようとしてそのまま送信され意味不明な文章を送りつけたり、送信しようと`Commnad(⌘) + Return`を押して`Snippet Window`が出現してしまうことが多発していたため個人的にかなりストレスフルでした。

さらに、`Slack`の設定項目にこのようなキーの設定がなく腹が立ってしようがないので、`Karabinar`を使って設定してみました。

<strong>[---まとまったコードはここにあります---](#完成)</strong>
# Karabinarとは

Macのいわゆるキーリマッピングツールです。かなり条件を細かくカスタマイズできるので私は普段から重宝してます。

![karabiner-icon@2x.png](https://qiita-image-store.s3.amazonaws.com/0/69173/e838c8d1-6aff-3c50-3de8-bc1511306ed2.png)

[ダウンロード - Karabinar](https://pqrs.org/osx/karabiner/index.html.ja)

今回の使い方の他にも、予めプリセットが大量に用意されています。
[ここに公式ドキュメントとしてまとまっています](https://pqrs.org/osx/karabiner/gallery.html.ja) 例えばDvorakにしたかったりとかも一発でできたりします

private.xmlにお好みの設定を書き込めるので、今回はこれにいろいろ追加していきます。

# private.xmlの設定

リファレンスはこちらになりますが、書いてないことも多いです
[private.xml Reference Manual - pqrs.org
](https://pqrs.org/osx/karabiner/xml.html.ja)


まず`Karabinar` を起動し、 `Misc & Uninstall`というタブに
`Open private.xml`という項目があるので開きます

<img width="800" alt="karabinar.png" src="https://qiita-image-store.s3.amazonaws.com/0/69173/96e0c9d7-1de6-0dd0-8a79-9823a7305cdb.png">

中を覗くとこんな感じになってると思います

```xml:private.xml
<?xml version="1.0"?>
<root>

</root>
```

ここの`<root>`タグ内に設定を追加していきます
(ちなみに`<include path="./hogehoge.xml" />`とかすると、外部から読み込むことができるので、そちらに書くこともできます)


### Bundle Identifier のエイリアスの登録
あとあとのために、Slack Appの`Bundle Identifier`を適当な名前にエイリアスを設定しておきます。

```xml:private.xml

	.......
	<appdef>
		<appname>SLACK</appname>
		<equal>com.tinyspeck.slackmacgap</equal>
	</appdef>
	.......
```
SlackのBundle Identifierは`com.tinyspeck.slackmacgap`で、これを`SLACK`と登録しました。

###キーのマッピングの設定
マッピングの設定は全て`<item>`内に書くことになっています。

```xml:private.xml
<?xml version="1.0"?>
<root>
	.......
	<item>

		<!-- ここに設定を追加 -->

	</item>
</root>
```

まず、`<name>`に表示する説明、`<identifier>`にKarabinar内部で使用される識別子を適当に書いてあげます

```xml:private.xml
	<name>Command+Enter to send message in slack app</name>
	<identifier>private.app.slack.Commnad_Enter_to_send</identifier>
```

次に、Slack Appで「メッセージを入力するTextBox」以外をフォーカスしている時に、この設定を発動されても困るので、念のため`<uielementrole_only>`を設定しておきます。
Karabinarに内蔵されている`Event Viewer`で、UI Elementは`AXTextArea`であることがわかります。

また、Slack以外のアプリでこの設定が発動されてももちろん困るので、`<only>`で先ほど登録したエイリアスの`SLACK`を設定します。

```xml:private.xml
	<uielementrole_only>AXTextArea</uielementrole_only>
	<only>SLACK</only>
```

そして、お待ちかねのキーリマップの設定です。
`<autogen>`内に書いていくのですが、書式として

```xml
	<autogen>
		{リマップの種類}
		{元のキー},{修飾子キー},
		{設定したいキー},{修飾子キー}
		....
	</autogen>
```
のような感じになります。

今回は、リマップの種類はあるキーをあるキーに対応させるだけの `__KeyToKey__` を用いればよく、あとはひたすらそのキーを書くだけです。

`Command + Return` => `Retrun`　: <strong>送信</strong>
`Return`=> `Shift + Return`　: <strong>改行</strong>
に設定しました。

また、もともと`Shift + Return`であった、`Snippet Window`の設定も変えておく必要があるため

`Shift + Return`　=> `Command + Return` : <strong>Snippet Window</strong>

としました。

```xml:private.xml
	<autogen>
		__KeyToKey__
		KeyCode::RETURN,MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_COMMAND | ModifierFlag::NONE,
		KeyCode::RETURN
	</autogen>
	<autogen>
		__KeyToKey__
		KeyCode::RETURN,MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_SHIFT | ModifierFlag::NONE,
		KeyCode::RETURN,ModifierFlag::COMMAND_R	
	</autogen>
	<autogen>
		__KeyToKey__
		KeyCode::RETURN,
		KeyCode::RETURN,ModifierFlag::SHIFT_L
	</autogen>
```

これで、念願のCommand + Enter送信が実現しました。

# 完成
まとまったコードはこちらに上げておきました。
[taiyoslime/dotfiles/karabiner/app/slack.xml - GitHub](https://github.com/taiyoslime/dotfiles/blob/master/karabiner/app/slack.xml)

# 弊害とか

日本語変換中も`Return` => `Command + Return`が適用されるため、公式のIMEは全く問題ないのですが、Google IMEで変換が`Return`で選択できなくなるようです。（そもそも変換で`Retrun`なんて使う必要ないですが...）

その他は現状全く問題なく使えています。

#その他
ブラウザ版のSlackで同じことをしたい場合は、ブラウザのアプリを指定し、ウィンドウの名前を取得する`<windowname_only>`の中で、正規表現`<regex>`を使い、`slack`が含まれるもの
などと指定してあげれば行けるとは思いますが未検証です。