たいちょーの雑記

ぼくが3日に一度くらい雑記をかくところ

Goが面白いのでまたcdx作った

cdx

github.com

cdx は僕が一人でメンテしてる cd コマンドのラッパーです。この手のツールでよく使われているのは、enhancdzなどがあります。

github.com

github.com

とくにenhancdは非常に強力なツールで、利用している方も多いと思います。

cdxではCustomSourceという設定項目を用意しました。これを利用することでenhancdの持つような機能はユーザー側が設定として与えることが出来ます。そのかわりcdxは僕が素の状態である程度使えるような機能だけを実装したものになります。

要求環境

  • Go lang (v1.10.2 以上)
    • 実装にはGoを使いました。最近はじめて面白いなと思いました。CLIツールを作るならGoはいい感じですね
  • bash or zsh
    • fishは対応していません
  • fzfやpecoみたいなFuzzy-Finder

インストール

  1. go get するか、GitHubのReleaseページからバイナリをダウンロードしてパスの通ったところに置いてください
$ go get github.com/xztaityozx/go-cdx
  1. お好みのFuzzy-Finderを用意します。個人的には fzfがすきです。 fzy と言うやつもいいらしいですね

github.com

github.com

  1. コンフィグを書いて置きます
$ mkdir -p ~/.config/go-cdx
$ cat << EOF > ~/.config/go-cdx/.go-cdx.json
{
  "HistoryFile": "~/.config/go-cdx/history.json",
  "BookMarkFile":"~/.config/go-cdx/bookmark.json",
  "Command":"pushd",
  "NoOutput":true,
  "Make":false,
  "CustomSource":[],
  "FuzzyFinder":{
    "CommandPath":"選んだFuzzy-Finder",
    "Options":[]
  },
  "BinaryPath":"go-cdxへの絶対パス。go getした場合は消してOK"
}
EOF
$ vim ~/.config/go-cdx/.go-cdx.json # 好きなように設定してください

設定値はGitHubのREADMEに書いてあるのでそちらを見てください

  1. cdx をロードします。
# cdxをロード
$ eval "$(go-cdx --init)"
# シェル起動時に自動でロードするならrcに記述すればOK
$ echo 'eval "$(go-cdx --init)"' >> ~/.zshrc # or ~/.bashrc

使い方

cdx [-A,--action [act]|
     --add|
     -b,--bookmark|
     --config [configFile]|
     --cs-list|
     -c,--custom [name]|
     --help|
     -h,--history|
     --init|
     --make|
     --no-output|
     -p,--popd|
     -v,--version] [PATH]

基本はcdコマンドと同じように使います

$ cdx ~/      # change to home
$ cdx ~/Utils # change to ~/Utils

-A,--action [act]

このオプションでは移動した後にそのディレクトリで実行するコマンドを指定できます

$ cdx ~/Utils --action "ls"
go-cdx
go-cdx.v1.0.13
go-cdx.v1.0.13.tar.gz
...
$ pwd
/home/xztaityozx/Utils

コマンドはbash -cに渡されて実行されることに注意してください

--add

ブックマークにカレントディレクトリを追加します。重複のチェックをしないので注意してください

-b,--bookmark

bookmarkからFuzzy-Finderを使って1つ選択し、cdします。

$ cdx -b
>
  3/3
> [   3] /path/to/hoge
  [   2] /path/to/fuga
  [   1] /path/to/foo

--config [configFile]

デフォルトのコンフィグの代わりになるコンフィグファイルを指定できます。デフォルトは~/.config/go-cdx/.go-cdx.jsonです

--cs-list

後に説明するCustomSourceからのcdの一覧を表示して終了します

-c,--custom [name]

Goでcdxを書き直すにあたって、追加した目玉機能です

cdxは複雑な機能を単体で持ちませんが、代わりにユーザーが機能を自由に追加することが出来ます。これをCustomSourceとよんでいます

CustomSource は、その 名前Fuzzy-Finderに与える入力 のペアで構成されます。

{
    "CustomSource":[
        {
            "Name":"g",
            "Command":"ghq list | xargs -n1 -I@ echo 'echo -e \"$(basename @) $(ghq root)/@\"'|bash|column -t"
        },
    ]
}

この例では、 ghq listで表示されるリポジトリ一覧から1つ選んでcdするgという名前の機能を追加しています

# Fuzzy-Finderに与える入力
$ ghq list | xargs -n1 -I@ echo 'echo -e \"$(basename @) $(ghq root)/@\"'|bash|column -t
"Contest                        /home/xztaityozx/.ghq/github.com/xztaityozx/Contest"
"cdx                            /home/xztaityozx/.ghq/github.com/xztaityozx/cdx"
"dotfiles                       /home/xztaityozx/.ghq/github.com/xztaityozx/dotfiles"
"nandokuka                      /home/xztaityozx/.ghq/github.com/xztaityozx/nandokuka"
"yov                            /home/xztaityozx/.ghq/github.com/xztaityozx/yov"
# cdx のCustomSource gを使ってみる
$ cdx -c g
>
  19/19
> Contest                        /home/xztaityozx/.ghq/github.com/xztaityozx/Contest
  cdx                            /home/xztaityozx/.ghq/github.com/xztaityozx/cdx
  dotfiles                       /home/xztaityozx/.ghq/github.com/xztaityozx/dotfiles
  nandokuka                      /home/xztaityozx/.ghq/github.com/xztaityozx/nandokuka
  yov                            /home/xztaityozx/.ghq/github.com/xztaityozx/yov

この機能を使って、Fuzzy-Finderで選択された行のいちばん後ろのカラムが、移動先のパスとして選択されることに注意してください

CustomSourceでオレオレcdxを作ることが出来ます

--help

ヘルプを出力して終了します

-h,--history

履歴をFuzzy-Finderで選択してcdします。ログアウトしても履歴はリセットされません

--init

cdxをロードするときにのみ使います

--make

移動しようとする先が存在しないディレクトリだった場合、作成するか訪ねます。yesと答えた場合のみ、ディレクトリを作成しcdします

--no-output

cdxからの出力を無効化します。Fuzzy-Finderや--action出力は表示されます。

-p,--popd

popdを実行して終了します

-v,--version

バージョン情報を出力して終了します

終わり

cdx をよろしくお願いいたします