zshは諦めてたけどfish shell導入したら捗った
エンジニア人生の中で zsh
を導入しようと数回思いたったことはあるのだけれど、毎回初期設定のひどさを見るたびに辟易して bash
でいいやと諦めていた。
コピペで機能追加できるとか言われても、自分の理解の範疇を超えてわけわからん状態になるのは耐え難いし、そこに学習コストをかけるモチベーションもない。
しかし最近になって Fish Shell=fish
という面倒がなく導入できて使い勝手もすこぶる良いものがあると知り導入することにした。
インストール
Homebrew でインストールできる。
$ brew install fish
プラグイン管理ツールのインストール
zsh では oh-my-zsh
, Antigen
, zplug
のようないくつかのプラグイン管理ツールがあるようだけど、fish では oh-my-fish と fisherman があり、fisherman の方がより洗練されているそうなので fisherman を使うことにする。
$ curl -Lo ~/.config/fish/functions/fisher.fish --create-dirs git.io/fisherman $ fisher -v fisherman version 2.9.0 ~/.config/fish/functions/fisher.fish
- fisher コマンドの使い方は
fisher -h
をみる - プラグインは http://fisherman.sh/ から検索できる
- 導入したプラグイン
- rbenv -
rbenv
の自動設定 - pyenv -
pyenv
の自動設定 - fzf -
peco
より高機能な対話的フィルタリングツールのfzf
の関数 - decors/fish-ghq -
Ctrl + G
でfzf
&ghq
の連携をしてくれる
- rbenv -
初期設定
デフォルトのシェルを bash から fish に変更する。
$ echo /usr/local/bin/fish | sudo tee -a /etc/shells $ chsh -s /usr/local/bin/fish
設定ファイル
bash では ~/.bash_profile
や ~/.bashrc
を設定ファイルとして使うが、fish では ~/.config/fish/config.fish
を編集する。
$ touch ~/.config/fish/config.fish
現状、このような記述にしている。
nodebrew
と golang
のプラグインはまだないようだが、ちゃんと探せてないだけだと思う。
見た目の変更
ローカル環境でサーバが起動しWebブラウザから設定できるようになる。
$ fish_config
各種設定
bash のときは ruby, node.js, golang の設定を書いているくらいだった。fish では config.fish
に書かなくても fisherman
でインストールすれば使えるようになるものもある。
以下は Ruby 環境用の rbenv
と Python 環境用の pyenv
の自動設定プラグイン。
$ fisher add rbenv pyenv
最高に便利なプラグイン
対話的フィルタリングツールとして peco
が有名だけど、同等以上に便利な fzf
を Mac にインストールした。
$ brew fzf
続いて fish で便利に使えるようにする fzf プラグインをインストール。
$ fisher add jethrokuan/fzf
これでキーバインディグが追加される(ただし Mac の場合は Alt + c
が ç
と入力されてしまうため、Esc キーを使ったり別途設定が必要)。
Ctrl-t
: カレントディレクトリ配下のすべてのファイルを自動補完Ctrl-r
: コマンド履歴から自動補完Ctrl-x
: コマンド履歴から自動補完して確認なしに即実行Alt-c
: カレントディレクトリ配下のすべてのディレクトリを自動補完して移動Alt-Shift-c
: カレントディレクトリ配下のすべてのディレクトリを自動補完して移動 (隠しファイル含む)
Go 言語を利用している場合は GitHub リポジトリの clone に ghq を利用している人が多いが、これも fish プラグインを使うことで便利なリポジトリ移動ができる。
fisher decors/fish-ghq
いろいろなオートコンプリートを追加
man ページを元に自動生成してくれる。git
コマンドでも ruby
コマンドでも何でも自動で追加してくれる。この仕組みはシェル界隈ではエポックメイキング的に便利な新機能のようだ。
生成ファイルは ~/.local/share/fish/generated_completions
に保存された。
$ fish_update_completions Parsing man pages and writing completions to /Users/jnst/.local/share/fish/generated_completions/ 2683 / 2683 : zic.8
ghqでGitHubのリポジトリ管理する
概要
ソースコードは Go 言語のエコシステム(?) $GOPATH
配下での一元管理と決められたディレクトリ構造をそのまま活用することにした。そのために便利な ghq を導入する。
GitHub - motemen/ghq: Remote repository management made easy
ちなみにプログラミング言語問わず、ソースコードのディレクトリを一元管理するのなら $GOPATH は ~/go
よりも ~/dev
とか ~/workspace
の方が合ってると思うけど、個人的にイマイチしっくりくるワードが思い当たらず、今のところ ~/go
使ってる。
[追記] Go v1.8 の新仕様
$GOPATH が未設定の場合にデフォルトで ~/go
をつかうようになるそうだ。
assume GOPATH=$HOME/go if not set
インストール
Homebrew からいれる
$ brew install ghq
設定
$ git config --global ghq.root $GOPATH/src
この設定をしないと ~/.ghq
配下にクローンされる。Go 言語使うなら $GOPATH 直下の src を設定すべき。
リポジトリのクローン
いろいろな書き方ができる
$ ghq get git@github.com:jnst/go-world.git
$ ghq get https://github.com/jnst/go-world.git
$ ghq get jnst/go-world
クローンしたリポジトリへ移動
$ ghq look go-world
peco
か fzf
つかって zsh スクリプトと合わせて使うのが一般的らしいけど、zsh の導入とか各種スクリプトみるとウゲッてなるので自分は ghq look
だけでいいや派。
[追記] FishShell
+ fisherman
を導入
ショートカットキー Ctrl + G
で超快適なディレクトリ移動を手にいれた。
プライベートリポジトリをgo getする方法
自分のプライベートリポジトリをgo get
すると以下のようなエラーが発生する。
$ go get github.com/jnst/my-private-repo # cd .; git clone https://github.com/jnst/my-private-repo /Users/jnst/go/src/github.com/jnst/my-private-repo Cloning into '/Users/jnst/go/src/github.com/jnst/my-private-repo'... fatal: could not read Username for 'https://github.com': terminal prompts disabled package github.com/jnst/my-private-repo: exit status 128
原因
普段は GitHub の SSH Keys
に公開鍵を登録して SSH 認証しているので git@github.com:jnst/my-private-repo.git
のような URL を使ってプッシュしたりしてると思うけど、go get
の場合は HTTP 経由で行わないとダメらしい。
Personal access tokens
を生成して HTTP の URL にくっつけてあげれば OAuth 認証(?)可能になるため、go get
も使うことができる。
やり方
https://github.com/settings/tokens
ここから repo
権限にチェックつけて(Organization のリポジトリなら admin:org
も必要のはず)トークンを生成してコピーして下記コマンドを実行。
$ git config --global url."https://c61axxxxxxxxxxxxxxx:x-oauth-basic@github.com/".insteadOf "https://github.com/"
c61axxxxxxxxxxxxxxx
の部分に生成したトークンを貼っ付ける。
そうすると実行した内容が ~/.gitconfig
に追記されて、この状態なら go get github.com/jnst/my-private-repo
が可能になっている。
$ go get github.com/jnst/my-private-repo # cd /Users/jnst/go/src/github.com/jnst/my-private-repo; git show-ref package github.com/jnst/my-private-repo: exit status 1