【Linux】【fish】fish のセットアップ【SW】

fishのセットアップ
f:id:dnkrnka:20180513160423p:plain:right
fishシェルのセットアップについて記す。
るびきちさんの記事を見て fish に興味を惹かれた。
 

 

公式サイト

fish shell
 

インストール手順

1. fish のインストール

最新の fish shell をインストールするには、fish-shell release からパッケージをダウンロードするか、コードを入手してビルドする。
下記の方法だと古いバージョンがインストールされる。

% sudo apt-get install fish
% fish --version
fish, version 2.4.0

 
 

2. fish の設定フォルダを作成する

とりあえず, シェルを fish に切り替えると $HOME/.config/fish が作成される。
chsh -s `which fish` を実行してシェルを fish に切り替えてもよい。

% fish
% chsh -s `which fish`

  

3. fish のプラグイン管理機能をインストールする

以下、fish に切り替えて操作すること。
なお、コマンド記載の行頭の > はプロンプトであるので入力しないこと 
 

3-1. fisherman
  • プラグインマネージャである fisherman をインストールする。
  • fisherman の導入によって、「fisher XXXX」という形式でプラグインインストールが可能になる。
> curl -Lo ~/.config/fish/functions/fisher.fish --create-dirs git.io/fisher
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:01 --:--:--     0
100 61857  100 61857    0     0  42737      0  0:00:01  0:00:01 --:--:-- 42737

 

3-2. fzf
  • readline (Ctrl + R) を実現する。ただし、別途 fzf のインストールが必要である。
  • fzf か peco *1のどちらかを使って実現することが多い模様。
  • $HOME/.config/fzf として展開する

 
【1】 fzf コマンドのインストール。

> cd $HOME/.config/
> git clone https://github.com/junegunn/fzf.git
> cd fzf
> file ./install
./install: Bourne-Again shell script, ASCII text executable
> /bin/bash ./install

 
【2】ログイン後に bash から fish に切り替えた場合でも fzf が使えるようにするので「y」とする。

> ./install 
Downloading bin/fzf ...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   616    0   616    0     0    572      0 --:--:--  0:00:01 --:--:--   573
100  894k  100  894k    0     0   233k      0  0:00:03  0:00:03 --:--:--  465k
  - Checking fzf executable ... 0.17.0
Do you want to enable fuzzy auto-completion? ([y]/n) y
Do you want to enable key bindings? ([y]/n) y

Generate ~/.fzf.bash ... OK
Generate ~/.fzf.zsh ... OK
Update fish_user_paths ... Failed
Symlink /home/neko/.config/fish/functions/fzf_key_bindings.fish ... OK

Do you want to update your shell configuration files? ([y]/n) y
以下略

 
【3】 作成された fzf を $HOME/bin/ に配置する。なお fzf は静的リンクされたファイルである。

> cp ./bin/fzf $HOME/bin/.
> file $HOME/bin/fzf
/home/neko/bin/fzf: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, not stripped

 
【4】 fish での fzf 機能を有効にする。

> which fzf
/home/neko/bin/fzf
> fisher fzf

 
【5】 効果確認をする。
こちらより、以下のように機能していれば fzf のインストールはOKとなる.

キー 機能
Ctrl-t カレントディレクトリ配下のすべてのファイルを自動補完
Ctrl-r コマンド履歴から自動補完
Ctrl-x コマンド履歴から自動補完して確認なしに即実行
Alt-c カレントディレクトリ配下のすべてのディレクトリを自動補完して移動
Alt-Shift-c カレントディレクトリ配下のすべてのディレクトリを自動補完して移動 (隠しファイル含む)

 
 

3-3. fishingz

Vim の Unite, Emacs の Anything のような操作性で全ファイルシステム対象のランチャ。
下記ソフトウェアが必要である。

    • fzf
    • xclip

 
【1】 インストールする
Git によるインストールと、 fisherman によるインストールの2通りの方法がある。
Git によるインストール

% git clone https://github.com/nekochango/fishingz  
% cp -p ./fishingz/fishingz.fish $HOME/.config/fish/function/.  

fisherman によるインストール

% fisherman nekochango/fishingz

 
【2】 依存ソフトをインストールする
fzf のインストール (上記でインストール済みの場合は本手順は不要である)

% git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
% ~/.fzf/install

 
xclip のインストール

% sudo apt-get install xclip

管理者権限が無い場合はローカルでビルドしてから使用する。

% git clone https://github.com/astrand/xclip
% autoreconf		# create configuration files
% ./configure		# create the Makefile
% make			# build the binary

 
以降のセットアップおよび使用方法は公式手順を参照。
 
 

4. いろいろなオートコンプリートを追加

引き続きこちらのサイト様より。以下、3175個の情報から補完候補を生成した。

> fish_update_completions
Parsing man pages and writing completions to /home/neko/.local/share/fish/generated_completions/
  3175 / 3175 : zramctl.8.gz                             

 

5. alias の設定

~/.config/fish/config.fish

alias l 'ls -ltrA'
alias p 'pwd'
alias grpe 'grep'
alias vim 'nvim'

なお、balias 導入済みの場合は以下のように記述ができる。

~/.config/fish/config.fish

balias l 'ls -ltrA'
balias p 'pwd'
balias grpe 'grep'
balias vim 'nvim'

 

6. PATH の設定

追加

> set -U fish_user_paths $HOME/bin $fish_user_paths

表示
$fish_user_paths[x] として特定の変数のみ表示が可能

> echo $fish_user_paths
/home/neko/bin /tmp/bin /tmp/hoge/bin
> echo $fish_user_paths[2]
/tmp/bin

