チュートリアル

なぜ fish なのか?

fish は、bash や zsh のような、スマートでユーザーフレンドリーな機能をフル装備したコマンドラインシェルです。fish は、構文ハイライト、オートサジェスチョン(自動提案)、タブ補完といった強力な機能をサポートしており、学習や設定をすることなく、使い始めた瞬間からそれらが「いい感じに」動作します。

難解な構文や設定オプションを大量に覚えることなく、コマンドラインをもっと生産的で、便利で、楽しいものにしたいなら、fish はまさにあなたが探し求めていたものかもしれません。

はじめに

インストールしたら、現在のシェルで fish と入力するだけで試すことができます。

標準的な fish プロンプトが表示されれば、準備は完了です。すぐに fish を使い始めることができます。

> fish
Welcome to fish, the friendly interactive shell
Type help for instructions on how to use fish
you@hostname ~>

上に表示されているのは fish のデフォルトのプロンプトです。ユーザー名、ホスト名、および作業ディレクトリが表示されます。これはカスタマイズ可能です。詳細は プロンプトの変更方法 を参照してください。

これ以降、スペースを節約するために、プロンプトは単に > であるものとして説明します。

fish を学ぶ

このチュートリアルは、コマンドラインシェルと Unix コマンドの基本的な理解があり、手元に動作する fish があることを前提としています。

他のシェルに精通しており、fish との違いを知りたい場合は、重要な違いを指摘するために使われている「他のシェルとは異なり(unlike other shells)」というフレーズを検索してみてください。

あるいは、bash などの他のシェルとの違いを素早く把握したい場合は、 bash ユーザーのための fish を参照してください。

fish を対話的に使用する方法の完全かつ詳細な説明については、 対話的な使用 を参照してください。

fish のスクリプト言語に関する包括的な説明については、 fish 言語 を参照してください。

コマンドの実行

fish は他のシェルと同様にコマンドを実行します。コマンドを入力し、その後に引数を続けます。スペースが区切り文字となります。

> echo hello world
hello world

これは、引数 helloworld を指定して echo コマンドを実行します。この例では、単一の引数 hello world を渡すのと同じ結果になりますが、多くの場合そうではありません。スペースを含む引数を渡す必要がある場合は、バックスラッシュで エスケープ するか、シングルクォートまたはダブルクォートで 引用符で囲みます

> mkdir My\ Files
# Makes a directory called "My Files", with a space in the name
> cp ~/Some\ File 'My Files'
# Copies a file called "Some File" in the home directory to "My Files"
> ls "My Files"
Some File

ヘルプの表示

help を実行すると、Web ブラウザで fish のヘルプが開きます。 man にページ名( fish-language など)を指定して実行すると、man ページとして開きます。特定のコマンドについてヘルプが必要な場合は、例えば help set と入力するとブラウザで、man set と入力するとターミナル上でその説明を確認できます。

> man set
set - handle shell variables
  Synopsis...

このセクションを開くには、 help getting-help を使用してください。

これは fish 自体のドキュメントと、その組み込みコマンド("builtins")に対してのみ機能します。システム上の他のコマンドについては、通常 man システムなどで独自のドキュメントが提供されています。例えば、 man ls を実行すれば、お使いのコンピュータの ls コマンドについて知ることができます。

構文ハイライト

入力中に fish が構文ハイライト(色分け)を行っていることにすぐ気づくでしょう。無効なコマンドは、デフォルトで赤色で表示されます。

> /bin/mkd

コマンドが無効である理由としては、そのコマンドが存在しないか、実行権限のないファイルを参照していることなどが考えられます。コマンドが有効になると、別の色で表示されます。

> /bin/mkdir

有効なファイルパスを入力すると、下線が表示されます。

> cat ~/somefi

これは somefi で始まるファイルが存在することを教えてくれます。入力中のフィードバックとして非常に便利です。

これらの色やその他の多くの設定は、 fish_config を実行するか、 カラー変数 を直接変更することでカスタマイズできます。

例えば、(ほぼ)すべての色付けを無効にしたい場合は次のようにします。

fish_config theme choose none

これにより "none" テーマが選択されます。すべてのテーマを確認するには次のように入力します。

fish_config theme show

単に fish_config を実行するとブラウザインターフェースが開き、利用可能なテーマから好きなものを選択できます。

オートサジェスチョン(自動提案)

