[おすすめ]ターミナルでの作業効率が爆上げするTUIツール5選

こんにちわ、ゴリラです。

普段、筆者は主にターミナルで仕事をしています。そこで作業効率化のためいくつかTUIツールを使っています。
今日は、個人的におすすめのTUIツールを5つ紹介していきます。

これらを導入することで、ターミナルでの作業効率が上がると思いますので、ぜひ導入して試してみてください。
また、こんな便利なツールがあるよって方いましたら、ぜひコメントをくださいー

- 2019/11/28 追記
    - ffのブックマーク機能
- 2-19/11/29 追記
    - ffの入力補完を追記

# Git
[lazygit](https://github.com/jesseduffield/lazygit)というTUIツールを使っています。

<a href="https://github.com/jesseduffield/lazygit"><img src="https://github-link-card.s3.ap-northeast-1.amazonaws.com/jesseduffield/lazygit.png" width="460px"></a>

`lazygit`機能が豊富なので紹介しようとすると長くになってしまうため、筆者が普段使っていて便利だなと思う機能を紹介します。
詳しく知りたい方はREADMEもしくは作者本人によるおすすめの15機能をまとめた[動画](https://www.youtube.com/watch?v=CPLdltN7wgE&feature=youtu.be)を見てください。

## 未コミットファイルの差分
`lazygit`を起動すると`Files`に未コミットのファイルが表示されます。`Unstaged Changes`に選択したファイルの差分が表示されます。ファイルの選択は`j`と`k`もしくは`↓`と`↑`で、差分をスクロールする時は`CTRL-d`、`CTRL-u`を使用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66178/93a79f8c-e970-0714-dd6d-cf6e61689f48.png)

ちなみに、変更を取り消すときは`d`を使用します。未コミットなので消したら消えるのでご注意ください。

## コミットの差分
`Commit`でコミットを選択すると`Patch`にコミットの差分を確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66178/9b87f71c-ae1f-a394-09bb-943f50acd166.png)

## コミット済みファイルの差分
`Commit`でEnterを押下すると`Commit files`が表示されます。ファイルごとに差分を確認したい時に便利です。ちなみにこの機能は筆者が実装しました。便利だなと思いました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66178/5c2d824c-6281-371a-84e2-146572400f50.png)

## ステージング
`Files`で`Space`を押下すると選択したファイルをステージングできます。
`a`で全ファイルをステージングできます。ステージングしたら色が変わるのでわかりやすいですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66178/a8bfd656-3dac-9c1b-3cd3-fb31de8b1988.png)

## 行単位のステージング
`Files`で`Enter`を押下すると変更した行単位のステージングができます。選択した行で`Space`を押下すると`Staged Changes`に変更が追加されます。`Tab`を押下して`Staged Changes`に移動して`d`を押下するとステージングした変更を戻すことができます。とても便利です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66178/abcdaf74-5877-ad6f-16d5-5c3cd4a4ca58.png)

## コミット
`Files`で`c`を押下するとコミットメッセージを入力するパネルが表示されるのでそこでメッセージを入力した`Enter`を押下するとコミットできます。
より詳細なコミットメッセージを書きたいことが多いと思うので、`C`を押下すると`$EDITOR`に設定されているエディタを起動してコミットできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66178/b6a18172-78ad-313d-add8-f1a4e9b4abcb.png)

## コミット間の差分
`Commits`で`Space`を押下するとコミット差分モードに切り替わり、次に選択したコミットとの差分を確認することができます。ちなみにこれも筆者が実装しました。便利だなと思いました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66178/f1c45dc4-f637-c0b4-0b12-41f168af6828.png)

## コミットにステージングファイルを追加
`Files`で`A`を押下するとステージングしたファイルをコミットに追加することができます。
`Esc`もしくは`CTRL-[`で操作をキャンセルできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66178/23cda58d-6971-f66d-ab55-3e3bb69bcf5d.png)

## コミットメッセージの変更
`Commits`で`R`でエディタを使ってコミットのメッセージを変更できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66178/692d9753-70ae-75a3-801d-7f4fbd324a30.png)

## コミットの取り消し
`Commits`で`g`で選択したコミットまでリセットできます。soft、mixed、hardを選択できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66178/b8314643-d708-4472-739d-b7069a7e5721.png)

## ブランチ作成
`Branches`で`n`を押下すると新しいブランチを作成できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66178/96208c42-9391-5404-18de-8c5b27adcdfe.png)

## lazygitまとめ
ざっくりですが、いくつか機能を紹介しました。
他にもたくさんの機能がありますが、筆者もそこまで使いこなせているわけではないので、ぜひ読者自身で触ってみてください。

