🐟🐚

何もネタが無いのでぼくのconfig.fishを晒すね :pray:

「fish何やねんそれ:fish:」って人が全人類の99%だと思うので、適当に説明するね。

## :fish: is 何
fish shell だよ。
bash とか zsh みたいなやつ。
:fish: :shell: 

https://fishshell.com/

bash -> zsh -> fish という遍歴で使ってるよ。
イケてるかどうかわからないけど、ここ１年以上ずっと使ってるよ。いい感じだよ。

## 環境

```fishshell
( ⌁ ) fish -v
fish, version 2.6.0
( ⌁ ) omf --version
Oh My Fish version 6
```

## omf is 何

[oh-my-fish](https://github.com/oh-my-fish/oh-my-fish) だよ。
たぶん[oh-my-zsh](https://github.com/robbyrussell/oh-my-zsh)の~~パクリ~~オマージュ。

## bash との違い
何か知らんけど、bash<->zshって結構互換性あるけど、fishは「this way...」って感じで何か違う道を歩んでるから、微妙にシンタックスが異なって、たぶん最初はブチ切れると思うので、そこだけ説明しておくね。

### `&&` とか `||`

```bash
$ [ -e "./foo" ] && rm -f ./foo
```

`./foo` があったら `./foo` を削除するよ。簡単だよね。
`&&` が `AND` で `||` が `OR`。わかりやすい。
でもこれを fish で実行すると

```fishshell
( ⌁ ) [ -e "./foo" ] && rm -f foo
fish: Unsupported use of '&&'. In fish, please use 'COMMAND; and COMMAND'.
[ -e "./foo" ] && rm -f foo
                ^
```

というわけでエラーになっちゃうんだ。
ただしくは、こう。

```fishshell
[ -e "./foo" ]; and rm -f foo
```

「`&&` は使えないから `; and` を使ってね :star:」 とか言ってる間に `&&` を `; and` のaliasとして解釈してくれたらいいのに、とマジで思うんだけどね。きっと深淵なる理由があるだろうね。

`||` の代わりは `; OR` だよ。慣れりゃわかりやすい気もするけど、ぶっちゃけ `&&` と `||` でいいよね。

### バッククォートで囲んだりとか `$()` とか

```
cd $(dirname $(which bash))
cd $(dirname `which bash`)
cd `dirname $(which bash)`
```
みたいにbashの世界じゃバッククォートで囲んだり、 `$()` で囲んだ結果を返り値的に受け取れるやつがあるじゃん。（詳しい理屈は知らね）

fishの世界で叩いてみるね。

```fishshell
( ⌁ ) cd $(dirname $(which bash))
fish: $(...) is not supported. In fish, please use '(which)'.
cd $(dirname $(which bash))
             ^
( ⌁ ) cd $(dirname `which bash`)
fish: $(...) is not supported. In fish, please use '(dirname)'.
cd $(dirname `which bash`)
   ^
( ⌁ ) cd `dirname $(which bash)`
fish: $(...) is not supported. In fish, please use '(which)'.
cd `dirname $(which bash)`
            ^
( ⌁ ) dirname `which bash`
.
.
( ⌁ ) `which bash`
コマンド '`which' は見つかりませんでした。もしかして:
 コマンド 'which' - パッケージ 'debianutils' (main)
`which: コマンドが見つかりません
```
ほんとダメ。正しくは、こう。

```fishshell
cd (dirname (which bash))
```

シンプルで非常によろしいんだけどね。

### envを使う

コマンドの先頭にENVつけるやつあるじゃん。そのコマンドでしか有効じゃない環境変数やつ。

```bash

$ FOO=fooooooooo bash -c 'echo $FOO'
fooooooooo
$ echo $FOO
（空）
```

さて、 :fish::shell:

```fish
( ⌁ ) FOO=barrrrrrrrrr fish -c 'echo $FOO'
(   ) echo $status
127
```

`FOO=foooooo` の時点で怒られたよ
`$status` はいわゆる `$?` ね。

正しくは、こう

```fish
( ⌁ ) env FOO=barrrrrrrrrr fish -c 'echo $FOO'
barrrrrrrrrr
( ⌁ ) echo $FOO
（空）
```
`env KEY=value` 何だね。宣言的でいいね :innocent: 


## シンタックスの違いでこまること

ガッツリプラグイン書こうとしたり、シェルスクリプトをfishで組もうとしたりすると、↑みたいな差にいろいろ躓いて辛い。
けど、ほんとに上の3つだけ理解しておけば、大抵のことはなんとでもなる。

だいたいこういうのでハマるときは、コマンドコピペして使おうとしたりとか、そういう横着するとき。
上のやつさえ理解してれば大体大丈夫。

**シェルスクリプト書く場合はbashで書くしね！！！！！**

fishで書いたのなんて他人にシェアできないし、信じられないよ。HAHAHA。

## 前置きが長くなったけどぼくのconfig.fishを晒す

config.shっていってもほとんどaliasだけどね。

パワー:muscle:がある人ならfishをbashに読み替えてくれればいいと思うよ。

### :fish:をいい感じにするやつ

```
# use finsh-ssh-agent ( https://github.com/tuvistavie/fish-ssh-agent )
fundle plugin 'tuvistavie/fish-ssh-agent'

#setup peco plugin  see) https://github.com/oh-my-fish/plugin-peco
set fish_plugins theme peco
function fish_user_key_bindings
  bind \cr 'peco_select_history (commandline -b)'
end
```

社内だと`fzf`派が多い気がするけど、ワイは`peco`派やで。
とりあえず入れてるプラグインはこれくらい。簡単だね。

```
omf install flash                                               
omf theme flash                                                                       
omf install peco 
```

peco ったらomfでいれてるの上だけだった。
ぼくは[flash](https://github.com/oh-my-fish/oh-my-fish/blob/master/docs/Themes.md#flash) っていうテーマが大好きでいつもコレを使ってるいぇい。


### とてもよく使うalias

```fish
alias vi=vim
alias c=clear
alias l=ll
```
`c=clear` はマジオススメ。全人類使ったほうが良いコレ。

**追記**

**`ctrl + l` でええんちゃう？って教えてもらった！すごい！しらんかった！**

### 忘れがちだけと稀によく使うalias

```fish
alias ds='docker stats (docker ps --format="{{.Names}}")'
```
`docker stats` で `top` 的な画面が見えるけど、名前とかがアレでそれなので、それっぽくしてくれるやつ。

```fish
alias jqless='jq . -C | less -R'
```

```fish
echo '{"query":{"bool":{"filter":[{"term":{"hoge":10}}]}}}' | jqless
```

みたいな感じにすると

![範囲を選択_054.png](https://qiita-image-store.s3.amazonaws.com/0/3865/806f50dc-a315-ad61-2605-63290aaae6a0.png)

こんな感じにいい感じにLESSで色付きでjqの結果を表示してくれるんだ。すごいでしょ。

### ほぼ使わないけど設定してあるalias

```fish
alias random='cat /dev/urandom | env LC_CTYPE=C tr -dc "[a-zA-Z0-9//+=!@#\$%^&()\-_\|]" | head -c'
```

```fish
( ⌁ ) random 1
1
( ⌁ ) random 10
g+]]g]2/LW
( ⌁ ) random 50
zbkV8Atx6/x(q@D8]61c9RtPED2fd9noO6F8G7WKLy7HiLHiVD
```

こんな感じで指定した文字数のランダムな文字列を作ってくれるやつ。
なんとなく作ったけど、まず使わないね。

### ごくごく稀に使うalias

```fish
alias janrandom='ruby -e \'n=["4",["5","9"].sample,Random.rand(1 .. 9999999999).to_s.rjust(10,"0")].join.split(//).reverse;;e=o=0;n.each_with_index{|v,k|k.to_i.odd? ? o+=v.to_i : e+=v.to_i};n.unshift((10-((e*3)+o)%10)%10);puts n.reverse.join\''
```

もはやただのrubyだよね。rubyは本職じゃないから汚くても許してちょんまげ。
適当なJANコードを生成してくれるんだ。すごいよ。

## fishの何がすごいのか

こんな感じでほぼ何も設定してなくても、完成度の高いシェルになるのが魅力。
実際操作感に影響与えてるんはpecoプラグインくらいで、あとは flash テーマが大好きってくらい。

## というわけで
各種シェルに消耗したら、fishで癒やされるといいと思うですよ。