削除
「set -e -U fish_user_paths[x]」として削除する。x は 1オリジンである。

> echo $fish_user_paths
/home/neko/bin /tmp/bin /tmp/hoge/bin
> set -e -U fish_user_paths[2]
> echo $fish_user_paths
/home/neko/bin /tmp/hoge/bin

 

7. その他環境変数の追加方法

例:ccache用の変数を追加する場合

$HOME/.config/fish/config.fish

> set -x CC 'ccache gcc'

 

9. グラフィカル画面での fish 設定

fish_config コマンドを使って、ブラウザを起動させて設定ができる。

> fish_config

 

追加設定

cd 実行と同時に pwd と ls を行う

> mkdir $HOME/.config/fisherman/cd/functions
> vim $HOME/.config/fisherman/cd/functions/cd.fish

$HOME/.config/fisherman/cd/functions/cd.fish

# https://qiita.com/Riliumph/items/15245ef37ffd850385e7 より拝借した
function cd
    if test (count $argv) -eq 0
        cd $HOME
        #return 0
    else if test (count $argv) -gt 1
        printf "%s\n" (_ "Too many args for cd command")
        return 1
    end
    # Avoid set completions.
    set -l previous $PWD

    if test "$argv" = "-"
        if test "$__fish_cd_direction" = "next"
            nextd
        else
            prevd
        end
        return $status
    end
    builtin cd $argv
    set -l cd_status $status
    # Log history
    if test $cd_status -eq 0 -a "$PWD" != "$previous"
        set -q dirprev[$MAX_DIR_HIST]
        and set -e dirprev[1]
        set -g dirprev $dirprev $previous
        set -e dirnext
        set -g __fish_cd_direction prev
    end

    if test $cd_status -ne 0
        return 1
    end
    pwd
    ls -A
    return $status
end
> cd $HOME/.config/fish/functions
> ln -s $HOME/.config/fisherman/cd/functions/cd.fish .

以上で fish 使用時に cd をすると pwd ; ls -A も同時に実行してくれる。
 

プロンプト表示を変える

 
1. まずは fish_config コマンドを実行する

> fish_config

 
2. Prompt タブから 「Terlar」を選択する
f:id:dnkrnka:20180516163054p:plain
 
3. プロンプトに反映された
.git ディレクトリが存在するディレクトリ以下に移動すると、リポジトリ情報を表示してくれる。
ローカルに変更ありの場合
f:id:dnkrnka:20180516163248p:plain
差分なしの場合
f:id:dnkrnka:20180516163442p:plain
 
4. 作成された $HOME/.config/fish/functions/fish_prompt.fish を見てみる
「Terlar」の場合

function fish_prompt --description 'Write out the prompt'
	set -l last_status $status

    # User
    set_color $fish_color_user
    echo -n (whoami)
    set_color normal

    echo -n '@'

    # Host
    set_color $fish_color_host
    echo -n (prompt_hostname)
    set_color normal

    echo -n ':'

    # PWD
    set_color $fish_color_cwd
    echo -n (prompt_pwd)
    set_color normal

    __terlar_git_prompt
    __fish_hg_prompt
    echo

    if not test $last_status -eq 0
        set_color $fish_color_error
    end

    echo -n ''
    set_color normal
end

 
5. $HOME/.config/fish/functions/fish_prompt.fish を改造する

  • 全角文字は見た目キレイだが、文字幅が乱れることもあるので止める
  • こちらを参考にして次のように変えた

$HOME/.config/fish/functions/fish_prompt.fish

function fish_prompt --description 'Write out the prompt'
	set -l last_status $status

    # # User
    # set_color $fish_color_user
    # echo -n (whoami)
    # set_color normal

    # echo -n '@'

    # # Host
    # set_color $fish_color_host
    # echo -n (prompt_hostname)
    # set_color normal

    # echo -n ':'

    # PWD
    set_color $fish_color_cwd
    echo -n (prompt_pwd)
    set_color normal

    #__terlar_git_prompt
    #__fish_hg_prompt
    printf '%s ' (__fish_git_prompt)
    # echo

    if not test $last_status -eq 0
        set_color $fish_color_error
    end

    #echo -n '➤ '
    echo -n '% '
    set_color normal
end

$HOME/.config/fish/config.fish

balias  l       'ls -ltrA'
balias  p       'pwd'
alias   n       'nvim-qt --geometry 1000x900+600+0'
alias   nvim-qt 'nvim-qt --geometry 1000x900+600+0'
alias   vim     'nvim'
alias   grpe    'grep'
alias   h       'history'  

# Fish git prompt
set __fish_git_prompt_showdirtystate 'yes'
set __fish_git_prompt_showstashstate 'yes'
set __fish_git_prompt_showuntrackedfiles 'yes'
set __fish_git_prompt_showupstream 'yes'
set __fish_git_prompt_color_branch yellow
set __fish_git_prompt_color_upstream_ahead green
set __fish_git_prompt_color_upstream_behind red

# Status Chars
set __fish_git_prompt_char_dirtystate '!'
set __fish_git_prompt_char_stagedstate '>'
set __fish_git_prompt_char_untrackedfiles '?'
set __fish_git_prompt_char_stashstate '<'
set __fish_git_prompt_char_upstream_ahead '+'
set __fish_git_prompt_char_upstream_behind '-'

 
以下のようになった。
f:id:dnkrnka:20180516181450p:plain

*1:unite や anything.el のようなもの。 ls -lRA $HOME | peco で分かる