尋常でないもふもふ

a software engineer blog

zshは諦めてたけどfish shell導入したら捗った

エンジニア人生の中で zsh を導入しようと数回思いたったことはあるのだけれど、毎回初期設定のひどさを見るたびに辟易して bash でいいやと諦めていた。
コピペで機能追加できるとか言われても、自分の理解の範疇を超えてわけわからん状態になるのは耐え難いし、そこに学習コストをかけるモチベーションもない。
しかし最近になって Fish Shell=fish という面倒がなく導入できて使い勝手もすこぶる良いものがあると知り導入することにした。

インストール

Homebrew でインストールできる。

$ brew install fish

プラグイン管理ツールのインストール

zsh では oh-my-zsh, Antigen, zplug のようないくつかのプラグイン管理ツールがあるようだけど、fish では oh-my-fishfisherman があり、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

初期設定

デフォルトのシェルを 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

現状、このような記述にしている。
nodebrewgolangプラグインはまだないようだが、ちゃんと探せてないだけだと思う。

見た目の変更

ローカル環境でサーバが起動しWebブラウザから設定できるようになる。

$ fish_config

各種設定

bash のときは ruby, node.js, golang の設定を書いているくらいだった。fish では config.fish に書かなくても fisherman でインストールすれば使えるようになるものもある。
以下は Ruby 環境用の rbenvPython 環境用の pyenv の自動設定プラグイン

$ fisher add rbenv pyenv

最高に便利なプラグイン

対話的フィルタリングツールとして peco が有名だけど、同等以上に便利な fzfMac にインストールした。

$ 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

pecofzf つかって zsh スクリプトと合わせて使うのが一般的らしいけど、zsh の導入とか各種スクリプトみるとウゲッてなるので自分は ghq look だけでいいや派。

[追記] FishShell + fisherman を導入

ショートカットキー Ctrl + G で超快適なディレクトリ移動を手にいれた。

zshは諦めてたけどfish shell導入したら捗った - jnst blog

プライベートリポジトリを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

原因

普段は GitHubSSH 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

参考