3 年間くらいずっと zsh を使ってきたけれども、fish という新しいシェルに移行しました。
[toc]
環境
- Ubuntu 16.04 LTS
- fish 2.4.0
fish とは
賢くて、ユーザーフレンドリーなコマンドラインシェル。
-
Fish の由来は、Finally, shell らしい。
なぜ fish に乗り換えようとしたか?
るびきち(@rubikitch)さん の書いた記事に煽られたからです。
- fish シェル普及計画
- fish シェル専門サイト fish.rubikitch.com 設立!
- fish-mode.el : 【 Unix シェル】若者よ、騙されたと思って fish 使ってみろ!bash や zsh なんか捨ててしまえ
- fish shell チュートリアル
- あなたが zsh/bash/eshell から fish に乗り換えるべき 17 の理由
そんなにすごいものなのか?るびきちさんは、 Emacs の先駆者としてとても尊敬しているので、 そんな彼が進めるのならば、いいものなのではないか?
新しいものが好きなので、早速試してみました。
ちなみに、Google トレンドによると、だんだん上昇しています。
fish のインストール
各ディストリビューションによって異なる。Ubuntu の場合は、
sudo apt-add-repository ppa:fish-shell/release-2
sudo apt-get update
sudo apt-get install fish
いよいよデフォルトのシェルを zsh から fish に乗り換え
以下のコマンドで乗り換える。心の準備はいいかい?
chsh -s `which fish`
設定ファイルの移行 .zshrc -> config.fish
現状の.zshrc はこんな感じ。
これを config.fish に移行しなければいけない。。621 行の移行。これは大変だぞ!
どこから手をつけようか? と、その前に fish-mode.el の導入。
Emacs major mode for fish shell scripts.
(require 'fish-mode)
これで、作業が楽になる。
まずはコピペから
.zshrc を config.fish にコピペする
cp $HOME/.zshrc $HOME/.config/fish/config.fish
そのままだとエラーが多発するので、とりあえず、全部コメントアウト。
zsh 関係の設定は全武消す
ここは、思い切って消してしまう。fish の魅力を信じる。
alias の移行
以下の形式でかけるので、zsh と変わらない。zsh らしさをなくすために=を除去する。
alias NAME DEFINITION
alias NAME=DEFINITION
~/.config/fish/alias.fish に alias と関数をまとめていく。 そのためには、config.fish 冒頭に以下を追記。
. ~/.config/fish/aliases.fish
alias は関数を簡単に書いたものらしい。
file / directory の存在確認
以下でできる。
file:
if test -e ~/.foobar
echo "File exists"
end
directory:
if test -d ~/.hello
echo "Dir exists"
end
プログラムの存在確認
if test -x "emacs"
function fish_title; end
end
関数の移行
関数は以下の function - end で挟み込む。
function dual
xrandr --output eDP1 --primary --left-of HDMI1 --output HDMI1 --mode 1280x720
end
Emacs の関数たち
# Emacs で dired をひらく
function dired
emacsclient -e "(dired \"$PWD\")"
end
cde が移植できませんでした。
PATH の移行
環境変数は .config/fish/env.fish にまとめることにする。以下を config.fish にかく。
if status --is-login
. ~/.config/fish/env.fish
end
PATH は以下の形式で設定する。set -U がポイント。
set -U fish_user_paths /usr/local/bin $fish_user_paths
プラグイン
oh-my-fish
- fish shell をさらに魅力的にしてくれるツール.
17@112:追記 : fisherman を使った方がよい。
curl -L https://get.oh-my.fish | fish
インストールすると、画面がカラフルになる。さまざまなフレームワークを含んでいるらしい。
詳しくは README.md で!
function fish_user_key_bindings
# ghq を選択
bind \cl peco_select_ghq_repository
# コマンド履歴を見る
bind \cr peco_select_history
# プロセスをキルする
bind \cx\ck peco_kill
end
テーマの設定
ここから好きなテーマが選べる。
迷うからデフォルトで
omf theme default
powerline
かっこいいパワーラインを入れてみる。
と思ったけれども、かっこ悪いので封印。
z
訪れたフォルダにジャンプ。
完成した設定ファイル
-
https://github.com/tsu-nera/dotfiles/tree/master/.config/fish
拍子ぬけするほどあっさりしてしまった。100 行もないのではないか?
config.fish
# alias & function 読み込み
. ~/.config/fish/aliases.fish
# 環境変数読み込み
if status --is-login
. ~/.config/fish/env.fish
end
env.fish
export LANG=ja_JP.UTF-8
export LD_LIBRARY_PATH=/usr/local/lib
export LIBRARY_PATH=/usr/local/lib
export CPATH=/usr/local/include
if test -d ~/script
set fish_user_paths ~/script/sh $fish_user_paths
set fish_user_paths ~/script/ruby $fish_user_paths
set fish_user_paths ~/script/scala $fish_user_paths
end
set -x EDITOR emacs
set -x VISUAL "emacsclient -nw"
# for ruby
if test -x "`which ruby`"
set fish_user_paths $HOME/.gem/ruby/2.1.0/bin $fish_user_paths
end
# for go
if test -x go
set -x GOPATH $HOME/go
set fish_user_paths $GOROOT/bin $fish_user_paths
set fish_user_paths $GOPATH/bin $fish_user_paths
end
# my bin
set fish_user_paths $HOME/bin $fish_user_paths
aliases.fish
alias o ‘xdg-open’ alias c ‘cygstart’ alias forced_git_local_destroy ‘git fetch origin;git reset –hard origin/master’ alias xmap ‘xmodmap ~/.Xmodmap’
alias m ‘emacsclient -nw’ alias kill_emacs “emacsclient -e (kill-emacs)”" alias boot_emacs “emacs –daemon”
function reboot_emacs kill_emacs;boot_emacs end
alias lock ‘gnome-screensaver-command -l’
alias fault ‘sudo shutdown -P now’
####################################### ## peco ###################################### function peco command peco –layout=bottom-up $argv end
function fish_user_key_bindings
bind \cl peco_select_ghq_repository
bind \cr peco_select_history
bind \cx\ck peco_kill end
#######################################################
#######################################################
function dual xrandr –output eDP1 –primary –left-of HDMI1 –output HDMI1 –mode 1280x720 end
function dual2 xrandr –output eDP1 –primary –left-of HDMI1 –output HDMI1 –auto end
function single xrandr –output HDMI1 –off end
############ ## Emacs ########### function dired emacsclient -e “(dired “$PWD)” end
## Chdir to the ``default-directory'' of currently opened in Emacs buffer. function cde end
#+end_src
使ってみた感想など
メリット
-
軽い
体感だけれども、zsh よりも、サクサク動作する気がする。
-
色鮮やか
デフォルトでも十分色鮮やかだ。黒背景にカラフルな色が好きな自分にとってはうれしい。
-
設定がとても簡単
驚くほどに簡単だ。zsh の職人技じみた設定はなんだったのだろうか?
デフォルトで強力な機能が備わっている。
設定ファイルをみても、zsh では 600 行あったものが 100 行程度に収まっている。
-
補完がつよい
困った時は、タブを押す。 すると、補完がきいて助けてくれる。この機能が一番気に入っている。
デメリット
-
ドキュメントやブログ記事が少ない。
-
利用者がまだまだ少ない。
このことによって、他人の設定を参考にすることができない。
-
zsh でできたことが fish でできなかったりする
zsh では、いろいろと自作関数をつくって便利にしたのだけれども、 fish では同じ機能が実現できなかった。たとえば Emacs との連携など。 時間をかければできるかもしれない。暇な時にハックしよう。