3 年間くらいずっと zsh を使ってきたけれども、fish という新しいシェルに移行しました。

[toc]

環境

  • Ubuntu 16.04 LTS
  • fish 2.4.0

fish とは

賢くて、ユーザーフレンドリーなコマンドラインシェル。

  • fish shell

    Fish の由来は、Finally, shell らしい。

なぜ fish に乗り換えようとしたか?

るびきち(@rubikitch)さん の書いた記事に煽られたからです。

そんなにすごいものなのか?るびきちさんは、 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

訪れたフォルダにジャンプ。

完成した設定ファイル

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 との連携など。 時間をかければできるかもしれない。暇な時にハックしよう。

参考