go-prompt v0.2.0の新機能紹介

私生活が忙しくあまり go-prompt のメンテナンスの時間がとれていませんでしたが、contributeしようとしてくれている知り合いが居たので、[少人数で開発スプリントを実施](https://connpass.com/event/78519/)しました。結果的にはかなりうまくいって、参加者3名全員がPRを送ってマージ、issueは8個減りました。

基本的な使い方は [go-promptを使ったリッチなコマンドラインツールの作り方](https://qiita.com/c-bata/items/8c40e7030f9e2d9f5da4) で紹介したので、今回は昨晩 v0.2.0 としてリリースした修正点を紹介します (CHANGELOGは[こちら](https://github.com/c-bata/go-prompt/blob/master/CHANGELOG.md#v020-20180213))。

## 追加した機能

### ページネーション

![pagination.gif](https://qiita-image-store.s3.amazonaws.com/0/29989/403a71bd-183a-40c1-28ae-92bed0881081.gif)

補完の候補が非常に多い場合でも、go-promptはこれまで画面に一度に表示可能な数しか選べませんでした。
今回のページネーションの実装により、狭い画面の中でも沢山の候補を選択可能になります。


### Windowsサポート

![windows-prompt.gif](https://qiita-image-store.s3.amazonaws.com/0/29989/1d7a2cfc-ce87-07ad-a36d-d74b41b818a7.gif)

go-prompt を公開してすぐ、mattnさんがPRをくれていたのですが、いくつかのバグ修正とリファクタリングをいれてマージしました。
~~ただいくつかうまくいかない挙動も残っているので、こちらを利用する際は注意してください。確認している範囲だと~~

* ~~Shift+Tab が効かない~~
    * ~~詳しい原因がわかってないですが、Windowsでも shift+tab押された時に VK_OEM_BACKTAB が発火するなら go-ttyはそれをハンドリングするコードが入ってないから処理できなさそう (by orisano)~~
* ~~矢印キーが効かない~~
    * ~~Windowsで渡ってくる矢印キーのバイト列が違うのかハンドリングに失敗しています。こちらは実際に送られてくるバイト列を調べれば修正できそう~~


**追記**
mattnさんからのPRで修正されました。現状だとちらつきが多いとか細かい課題は残ってますが、一通り動作するようになったかと思います。v0.2.1としてtagを切ってリリースしました。

https://github.com/c-bata/go-prompt/blob/master/CHANGELOG.md#v021-20180214

### 動的プレフィックス

![live-prefix.gif](https://qiita-image-store.s3.amazonaws.com/0/29989/1773368a-035d-8e97-eb46-7c328e911e20.gif)
[go-prompt/_example/live-prefix/main.go](https://github.com/c-bata/go-prompt/blob/master/_example/live-prefix/main.go)


過去に一度PRをもらっていたのですがあまり分かりやすいインターフェイスではなかったので、マージせずにクローズしていました。
ただ issue を見ているとかなり要望が多く、 [ktr0731/evans](https://github.com/ktr0731/evans) などは少し凝った実装が必要になっていたので正式にサポートしました。


## 開発スプリント以降の修正

### Dockerコンテナ内でpanicするバグ

pseudo ttyがallocateされるまで、ioctlシステムコールで画面幅を取得するために TIOCGWINSZ を渡すと (0, 0) が帰ってくるらしく、特定の計算部分で 0除算が起きてpanicしていました。ctopの開発者がPRをくれて修正されています。

https://github.com/c-bata/go-prompt/pull/32


### 2行以上入力した後に端末ウィンドウをめっちゃ小さくするとpanicする現象

![panic-when-window-is-too-small.gif](https://qiita-image-store.s3.amazonaws.com/0/29989/68bee5db-38d0-6a6f-4d9d-6320ae7c586b.gif)

### 色んな端末での表示崩れ

Terminal UIの一番むずかしい部分なのですが、特定の端末エミュレーターでしか起きない表示崩れが結構あります。

| 端末エミュレーター | 様子 | 現象 |
|----------------|-----|-----|
| iTerm2 | <img width="767" alt="スクリーンショット 2018-02-13 22.54.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/29989/6a372740-9a50-a68d-38cd-169eca9ed97c.png"> | 画面の右端で補完をしようすると、ドロップダウンが次の行で表示される |
| Terminal.app | <img width="571" alt="スクリーンショット 2018-02-13 22.49.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/29989/0f3ad6c3-3fed-79a4-dacf-67387d08da21.png"> | 2行目以降でバックスペースを打つと、1文字ずつずれていく |
| Goland | <img width="657" alt="スクリーンショット 2018-02-13 22.47.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/29989/73c3d284-2d5d-31e8-a463-d607f342fc27.png"> | 行をまたぐぐらい長い入力をするとGolandのterminalのみ壊れる |
| GNU Terminal | ![Screenshot from 2018-02-13 12-15-00.png](https://qiita-image-store.s3.amazonaws.com/0/29989/8e15b090-9e9b-448b-3f58-c23c948145ce.png) | iTerm2 の現象と一緒 |

これらは一通り修正されました。

## おわりに

今回スプリントに参加してくれたメンバーはコア開発者として、collaboratorに追加しました。
ここ2日の変更でかなりよくなったので、引き続き改善していきたい。