sachaos.md
----------

Go言語でTodoistのCLIクライアントを作ってみた

Todoist というWebアプリケーションのタスク管理ツールが大好きで一年くらい使っている。

以前はddksr/cliistを使用してCLIで操作できていたのだが、Todoist APIのバージョンアップに伴い、使用できなくなってしまった。

アップデートをするようなのだが、いつになるか待つのも面倒だし、Go言語触ってみたかったので練習がてら新しくTodoistのCLIクライアントを作ってみたので紹介。

作成メモみたいなのはまた今度ブログに書く。

## レポジトリ

sachaos/todoist: Todoist CLI Client. I ❤️ Todoist and CLI.

## 使い方

### タスク一覧

$ todoist l
64302291 p1 #Movie     A CLOCKWORK ORANGE
64302368 p1 #Movie     The Shining
64302395 p1 #Movie     Dr. Strangelove or: How I Learned to Stop Worrying and Love the Bomb
64302507 p1 #Movie     2001:A Space Odyssey
64302581 p1 #Inbox     Do something
64302602 p1 #Personal  Read a book
64303204 p1 #Movie     test movie
64303294 p1 #Personal  something do

### タスク作成

$ todoist add "3 idiots"

### タスク削除

$ todoist list
...
64308215 p1 #Inbox     3 idiots

$ todoist close 64308215

## デモ (with peco)

### タスクの追加

pecoでプロジェクトを選択する。

Add task

### タスクのクローズ

pecoでタスク一覧から選択してクローズする。

Close task

## pecoと組み合わせると便利

単純なサブコマンドを用意しているので、シェルスクリプトでよしなに組み合わせてくださいというスタンスです。peco使えば楽になり、生活が潤う。

<C-x> t p: プロジェクト選択
<C-x> t l: ラベル選択
<C-x> t c: タスクを選択してクローズ
# todoist find project
function peco-todoist-project () {
    local SELECTED_PROJECT="$(todoist projects | peco | head -n1 | cut -d ' ' -f 1)"
    if [ -n "$SELECTED_PROJECT" ]; then
        if [ -n "$LBUFFER" ]; then
            local new_left="${LBUFFER%\ } $SELECTED_PROJECT"
        else
            local new_left="$SELECTED_PROJECT"
        fi
        BUFFER=${new_left}${RBUFFER}
        CURSOR=${#new_left}
    fi
}
zle -N peco-todoist-project
bindkey "^xtp" peco-todoist-project

# todoist find labels
function peco-todoist-labels () {
    local SELECTED_LABELS="$(todoist labels | peco | cut -d ' ' -f 1 | tr '\n' ',' | sed -e 's/,$//')"
    if [ -n "$SELECTED_LABELS" ]; then
        if [ -n "$LBUFFER" ]; then
            local new_left="${LBUFFER%\ } $SELECTED_LABELS"
        else
            local new_left="$SELECTED_LABELS"
        fi
        BUFFER=${new_left}${RBUFFER}
        CURSOR=${#new_left}
    fi
}
zle -N peco-todoist-labels
bindkey "^xtl" peco-todoist-labels

# todoist close
function peco-todoist-close() {
    local SELECTED_ITEMS="$(todoist list | peco | cut -d ' ' -f 1 | tr '\n' ' ')"
    if [ -n "$SELECTED_ITEMS" ]; then
        BUFFER="todoist close $(echo "$SELECTED_ITEMS" | tr '\n' ' ')"
        CURSOR=$#BUFFER
    fi
    zle accept-line
}
zle -N peco-todoist-close
bindkey "^xtc" peco-todoist-close

## 小並感

いろいろ自分でゴリゴリ書かないといけない部分がありつつも、周辺ツールが非常に整っていて、開発しやすいなと思いました。