VimとGo言語でSlackすればみんなもっと輝ける

かどうかはわかりませんが、techrachoアドベントカレンダー23日目の記事です

Vimでファイルを編集するようにSlackに発言できたらいいな!
と思ったことはありませんか?

というわけで作ってみました
Slackをファイルのように開けます

https://github.com/yaasita/edit-slack.vim

demo

インストール

パッケージマネージャーでのインストール

適当なパッケージマネージャ等でインストールして下さい
以下一例です

vim-plugな人

Plug 'yaasita/edit-slack.vim'

NeoBundleな人

NeoBundle 'yaasita/edit-slack.vim'

Vundleな人

Plugin 'yaasita/edit-slack.vim'`

Vim packages vim標準のパッケージマネージャな人 (Vim 7.4.1528以降)

git clone https://github.com/yaasita/edit-slack.vim ~/.vim/pack/plugins/start/edit-slack.vim

実行バイナリの配置

その後、edit-slack.vim直下にedit-slackという実行バイナリを置いておきます(Slackとの通信に使います)
お使いの環境に合わせてダウンロードします

Linux

FreeBSD

Windows

macOS

実行権限の追加

実行権限も付与しておきます
※windowsユーザは edit-slack.exe という名前にしてください

cd /path/to/install/directory/edit-slack.vim
# download binary
mv linux-amd64-edit-slack edit-slack
chmod +x edit-slack

Slackトークンの取得

slackのAPIページ からトークンを取得します
.vimrcにトークンを追加します

let g:yaasita_slack_token = "xoxp-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxx"
" vimrcにトークン書くの嫌だという方は環境変数から取るとか工夫する感じで
" let g:yaasita_slack_token = $MY_SLACK_TOKEN

文字化けする場合は以下も追加ください

set fileencodings+=utf-8
set encoding=utf-8

Linux + vim-plugインストール例

asciicast

使い方

ファイル名は以下の規則になってます

usaga

チャンネル一覧を開くには以下の様にします

# 順にチャンネル、プライベートグループ、ダイレクトメッセージ
vim slack://ch
vim slack://pg
vim slack://dm

一覧でgfコマンドを使えばカーソル下のチャットを開くことができます

list

チャットを開く場合は以下のようにします

# general チャンネルを開く
vim slack://ch/general
# プライベートグループ secret を開く
vim slack://pg/secret
# yaasitaさんとのダイレクトメッセージを開く
vim slack://dm/yaasita

書き込む場合は === Message === 行の下になんか文字を入れて :w で保存してくれればOKです

write

vim内から:e, :tabe 等で開くことも可能です

ユーザーリスト、チャンネルリストをキャッシュしてるので2回目の方が早いですが、
ユーザの追加、チャンネルの追加があった場合はvimを再起動しないと反映しません

これで書き上げたソースコードの感動をすぐ届けられるようになります!
便利ですね(多分)

asciicast

仕組み

Go言語で書いたものがSlackとの間に入って、Vimにはファイルとして渡しています

golang
(c) gopher stickers

以下の様にautocmdを定義すると、ファイルを開くときの挙動を定義できます
これにより、 slack://で始まるファイル名で開いたとき、保存したときにGoのバイナリをキックするようにしてslackと通信しています

autocmd BufReadCmd slack://* call edit_slack#OpenCh(expand("<amatch>"))
autocmd BufWriteCmd slack://* call edit_slack#WriteCh(expand("<amatch>"))

簡単ですね

まとめ

というわけで、VimのBufReadCmd、BufWriteCmdを使った簡単なslackクライアントを作ってみました

Vim標準プラグインでも同じようなものがあって

  • vim scp://server_name//path/to/file でSCP越しに編集できたり
  • vim http://www.google.co.jp/ でHTMLソースを見たり
  • vim hoge.txt.gz で圧縮されたファイルを直接編集したり

できます

こんな感じで、テキストファイルではないものをテキストファイルの様にVimで編集できるようになります
使い方次第でとても便利になりますので是非活用してみたくださいー

おわり

関連記事

Ruby on RailsによるWEBシステム開発、Android/iPhoneアプリ開発、電子書籍配信のことならお任せください この記事を書いた人と働こう! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

yamasita

東京電機大学工学部→3年間某SIerにて銀行システムの開発→bpsに入社

yamasitaの書いた記事

インフラ
現場で使うansible

2014年12月25日

インフラ
検証環境の作り方

2014年08月14日

週刊Railsウォッチ

インフラ

Rubyスタイルガイドを読む

BigBinary記事より

ActiveSupport探訪シリーズ