# Docker
最近開発ではdockerを使う方が多いのではないのでしょうか。筆者もその一人です。
dockerは基本コマンドで操作しますが、より簡単に操作できるTUIツール[docui](https://github.com/skanehira/docui)を以前作りました。より詳細な解説は[こちらの記事](https://qiita.com/gorilla0513/items/1211898cf3e09ba6f6f0)を参考していただくとして、ここでは軽く紹介します。

<a href="https://github.com/skanehira/docui"><img src="https://github-link-card.s3.ap-northeast-1.amazonaws.com/skanehira/docui.png" width="460px"></a>

## イメージ取得
`image list`で`p`でイメージをpullすることができます。これは`docker pull`と同様な動きになります。基本操作は非同期で動くので、pullしている間にコンテナを起動したりすることもできます。便利ですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66178/463f4403-e496-649c-0313-86c571bb78e0.png)

## イメージの検索
`image list`で`f`でイメージをDockerHubから検索できます。`search result`で`p`を押下すると選択したイメージをpullできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66178/6fec26b9-3e7c-0c98-be05-37a4a72b06f5.png)

## コンテナの作成
`image list`で`c`でイメージからコンテナを作成できます。`docker create`に相当します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66178/17cdcbdf-7b15-ae8e-f9fd-4ff43b5c41c9.png)

## コンテナの起動・停止
`container list`で`u`でコンテナを起動、`s`でコンテナを停止できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66178/94bb4487-fa37-d936-d99f-9968ed35d163.png)

## コンテナのアタッチ
`CTRL-e`でコンテナにアタッチすることができます。これは`docker exec`と同様な動きになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66178/5814ce6c-d7ca-1cd2-b88a-b1ffc28beb89.png)

## フィルターリング
全パネル`/`でフィルターリングできます。絞り込みしてコンテナ、イメージを操作するときに便利です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66178/4373c01e-ea1c-18ef-c8b6-9a59b7001aac.png)

## docuiのまとめ
docuiを使用するとイメージ、コンテナの操作が楽になります。ぜひ使ってみてください。
ちなみに、最近筆者は[docker.vim](https://github.com/skanehira/docker.vim)というVimのプラグインを作成してから、そちらを使うことが多くなりました。これはVim上でdocuiと同等なことができるプラグインです。Vimmerの方はぜひ試してみてください。

# JSON
JSONといえば、Web APIですね。システム間のデータ連携にJSONを使うことが一般的かと思います。そしてJSONといえば`jq`というコマンドも有名かと思います。
ただ、`jq`はインタラクティブにJSONを操作できないので、筆者は[tson](https://github.com/skanehira/tson)というTUIツールを作りました。

<a href="https://github.com/skanehira/tson"><img src="https://github-link-card.s3.ap-northeast-1.amazonaws.com/skanehira/tson.png" width="460px"></a>

`tson`はJSONをツリー状にしてノードを操作することができます。主機能を紹介していきます。

## 起動方法
3種類の起動方法があります。
1. `tson < test.json`でファイルから読み込む
2. `curl https://jsonplaceholder.typicode.com/todos/1 | tson`でパイプラインから読み込む
3. `tson -url https://jsonplaceholder.typicode.com/todos/1`でURLから読み込む

起動すると次の画面になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66178/b47104ef-1ee2-ff06-abb3-ac2a0155ac8a.png)

画像の場合のJSONは次になります。

```json
{
  "userId": 1,
  "id": 1,
  "title": "delectus aut autem",
  "completed": false
}
```

## 値を折りたたむ
`H`で値ノードを折りたたむことができます。どんなキーがあるのかぱっと確認する時に便利です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66178/74326776-1918-d5de-fbb5-7f95a55503a8.png)

## フィルターリング
`f`もしくは`/`でキーと値を絞り込むことができます。特定のキーの値を確認するときに便利です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66178/8dd8a7ae-6662-aef1-27cc-93838d2ca3b2.png)

## 編集
`Enter`でノードの値を編集できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66178/8766738b-a2c5-49c8-19fd-723b2b373f53.png)

簡易的な編集の場合は`Enter`で十分ですが、ガッツリ編集したいこともあると思うので、そういうときは`e`で`$EDITOR`に設定されているエディタを使って編集できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66178/a186c2b7-d9cb-3a5b-7194-ff1a13f01bad.png)

エディタ終了後、`tson`に戻りその結果が反映されます。

## 保存
現在のツリー状態をJSONファイルに出力できます。レスポンスの情報を保存するときに使えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66178/e697617a-28a0-6313-71ba-921456350212.png)

## 組み込み
`tson`を使用して、次のように既存アプリケーションに組み込むことができます。
ご自身のアプリケーションで`tson`のインターフェイスを使用して編集などを行うことができます。そして`tson`を終了すると、その時点のJSONをバイト列で受け取ることができます。

