私のCLI仕事術

# はじめに

CLIは最高です。
GUIよりも圧倒的に早く操作できますし、キーボードを叩けばいいだけなので慣れれば時々目を瞑りながらでも作業できるので目が疲れません。
たとえコマンドを覚えていなくても、一度叩いたコマンドなら履歴をたどればなんとかなりますし、 `man` コマンド叩けば雰囲気わかる事も多いです。

話は変わりますが、エンジニアでも例外なく、仕事をする上で下記のようなことをするかと思います。

* メモ管理
* タスク管理
* 時間管理

上記のような作業をCLIでするために僕が実践している事を紹介します。

# メモ管理

Markdownで書き、ファイルをGitHubのプライベートレポジトリで管理しています。
一日毎にファイルを分けて格納しています。

以下のコマンドを叩けば今日分のメモが開くので、これを叩けばとりあえずメモが取れる状態になります。

```sh
$ emacs ~/diary/$(date "+%Y/%m/%d.md")
```

いつでも同じコマンドなのでコマンド履歴を使えば一瞬で叩けます。
履歴辿るのも怠ければaliasを使ってもいいですね。

```sh
alias dia='emacs ~/diary/$(date "+%Y/%m/%d.md")'
```

## ディレクトリ構造

上のコマンドを叩くと、 `年/月/日.md` のようにディレクトリが切られてファイルが作成され、以下のようなディレクトリ構造になります。

```
/home/sachaos/diary
├── 2016
│   ├── 06
│   ├── 07
│   ├── 08
│   ├── 09
│   ├── 10
│   ├── 11
│   └── 12
│       ├── ...
│       ├── 20.md
│       ├── 21.md
│       ├── 22.md
│       ├── 24.md
│       ├── 25.md
│       └── 27.md
├── 2017
│   └── 01
...
```

## GitHubのプライベートレポジトリで管理する

GitHubのレポジトリで管理していますので、簡単に家の端末と会社の端末で情報を共有することができますし、ちょっと携帯端末で見返したいときもGitHubにアクセスすればMarkdownで書かれているので、見やすく表示されます。

## メモの検索

gitで管理されているので `git grep` とか叩いて検索することができます。非常に楽ですね。

# タスク管理

個人のタスク管理は [Todoist](https://todoist.com/) というWebアプリケーションを使っています。

非常に楽しいアプリケーションなのですが、CLIで使用したいため、手前味噌ですが、GolangでCLIクライアントを作成してそれを使用しています。

* [sachaos/todoist: Todoist CLI Client. I ❤️ Todoist and CLI.](https://github.com/sachaos/todoist)
* [Go言語でTodoistのCLIクライアントを作ってみた - Qiita](http://qiita.com/sachaos/items/1679d736e9802cb5e6cd)

## demo

![todoist demo](https://cloud.githubusercontent.com/assets/6121271/21590209/152642a4-d13d-11e6-96d0-3a36336f0775.gif)

# 時間管理

各々のタスクにかかった時間というものを測るために [toggl](https://toggl.com/) というWebアプリケーションを使っています。
時間を計測していると見積もり精度が向上しますし、何に時間を奪われているのか、など可視化されるので時間に対する意識を持つことができる気がします。

こちらも手前味噌ですが、CLIで使用したいためクライアントを作りました。

* [sachaos/toggl: Toggl CLI Client](https://github.com/sachaos/toggl)

## demo

![toggl demo](https://cloud.githubusercontent.com/assets/6121271/21588531/0108bd18-d12b-11e6-9fdc-e65aa1f15768.gif)

# 組み合わせる

## TodoistとToggl連携

Todoistとtogglを連携して、todoist のタスクの中からタスクを選んでtoggl startを実行するシェルスクリプトを書きました。

```sh
function toggl-start-todoist () {
    local selected_item_id=`todoist --project-namespace --namespace list | peco | cut -d ' ' -f 1`
    if [ ! -n "$selected_item_id" ]; then
        return 0
    fi
    local selected_item_content=`todoist --csv show ${selected_item_id} | grep Content | cut -d',' -f2- | sed s/\"//g`
    if [ -n "$selected_item_content" ]; then
        BUFFER="toggl start \"${selected_item_content}\""
        CURSOR=$#BUFFER
        zle accept-line
    fi
}
zle -N toggl-start-todoist
bindkey '^xts' toggl-start-todoist
```

## プロンプトに常に表示させておく

結構togglするのを忘れてしまうので、プロンプトに常に現在トラッキングしているタスクを表示させておくようにしました。
これで開始忘れ、終了忘れを防ぐことができています。
こういうこともCLIツールならではの嬉しさですね。

```sh
toggl_current() {
  local tgc=$(toggl --cache --csv current)
  local tgc_time=$(echo $tgc | grep Duration | cut -d ',' -f 2)
  local tgc_dsc=$(echo $tgc | grep Description | cut -d ',' -f 2 | cut -c 1-20)
  local short_tgc_dsc=$(if [ $(echo $tgc_dsc | wc -m) -lt 20 ]; then echo $tgc_dsc; else echo "${tgc_dsc}.."; fi)
  if [ ! -n "$tgc_time" ]; then
      echo "NoTimeEntry"
  else
      echo "[$tgc_time $short_tgc_dsc]"
  fi
}
```

## demo

`<C-x t s>` でtodoistからタスクを選択して、toggl start に流し込んでいます。
プロンプトの右上に常に現在のトラッキング中のタスクが表示されているのがわかるかと思います。

![toggl.mp4.gif](https://qiita-image-store.s3.amazonaws.com/0/40562/8bf0ae2d-af2f-fa2f-63c8-71b45cfa0008.gif)

ちなみにaliasとして以下のように設定しています。

```sh
alias tl='todoist --project-namespace --namespace --color list'
alias tge='toggl stop'
```

# まとめ

CLIでメモ・タスク・時間の管理をするために、実践している方法・ツールを紹介しました。
こういう小さい事を継続して癖付けることによって生産性が上がるのではないでしょうか？

仕事を早く終わらせて早く帰りましょう！