入力中、fish はカーソルの右側にコマンドの候補を灰色で表示します。例:

> /bin/hostname

パスやオプションについても認識します。

> grep --ignore-case

さらに履歴も対象になります。一度コマンドを入力すれば、次からは数文字入力するだけでそのコマンドを呼び戻すことができます。

> rsync -avze ssh . myname@somelonghost.com:/some/long/path/doo/dee/doo/dee/doo

オートサジェスチョンを採用するには、 right () 、 ctrl-f を押します。オートサジェスチョンのうち単語1つ分だけを採用するには、 alt-right () を押します。提案された内容が望むものでない場合は、単に無視して入力を続けてください。

オートサジェスチョンが不要な場合は、 $fish_autosuggestion_enabled を 0 に設定することで無効にできます。

set -g fish_autosuggestion_enabled 0

タブ補完

豊富なタブ補完機能が、設定なしですぐに利用できます。

tab キーを押すと、fish はコマンド、引数、またはパスの補完を試みます。

> /pritab => /private/

候補が複数ある場合は、それらが一覧表示されます。

> ~/stuff/stab
~/stuff/script.sh  (command)  ~/stuff/sources/  (directory)

もう一度タブキーを押すと、候補を順番に切り替えることができます。括弧内の部分( "command" や "directory" など)は「補完の説明」です。それがどのような種類の引数であるかを示す短いヒントです。

fish は git のブランチなど、多くのコマンド固有の補完も行えます。

> git merge prtab => git merge prompt_designer
> git checkout btab
builtin_list_io_merge (Branch)  builtin_set_color (Branch) busted_events (Tag)

タブキーを叩いて、fish に何ができるか試してみてください!

変数

他のシェルと同様に、ドル記号に続く変数名は、その変数の値に置き換えられます。

> echo My home directory is $HOME
My home directory is /home/tutorial

これは「変数置換」と呼ばれます。ダブルクォート内でも行われますが、シングルクォート内では行われません。

> echo "My current directory is $PWD"
My current directory is /home/tutorial
> echo 'My current directory is $PWD'
My current directory is $PWD

他のシェルとは異なり、fish には変数値を設定するための標準的なコマンド set があります。set は変数名を受け取り、その後に値を指定します。

> set name 'Mister Noodle'
> echo $name
Mister Noodle

(引用符に注目してください。引用符がない場合、 MisterNoodle は別々の引数になり、$name は2つの要素を持つリストになります。)

他のシェルとは異なり、変数は置換された後に(スペースなどで)さらに分割されることはありません。

> mkdir $name
> ls
Mister Noodle

bash の場合、これは "Mister" と "Noodle" という2つのディレクトリを作成します。fish では1つだけ作成されます。変数の値は "Mister Noodle" であったため、スペースを含んだその値全体が一つの引数として mkdir に渡されたからです。

変数を消去(または「削除」)するには、 -e--erase を使用します。

> set -e MyVariable
> env | grep MyVariable
(no output)

詳細は 変数の展開 を参照してください。

エクスポート(シェル変数)

設定値などとして、外部コマンドから変数を利用可能にしたい場合があります。例えば、 gitman といった多くのプログラムは、好みのページャ(テキストをスクロール表示するプログラム)を特定するために $PAGER 変数を読み取ります。このように使われる変数には、他に $BROWSER$LANG (言語設定)、$PATH などがあります。これらはすべて大文字で書かれていますが、これは単なる慣習です。

変数を外部コマンドに渡すには、その変数を「エクスポート」する必要があります。これを行うには、 set--export または単に -x フラグを付けます。

> set -x MyVariable SomeValue
> env | grep MyVariable
MyVariable=SomeValue

また、 --unexport-u でエクスポートを解除することもできます。

これは逆方向にも機能します! fish が他のプロセスから起動された場合、親プロセスのエクスポートされた変数を継承します。例えば、ターミナルエミュレータが fish を起動し、そのターミナルが $LANGen_US.UTF-8 としてエクスポートしていれば、fish はその設定を受け取ります。そして、ターミナルエミュレータを起動したものもまた、明示的に拒否しない限り、ターミナルに変数を受け渡しています。このようにして、fish は通常 $LANG$PATH$TERM といった値を、あなたが再指定することなく受け取っています。

エクスポートされた変数は、ローカル、グローバル、またはユニバーサルのいずれかになります。「エクスポート」は スコープ ではありません! 通常は set -gx MyVariable SomeValue のようにしてグローバル変数として作成します。