```go
package main

import (
	"fmt"

	tson "github.com/skanehira/tson/lib"
)

func main() {
	j := []byte(`{"name":"gorilla"}`)

	// tson.Edit([]byte) will return []byte, error
	res, err := tson.Edit(j)
	if err != nil {
		fmt.Println(err)
		return
	}

	fmt.Println(string(res))
}
```

自分のツールで`tson`のインターフェイスを使いたい方いましたら、ぜひ試してみてください。

## tsonまとめ
シンプルなツールですが、大きなJSONを操作するときに特に便利かと思います。ぜひ使ってみてください。

# ファイラー
筆者は普段`mkdir`や`cp`、`mv`といった操作を行うことが多いのですが、ファイルパス入力が意外とめんどくさいなと感じています。補完があるとはいえ、もっとインタラクティブに操作できたらいいなぁと思って[ff](https://github.com/skanehira/ff)というTUIツールを作りました。
あ、某ゲームではないです。

<a href="https://github.com/skanehira/ff"><img src="https://github-link-card.s3.ap-northeast-1.amazonaws.com/skanehira/ff.png" width="460px"></a>

## 入力補完
パスを入力する時に、自動でファイルパスを補完してくれます。便利ですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66178/ab3eb6b1-b74f-a000-23aa-8d5e022e544b.png)

## プレビュー
`-preview`オプションをつけるとプレビューパネルで、ファイルの中身、ディレクトリの中身を見れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66178/e5e5c8f0-c416-c3cf-986f-312283e1af6a.png)

`CTRL-j`/`CTRL-k`でプレビューをスクロールできます。

## 新規作成
`n`でファイル、`m`でディレクトリを新規作成できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66178/0a1f62ca-59c7-7071-b2e3-3808958658d8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66178/55e87f22-96a2-ebbd-c3ad-99a41c949aee.png)

## コピー
`y`でファイル、ディレクトリをマーク(色が変わります)して、`p`でマークした対象をカレントディレクトリにコピーできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66178/acae865a-9a73-1c6f-03bd-a90b4d530beb.png)

## 名前変更
`r`でファイル、ディレクトリの名前を変更できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66178/cb480d39-d29d-31fc-4a25-ab00ea913c35.png)

## 編集
`e`で`$EDITOR`に設定されているエディタを使ってファイルを編集できます。

## ブックマーク
`b`で選択したディレクトリをブックマークする事ができます。
`B`でブックマーク一覧を表示して、`Ctrl-g`でブックマークしたディレクトリに移動できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66178/b27829c8-ba6f-77f1-c356-29a2adafe8df.png)

## Vimで使う
Vimにはターミナル機能があるので、それを使用して`ff`を動かすことができます。
Vimで`:vert term ++close ff`で次の画像のように使用することができます。プラグインを導入しなくてもVimを終了することなくファイル、ディレクトリの操作を行うこともできます。便利ですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66178/29e60728-1d81-3bd4-2bcc-226a63292545.png)

## ffのまとめ
まだ作ったばかりのツールなので、これからもう少し機能を追加していきます。
例えば、複数の対象をマークする機能、シェルコマンドを実行する機能を実装する予定です。

# プロセスビュアー
普段ツールを作ってると、バグって固まってしまうことがあり、プロセスを手軽にkillするツールほしいなと思って[pst](https://github.com/skanehira/pst)というTUIツールを作りました。

<a href="https://github.com/skanehira/pst"><img src="https://github-link-card.s3.ap-northeast-1.amazonaws.com/skanehira/pst.png" width="460px"></a>

どうせならプロセスの情報を色々見れたらいいなと思い、プロセス環境変数といった情報を表示できるようにしました。
プロセスの情報を取得するのに`ps`と`lsof`の外部コマンドを使用しています。

## フィルターリング
プロセス名をフィルターリングできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66178/3733bb0d-1f4f-33a1-30c4-656e732ed54b.png)

## プロセスツリー
`processes`で選択したプロセスにぶら下がっている子プロセスを`process tree`で確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66178/719d283f-5b91-bd1e-4607-092440f22485.png)

## プロセスkill
`processes`もしくは`process tree`で`K`で選択したプロセスをkillできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66178/e1069afc-2cb3-c225-25d6-84d21d6b3f12.png)

## pstまとめ
`pst`はプロセスモニターというより、プロセスビューアに近いです。なぜならプロセス情報を非同期で更新していないからです。理由はツール自体を重くしたくないし、killする対象を都度検索すればいいと考えているからです。
不便だと思ったら改善するかもしれません。

# まとめ
一通り、筆者が普段使っているTUIツールを紹介しました。いかがだったでしょうか。
少しでもみなさんの作業効率があがると嬉しいです。

また、気が向いたらこうったTUIツールの記事を書こうと思います。
ではではー