きっかけ・やりたいこと
- 複数のシェルを扱うとき、一方のシェルのカレントディレクトリに他方のシェルでcdしたい事が多かった
- ↓↓↓みたいなことをしたい
- 一方のシェルでいい感じのコマンドを打つ
- クリップボードにパスがコピーされる
- 他方のシェルでいい感じのコマンドを打つ
- クリップボードのパスにcdしてくれる
- ついでにホームディレクトリは~で表示されてほしい。↑↑↑の用途なら不要だけど、普通にカレントディレクトリを他のソースコードとかに打ったりするときにそうであってほしいから。
- pwdの結果をクリップボードにコピーするワンライナーを作ってaliasに登録すれば解決やん!→作るか〜
- クリップボードのパスをcdにぶちこむワンライナーを作ってaliasに登録すれば解決やん!→作るか〜
結果
~/.zshrc
# pwdついでにパスをクリップボードにコピー
alias p='pwd | tr -d '\n' | sed "s;$HOME;~;g" | pbcopy ; echo "$(pbpaste)" '
# クリップボードのパスに移動
alias cdp='cd "$(pbpaste | sed "s;~;$HOME;g")"'
解説
前提: クリップボード関連のコマンド
/bin/zsh
# pbcopy: クリップボードにコピー
$ echo "abc" | pbcopy
# pbpaste: クリップボードから貼り付け
$ pbpaste
abc
pwdのほう
pwd
の結果をパイプラインで加工加工。んでコピー。
tr -d '\n'
で末尾の改行を削除。
sed "s;$HOME;~;g"
でホームディレクトリ部分$HOME
が含まれていれば~
に置換している。
最後の; echo "$(pbpaste)"
だが、pwdの(標準)出力が全部tr→sed→pbcopyに食べられちゃうので、pwdの結果を表示するために追加している。
echoの引数を$(pbpaste)
にするとpbpasteの状態によって変な挙動をするので、ちゃんとダブルクォーテーションをつけよう!
cdのほう
実はcdとかいうやつ、標準入力を完全に無視する!!(なんでや)
$ echo "/bin" | cd
とか $ pbpaste | cd
みたいにしても思うようになってはくれない。
代わりに $ cd "$( pbpaste )"
を使う必要がある。
あと何故か~入りのままだとうまく動いてくれなかったので、sed "s;~;$HOME;g"
を噛ませて展開している。
参考