詳細は 変数のエクスポート を参照してください。

リスト

上記の set コマンドでは、クォートを使用することで Mister Noodle が1つの引数として扱われるようにしています。もしこれが2つの引数であったなら、name は長さ 2 のリストになっていたでしょう。実のところ、 fish の変数はすべてリストであり、任意の数の値を持たせることも、値を一つも持たせないことも可能です。

$PWD のように値を一つしか持たない変数もあります。慣習的にその変数の「値」と呼びますが、実際にはその「最初で唯一の」値を指しています。

一方で、 $PATH のように実際に複数の値を持つ変数もあります。変数展開の際、その変数は展開されて複数の引数になります。

> echo $PATH
/usr/bin /bin /usr/sbin /sbin /usr/local/bin

名前が "PATH" で終わる変数は、自動的にコロンで分割されてリストになります。外部コマンド(サブプロセス)にエクスポートされる際は、コロンで結合されます。これは、 $PATH がコロン区切りであることを期待する他のツールとの互換性を保つためです。この挙動(quirk)は、 set --path で明示的に変数に追加したり、set --unpath で削除したりすることもできます。

リストに他のリストを含めることはできません。つまり、再帰構造は存在しません。変数は「文字列のリスト」である、それだけのことです。

リストの長さ(要素数)を取得するには count を使用します。

> count $PATH
5

追加の引数を指定して自分自身を再設定することで、リストに要素を追記(または先頭に追加)できます。ここでは、 $PATH/usr/local/bin を追記しています。

> set PATH $PATH /usr/local/bin

角括弧(スクエアブラケット)を使用して、個々の要素にアクセスできます。インデックスは先頭から数える場合は 1 から始まり、末尾から数える場合は -1 から始まります。

> echo $PATH
/usr/bin /bin /usr/sbin /sbin /usr/local/bin
> echo $PATH[1]
/usr/bin
> echo $PATH[-1]
/usr/local/bin

「スライス」と呼ばれる、要素の範囲にアクセスすることもできます。

> echo $PATH[1..2]
/usr/bin /bin
> echo $PATH[-1..2]
/usr/local/bin /sbin /usr/sbin /bin

for ループを使って、リスト(またはスライス)を反復処理できます。

for val in $PATH
  echo "entry: $val"
end
# Will print:
# entry: /usr/bin/
# entry: /bin
# entry: /usr/sbin
# entry: /sbin
# entry: /usr/local/bin

特筆すべき点として、リストを ブレース展開 のように使用できることがあります。リストに別の文字列を繋げると、リストの各要素とその文字列が結合されます。

> set mydirs /usr/bin /bin
> echo $mydirs/fish # this is just like {/usr/bin,/bin}/fish
/usr/bin/fish /bin/fish

これはまた、リストが空の場合、引数が存在しなくなることも意味します。

> set empty # no argument
> echo $empty/this_is_gone # prints an empty line

リストを引用符で囲むと、一つの文字列として扱われるため、たとえリストが空であっても一つの引数となります。

詳細は リスト を参照してください。リストと文字列(あるいは他のリスト)の結合についての詳細は、直積展開 および 変数の展開 を参照してください。

ワイルドカード

fish はおなじみのワイルドカード * をサポートしています。すべての JPEG ファイルを一覧表示するには次のようにします。

> ls *.jpg
lena.jpg
meena.jpg
santa maria.jpg

複数のワイルドカードを含めることもできます。

> ls l*.p*
lena.png
lesson.pdf

再帰的ワイルドカード ** は、ディレクトリを再帰的に検索します。

