たいちょーの雑記

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

cdコマンドのwrapperを自分のためだけに作った

といってもだいぶ前からあるんだけどね

既存のコマンドをシェルスクリプトで魔改装するの最高

cdのwrapperと言えばenhancdとかfishzがありますね github.com
github.com

実は僕もcdxという同じようなコマンドを作っていて、それは2016年の年末にここでも紹介しました
xztaityozx.hatenablog.com

そもそもcdxは快適にcdしたいと思い、ggる前にシェルスクリプトを書き始めたのが最初でした。このときにちゃんとggってればenhancdに出会えたでしょう
そしてなぜenhancdの存在を知ってもなお自前のものを使っていたのか、それは単なる愛着にすぎません

2016年の段階ではenhancdzcdxが勝る点が無かったんですが、「自分のつくったものだし・・・」と思ってメンテをしてきました
そしてenhancdなどにインスパイアされたりして、いくつか機能を付け、自分なりに使いやすくしたので公開しようと思います(それでもenhancdを上回ることはできないでしょう たぶん)

cdx

logo

(ぼくはこういうデザインが好きです)

github.com

README.mdにもつらい英語と日本語でいろいろ書いていますがここでも

デモ

demo

cdxの主な機能は以下です

  • 移動履歴からcdできる
  • ブックマークからcdできる
  • enhancdのようにfzfpecoを使ってファジーサーチできる
  • ~/.ssh/configを読んでsshログインできる
  • 移動先ディレクトリが無いときは作ってから移動できる

などです。全部あんなこといいなできたらいいなで実装したものです

動作環境

bashシェルスクリプトなのでbashを使っている人向けです
普通のシェルスクリプトならそうではないのですがcdxsourceコマンドでcdを反映するのでzshfishでは使えないと思います・・・
改良したいですね

あとはpecoとか`fzfみたいなインタラクティブフィルターがあるともっといいと思います。

github.com
github.com

インストール

git clone https://github.com/xztaityozx/cdx
cd cdx
./install.sh

使い方

cdx [OPTION] PATH

使い方はcdとほぼ同じです。cdよりはオプションの数が多いです

オプション

cdxではいくつかオプションを用意しています。これによって機能のオンオフができます

Option Action
–help ヘルプを表示します
–fuzzy パスの補完や履歴、ブックマークの取得にfzfpecoのようなファジー検索ツールを使用します。使用するツールはCDX_FUZZY_COMMAND変数へ書き込む必要があります
–cd cdxではデフォルトでpushdコマンドを使うようにしていますがこれをcdに置き換えます
–ls cdした後に自動的にlsコマンドを実行します
-h 履歴からcdします。これには–fuzzyオプションが必要です
-b ブックマークからcdします。これには–fuzzyオプションが必要です
+b カレントディレクトリをブックマークに追加します
-p cdpushdの代わりにpopdを実行します
–automake 移動先が見つからなかったとき自動的にディレクトリを作りcdします
–make 移動先が見つからなかったときにディレクトリを作ってもいいか尋ねます
ssh cdxsshを許可します。これをオンにして~/.ssh/configにあるホスト名を与えるとsshログインを試みます。もし同じ名前のディレクトリがある場合はcdが優先されます

これらのオプションを毎回つけるのは面倒だと思ったのでCDX_DEFAULT_OPTS変数に書いてあるオプションをcdxが自動的にオプションに加えるようにしました(fzfの真似をしました)

例) --ssh --fuzzy --makeを毎回オンにしてfzfを使いたい場合~/.bashrc

CDX_DEFAULT_OPTS="--ssh --fuzzy --make"
CDX_FUZZY_COMMAND="fzf"

と書けばいいです

-hと-bオプション

この二つのオプションはそれぞれ履歴とブックマークからのcdをするコマンドですが、インストールを手順通りにやっていればタブでの補完でもファジーサーチが起動するようになっています
タブ補完ではもう一つ。パスの最後が/**となっているときもタブで。それまでのパス以下をリストアップしファジーサーチが起動します

cdx -h <TAB> #履歴オープン
cdx -b <TAB> #ブックマークオープン
cdx /home/hoge/huga/** <TAB> #~/hoge/huga以下に対してしてファジーサーチが起動

sshオプション

sshオプションを有効にしたときはcdxsshログインができるようになります
例えば~/.ssh/config

Host abc
    HostName xxx.xxx.xxx.xxx
    User user
    Port xx

だとすると

cdx --ssh abc

とすると~/.ssh/configの情報を使ってsshログインを試みます。もし同じ名前のディレクトリがある場合は 移動の方を優先 します。

このオプションの実装はシェルスクリプト内で~/.ssh/config内に登録されたHost名かどうかを確かめた後

ssh [HostName]

を実行しているのです。~/.ssh/configの設定をよくする人は使い勝手は同じに感じることができると思います

実はこのオプションの導入をするかどうかは考えました
ディレクトリを移動するcdxコマンド」を考えたときsshログインまでカバーするのはやりすぎだと思いました。
しかし「移動を簡単にするcdxコマンド」として考えたときsshログインもまた移動なのかなと思いました

とか何とか言ってますが一つにまとめられて個人的には満足しています

終わりに

enhancdはすごいです。next generation を謳っているだけはあります。cdxenhancdほど複雑な実装をしていません。コマンドの本体もcdx.shだけで完結しています。
cdxではcdした後にどこに移動したかが目でよくわかるような表示をしています。これは結構見やすくカッコいいと思っています。ただしターミナルの配色によっては見えづらいかもしれません・・・(cdx_echo.shをいじってください)

カッコいい見た目とかブックマークとかsshしたいという人はぜひ使ってもらえたらと思います