24 Dec 2016, 08:18

デフォルト設定で強力に便利!zsh から fish に乗り換えたまとめ

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

参考

11 Jul 2014, 01:14

pecoで実行コマンドを絞り込んで実行するpeco-M-x

今朝、Archlinuxのdmenuがうまく動かなくなった。

結果的には直ったのだけれども、 dmenuでやっているようなことをpecoでやってみたい。

やりたいこと

実行可能なコマンドを対話的コマンドで検索して、実行する.

Emacsのhelm-M-xのようなことをしたい。

実現方法

  1. 環境変数PATH配下にある実行可能コマンドを表示
  2. 表示結果をpecoで絞り込む。
  3. 検索結果を実行

Implement

シェルですべてかければよかったのだけれども、シェルが苦手なので途中でRubyに逃げた。

だれか、シェルで書き直してくれないかな。(他力本願)

25 May 2013, 12:56

zshは至高の利便性?!Cygwinにzshをインストール&設定した導入方法まとめ

シェルのなかで、至高の利便性を誇ると言われているzshを試してみました。きっかけは、この本を読んだので。作業メモを兼ねて、簡単に使い方を書きます。

 

zshとは

zshとは、シェルの種類のひとつ。Bashやtcshなどの、全てのシェルのいいとこどりをして開発された至高のシェル。”z”というのは、これで” これでシェルは完成で終わりだよ” という意味。

Z Shell – Wikipedia

zsh導入まで

zshインストール方法

Cygwinパッケージに含まれているので、setup.exeかapt-cygで取得します。

$ apt-cyg install zsh
$ zsh --version
zsh 5.0.2 (i686-pc-cygwin)

zshと打ち込むとzshになります。入力のためのコンソールが%になりました。

# zshに切り替える
zsh

zshをログインシェルにする

ログインしたときに、zshが起動するように設定します。

# ログインシェルの確認
% echo $SHELL
/bin/bash

普通はchshを利用するけれども、Cygwinではそれがない!なので、/etc/passwdを直接書き換えます。

% emacs /etc/passwd

# 変更前
tsu-nera:unused:1000:513:U-TSUNEMICHI-VAIO\TSUNEMICHI,S-1-5-21-2209003112-325970183-628590984-1000:/home/TSUNEMICHI:/bin/bash

# 変更後
tsu-nera:unused:1000:513:U-TSUNEMICHI-VAIO\TSUNEMICHI,S-1-5-21-2209003112-325970183-628590984-1000:/home/TSUNEMICHI:/usr/bin/zsh

すると、CygwinやCygtermはみごとzshで起動。しかし、母艦terminalのminttyだけがbashのまま・・・・(´・ω・`)。

いろいろと頑張ること1時間・・・ついにわかった!(・∀・)

ユーザ環境変数で、$SHELLがbashだった。

コントロールパネル – > システム -> システムの詳細設定 -> 環境変数からユーザ環境変数の設定画面へ。/bin/bashをを/usr/bin/zshに変更することで、minttyもzshで起動するようになった(^O^)

.zshrcの作成

.zshrcを作成すると、ログイン時に読み込まれる。$HOMEディレクトリにまずは作成。

touch .zshrc

.zshrcに書く内容は、いろんなサイトを参考に作ってみた。

自分の.zshrcファイルを公開 – 世界中の羊をかき集めて

あと、zsh最強シェル入門の本も参考にした。以下、便利そうなのをつまんで紹介。

screenで端末間のヒストリ機能の共有

zshは強力なヒストリ機能が魅力。特に、screenコマンドを使っていると、端末で実行したコマンドを全て共有したい場合がある。zshならば、端末ごとの共有だってできてしまう。以下2つの設定で有効になる。

## Screenでのコマンド共有用
## シェルを横断して.zshhistoryに記録
setopt inc_append_history
## ヒストリを共有
setopt share_history

他にも、重複排除などの機能もたくさん。

カレントディレクトリの表示

zshを利用すると、コンソール上にカレントディレクトリも表示することができる。もうpwdなんていらないのである。設定は以下。

SnapCrab_NoName_2013-5-24_17-47-24_No-00

# 色有効
autoload -U colors
colors

# 色を定義
local GREEN=$'%{\e[1;32m%}'
local BLUE=$'%{\e[1;34m%}'
local DEFAULT=$'%{\e[1;m%}'

# 通常のプロンプト
PROMPT=$BLUE'[%n]%# '$WHITE
# 右側のプロンプト。ここでカレントディレクトリを出す。
RPROMPT=$GREEN'[%~]'$WHITE
setopt transient_rprompt

グローバルエイリアスの設定

グローバルエイリアスを設定することで、コマンドの任意の場所で展開できるようになる。zshだけの機能。

例えば、ls -l L と入力すると、ls -l | less というように変換される。

alias -g L='| less'
alias -g H='| head'
alias -g T='| tail'
alias -g G='| grep'
alias -g GI='| grep -i'

Cygwinでwindowsパス形式のWaringを抑止する

zshでの操作の途中でこんなエラーが出る。

  MS-DOS style path detected: ./.zshrc\~
  Preferred POSIX equivalent is: ./.zshrc/~
  CYGWIN environment variable option "nodosfilewarning" turns off this warning.
  Consult the user's guide for more details about POSIX paths:
    http://cygwin.com/cygwin-ug-net/using.html#using-pathnames

これは、CygwinがWindowsパス形式をWaringとするため。コントロールパネル – > システム -> システムの詳細設定 -> 環境変数からシステム環境変数の設定画面へ。

CYGWIN=nodosfilewarningというように、環境変数追加するとよい。

SnapCrab_環境変数_2013-5-22_8-21-18_No-00

gnupack Users Guide – 技術情報

 

他にも便利そうな機能はたくさんあるけれども、とりあえずはこのへんでやめておく。