> ls /var/**.log
/var/log/system.log
/var/run/sntp.log

ディレクトリの走査(トラバーサル)に時間がかかりすぎている場合は、 ctrl-c で中断できます。

詳細は ワイルドカード を参照してください。

パイプとリダイレクト

通常の垂直バー(パイプ記号)を使って、コマンド間でパイプラインを作成できます。

> echo hello world | wc
      1       2      12

標準入力(stdin)と標準出力(stdout)は、おなじみの <> でリダイレクトできます。標準エラー出力(stderr)は 2> でリダイレクトします。

> grep fish < /etc/shells > ~/output.txt 2> ~/errors.txt

標準出力と標準エラー出力を一つのファイルにまとめてリダイレクトするには、 &> を使用します。

> make &> make_output.txt

詳細は 入出力リダイレクト および パイプ を参照してください。

コマンド置換

コマンド置換は、あるコマンドの出力を別のコマンドの引数として使用します。他のシェルとは異なり、fish はコマンド置換にバッククォート( `` )を使用しません。代わりに、ドルの有無にかかわらず括弧を使用します。

> echo In (pwd), running $(uname)
In /home/tutorial, running FreeBSD

よく使われる慣用句(イディオム)は、コマンドの出力を変数に格納することです。

> set os (uname)
> echo $os
Linux

ドルなしのコマンド置換は引用符内では展開されないため、ドル付きのバージョンの方がシンプルです。

> touch "testing_$(date +%s).txt"
> ls *.txt
testing_1360099791.txt

他のシェルとは異なり、fish はコマンド置換の結果を任意の空白(スペースやタブなど)で分割せず、改行でのみ分割します。Unix コマンドは行単位で動作することが多いため、通常これは大きな助けになります。ただし、 pkg-config のように「本来複数の引数であるべきものを1行にまとめて出力する」コマンドでは問題になることがあります。スペースでも分割したい場合は、 string split を使用してください。

> printf '%s\n' (pkg-config --libs gio-2.0)
-lgio-2.0 -lgobject-2.0 -lglib-2.0
> printf '%s\n' (pkg-config --libs gio-2.0 | string split -n " ")
-lgio-2.0
-lgobject-2.0
-lglib-2.0

コマンド置換の出力を(改行による分割も行わず)一つの引数として扱いたい場合は、引用符で囲んだコマンド置換を使用してください。

> echo "first line
second line" > myfile
> set myfile "$(cat myfile)"
> printf '|%s|' $myfile
|first line
second line|

詳細は コマンド置換 を参照してください。

コマンドの区切り(セミコロン)

他のシェルと同様に、fish では複数のコマンドを別々の行に書くことも、同じ行に書くこともできます。

同じ行に書く場合は、セミコロン( ";" )を使用します。つまり、以下の2つの例は等価です。

echo fish; echo chips

# or
echo fish
echo chips

これは対話的に複数のコマンドを入力する際に便利です。スクリプト内では、別々の行に書いた方が読みやすくなります。

終了ステータス

コマンドが終了すると、非負の整数(0以上の整数)としてステータスコードを返します。

他のシェルとは異なり、fish は直前のコマンドの終了ステータスを $? ではなく $status に格納します。

> false
> echo $status
1

これはコマンドの結果を示します。通常、0 は成功を意味し、それ以外は何らかの失敗を意味します。例えば、fish の set --query は、照会した変数のうち設定されていなかったものの数を返します。set --query PATH は通常 0 を返し、 set --query arglbargl boogagoogoo は通常 2 を返します。

また、パイプ内の各プロセスの終了ステータス [1] を保持するリスト変数 $pipestatus もあります。

詳細は status 変数 を参照してください。

結合構文 (And, Or, Not)

fish は、コマンドを組み合わせるためのおなじみの &&|| 、および否定の ! をサポートしています。

> ./configure && make && sudo make install

ここで、 make./configure が成功(0 を返却)した場合のみ実行され、 sudo make install./configuremake の両方が成功した場合のみ実行されます。

fish は andornot もサポートしています。最初の2つはジョブ修飾子であり、優先順位が低くなっています。使用例:

> cp file1 file1_bak && cp file2 file2_bak; and echo "Backup successful"; or echo "Backup failed"
Backup failed

セミコロンのセクション で述べたように、これは次のように複数行で書くこともできます。

cp file1 file1_bak && cp file2 file2_bak
and echo "Backup successful"
or echo "Backup failed"

条件文 (If, Else, Switch)

コマンドの終了ステータスに基づいてコードを条件付きで実行するには、 ifelse を使用します。

if grep fish /etc/shells
    echo Found fish
else if grep bash /etc/shells
    echo Found bash
else
    echo Got nothing
end

文字列や数値の比較、またはファイル属性のチェック(ファイルが存在するか、書き込み可能かなど)を行うには、次のように test を使用します。

if test "$fish" = "flounder"
    echo FLOUNDER
end

# or

if test "$number" -gt 5
    echo $number is greater than five
else
    echo $number is five or less
end

# or

# This test is true if the path /etc/hosts exists
# - it could be a file or directory or symlink (or possibly something else).
if test -e /etc/hosts
    echo We most likely have a hosts file
else
    echo We do not have a hosts file
end

結合構文 を使って、次のようなより複雑な条件を作ることもできます。

if command -sq fish; and grep fish /etc/shells
    echo fish is installed and configured
end

さらに複雑な条件の場合は、 beginend を使って部分的にグループ化します。

また、 switch コマンドもあります。

switch (uname)
case Linux
    echo Hi Tux!
case Darwin
    echo Hi Hexley!
case FreeBSD NetBSD DragonFly
    echo Hi Beastie!
case '*'
    echo Hi, stranger!
end

見ての通り、 case はフォールスルー(次のケースへ続けて実行すること)をせず、複数の引数や(引用符で囲まれた)ワイルドカードを受け入れることができます。

詳細は 条件文 を参照してください。

関数

fish の関数はコマンドのリストであり、オプションで引数を取ることができます。他のシェルとは異なり、引数は $1 のような「番号付き変数」ではなく、単一のリスト $argv として渡されます。関数を作成するには、組み込みコマンドの function を使用します。

function say_hello
    echo Hello $argv
end
say_hello
# prints: Hello
say_hello everybody!
# prints: Hello everybody!

他のシェルとは異なり、fish にはエイリアス(別名)やプロンプト専用の特殊な構文はありません。代わりに関数がその役割を担います [2]

組み込みコマンドの functions (複数形であることに注意!)を使えば、すべての関数の名前を一覧表示できます。fish には最初から多くの関数が用意されています。

> functions
N_, abbr, alias, bg, cd, cdh, contains_seq, dirh, dirs, disown, down-or-search, edit_command_buffer, export, fg, fish_add_path, fish_breakpoint_prompt, fish_clipboard_copy, fish_clipboard_paste, fish_config, fish_default_key_bindings, fish_default_mode_prompt, fish_git_prompt, fish_hg_prompt, fish_hybrid_key_bindings, fish_indent, fish_is_root_user, fish_job_summary, fish_key_reader, fish_md5, fish_mode_prompt, fish_npm_helper, fish_opt, fish_print_git_action, fish_print_hg_root, fish_prompt, fish_sigtrap_handler, fish_svn_prompt, fish_title, fish_update_completions, fish_vcs_prompt, fish_vi_cursor, fish_vi_key_bindings, funced, funcsave, grep, help, history, hostname, isatty, kill, la, ll, ls, man, nextd, open, popd, prevd, prompt_hostname, prompt_pwd, psub, pushd, realpath, seq, setenv, suspend, trap, type, umask, up-or-search, vared, wait

関数の名前を functions に渡すことで、その関数のソースコードを確認できます。

> functions ls
function ls --description 'List contents of directory'
    command ls -G $argv
end

詳細は 関数 を参照してください。

ループ

while ループ:

while true
    echo "Loop forever"
end
# Prints:
# Loop forever
# Loop forever
# Loop forever
# yes, this really will loop forever. Unless you abort it with ctrl-c.

for ループは、リストを反復処理するために使用できます。例えば、ファイルのリストなどです。

for file in *.txt
    cp $file $file.bak
end

数値のリストを反復処理するには、 seq を使用します。

for x in (seq 5)
    touch file_$x.txt
end

詳細は ループとブロック を参照してください。

プロンプト

他のシェルとは異なり、 PS1 のようなプロンプト用の変数はありません。プロンプトを表示するために、fish は fish_prompt 関数を実行し、その出力をプロンプトとして使用します。また、 fish_right_prompt 関数が存在すればそれも実行し、その出力を右プロンプトとして使用します。

コマンドラインから独自のプロンプトを定義することもできます。

> function fish_prompt; echo "New Prompt % "; end
New Prompt % _

作成したプロンプトが気に入ったら、 funcsave fish_prompt と入力してディスクに保存できます。これにより、プロンプトが ~/.config/fish/functions/fish_prompt.fish に保存されます。(あるいは、最初から手動でそのファイルを作成することも可能です。)

複数行のプロンプトも可能です。色は set_color を使い、名前付きの ANSI カラーや 16 進数の RGB 値を渡すことで設定できます。

function fish_prompt
    set_color purple
    date "+%m/%d/%y"
    set_color FF0000
    echo (pwd) '>' (set_color --reset)
end

このプロンプトは次のようになります。

02/06/13
/home/tutorial > _

詳細は プロンプトの作成 を参照してください。

fish_config を実行して Web UI 上で、あるいはターミナル内で簡潔に設定できる fish_config prompt を実行して、サンプルの中からプロンプトを選ぶこともできます。

$PATH

$PATH は、fish がコマンドを検索するディレクトリ群を含む環境変数です。他のシェルとは異なり、 $PATH はコロン区切りの文字列ではなく リスト です。

fish は $PATH をデフォルト値に設定しようとしますが、通常は fish の親プロセスから継承され、そのシステムに適した値になっています。詳細は エクスポート を参照してください。

$PATH の先頭に /usr/local/bin/usr/sbin を追加するには、次のように記述します。

> set PATH /usr/local/bin /usr/sbin $PATH

$PATH から /usr/local/bin を削除するには、次のように記述します。

> set PATH (string match -v /usr/local/bin $PATH)

他のシェルや外部コマンドとの互換性のため、 $PATHパス変数 として扱われます。そのため、引用符で囲んだ場合は(スペースではなく)コロンで結合されます。

> echo "$PATH"
/usr/local/sbin:/usr/local/bin:/usr/bin

エクスポートされる際もその形式(コロン区切り)になります。逆に fish の起動時には、受け取った $PATH をコロンで分割してリストにします。

他のシェルの .profile と同様に、 config.fish 内で直接設定することも可能です。こちらの例 を参照してください。

より素早い方法は、 fish_add_path 関数を使用することです。これは指定されたディレクトリがまだ含まれていない場合のみ、パスに追加します。具体的には、 $PATH の先頭に自動で付与される ユニバーサル変数$fish_user_paths を書き換えます。例えば、 /usr/local/bin を恒久的に $PATH に追加するには次のように記述します。

> fish_add_path /usr/local/bin

利点は、設定ファイルをいじくり回す必要がないことです。コマンドラインで一度実行するだけで、現在のセッションだけでなく将来起動するすべてのインスタンスにも反映されます。また、この関数は必要な場合のみ要素を追加するため、この行を config.fish に記述しておくこともできます。

あるいは $fish_user_paths を自分で変更することもできますが、 config.fish の中で無条件に要素を追記(append)しないよう注意してください。さもないと、起動するたびにパスがどんどん長くなってしまいます。

起動時の設定 (.bashrc はどこ?)

fish は起動時に ~/.config/fish/config.fish 内のコマンドを実行します。ファイルが存在しない場合は作成してください。

前述のコマンドを使って、 config.fish ファイル内で直接関数や変数を作成することが可能です。例:

> cat ~/.config/fish/config.fish

set -x PATH $PATH /sbin/

function ll
    ls -lh $argv
end

しかし、オートロード関数(autoloading functions)とユニバーサル変数を使用するほうが、より一般的で効率的です。

設定を整理したい場合、fish は ~/.config/fish/conf.d/ にある .fish ファイル群も読み込みます。詳細は 設定ファイル を参照してください。

オートロード関数

fish は未知のコマンドに出会うと、 ~/.config/fish/functions/ ディレクトリ内からそのコマンド名と同じ名前のファイルを探し、関数としてオートロードしようとします。

例えば、 ll という関数を使いたい場合は、 ll.fish というテキストファイルを ~/.config/fish/functions に追加します。

> cat ~/.config/fish/functions/ll.fish
function ll
    ls -lh $argv
end

これは、プロンプトを定義する際にも推奨される方法です。

> cat ~/.config/fish/functions/fish_prompt.fish
function fish_prompt
    echo (pwd) "> "
end

これらのファイルを自動で作成する方法については funced および funcsave を、ファイルの場所を制御する方法については $fish_function_path を参照してください。

ユニバーサル変数

ユニバーサル変数は、現在および将来のすべての fish インスタンス間で共有される変数です。再起動後も値は保持されます。 set -U を使うことで変数をユニバーサルにできます。

> set -U EDITOR vim

別のシェル(ターミナルの別のウィンドウなど)で確認すると:

> echo $EDITOR
vim

ユニバーサル変数は、対話的に一度設定するだけで十分です。 設定ファイル に記述し直す必要はありません。詳細は ユニバーサル変数 を参照してください。

さらに詳しく知るには

fish についてより深く学びたい場合は、 詳細なドキュメント が豊富に用意されているほか、公式 Gitter チャンネル公式メーリングリスト 、 および GitHub ページ があります。