Fish3.0変更点

# まえがき

Fishシェルがメジャーバージョンアップしたので[CHANGELOG](https://github.com/fish-shell/fish-shell/blob/master/CHANGELOG.md)を意訳しました。
fish 3.0b1(ベータ版）〜3.0.2までになります。
正確なところは[元の文章](https://github.com/fish-shell/fish-shell/blob/master/CHANGELOG.md)を参照してください。

2.9系からの主な変更点は[3.0ベータ1](https://qiita.com/drafts/f7eabc9bd74d2a523ee2/edit#fish-30b1-released-december-11-2018)に記述されています。
それ以降の変更点は差分として上に追記されていく形式のようです（Changelogだからね）。

## fish 3.0.2 (released February 19, 2019)

このリリースは3.0.1で判明している問題を修正するためのものです。

### 修正および変更点

- 本当のワーキングディレクトリが取得できない場合、PWD環境変数を無視します。エディタやIDEのターミナルにおける奇妙な現象が改善されます。 ([#5647](https://github.com/fish-shell/fish-shell/issues/5647)).

2.7.1以前のバージョンからアップグレードする場合は3.0b1, 3.0.0, 3.0.1の変更点を確認してください。

---

## fish 3.0.1 (released February 11, 2019)

このリリースは3.0.0で判明した大きな問題を修正するためのものです。

### 修正および変更点

- `exec`はフォアグラウンドジョブが動作していても実行されるようになりました ([#5449](https://github.com/fish-shell/fish-shell/issues/5449))（注：関数内でexecしたときに関数をジョブと判定してexecの実行がキャンセルされていたようだ）
- whileループはループ内で最後に実行されたコマンドの終了ステータスを返すようになりました（ループが空の場合は0）。これはPOSIXに準拠します。 ([#4982](https://github.com/fish-shell/fish-shell/issues/4982))
- 非対話スクリプトで `read --silent` は端末への出力を行わなくなりました ([#5519](https://github.com/fish-shell/fish-shell/issues/5519))
- MacでPATH一覧を取得する先として `/etc/paths` と `/etc/paths.d` どちらも参照するようになりました。 `MANPATH` が `/etc/manpaths` と `/etc/manpaths.d` 見るのと同様です ([#5481](https://github.com/fish-shell/fish-shell/issues/5481))
- Cygwin/MSYS2 で実行できるようになりました ([#5426](https://github.com/fish-shell/fish-shell/issues/5426))
- ページャーにフォーカスがないときの検索フィールドで `pager-toggle-search` バインディング (デフォルトはCtrl-S) が有効になりました。
- コマンドがないときのエラー出力は、引数を含めたすべてではなく、コマンドに対して1度だけ出力されるようになりました ([#5588](https://github.com/fish-shell/fish-shell/issues/5588))
- Gitコマンドの補完が修正・改善されました。古いGitでもパスの補完が正しく行われます。曖昧一致が修正されました。（`:/`で始まる）絶対パスでの補完を不必要に行わないようにしました([#5578](https://github.com/fish-shell/fish-shell/issues/5578), [#5574](https://github.com/fish-shell/fish-shell/issues/5574), [#5476](https://github.com/fish-shell/fish-shell/issues/5476))。シェルのエイリアスを使用しないようにしました。冒険的なユーザーがラッパーコマンドをセットアップできるようになりました (`set -g __fish_git_alias_$command $whatitwraps` を使用) ([#5412](https://github.com/fish-shell/fish-shell/issues/5412))
- シェルのよく使われる関数のパフォーマンス向上 ([#5447](https://github.com/fish-shell/fish-shell/issues/5447)) と `kill` コマンドの補完のパフォーマンス向上 ([#5541](https://github.com/fish-shell/fish-shell/issues/5541))
- シンボリックリンクのディレクトリ上で起動されたときの動作が修正されました ([#5525](https://github.com/fish-shell/fish-shell/issues/5525))
- 標準の `fish_title` 関数は余分なスペースを含まなくなりました ([#5517](https://github.com/fish-shell/fish-shell/issues/5517))
- `nim` プロンプトがブラウザ上の設定画面で選択されたとき正常に動作するようになりました ([#5490](https://github.com/fish-shell/fish-shell/issues/5490))
- `string` 関数のヘルプが標準エラーに出力されるようになりました ([#5495](https://github.com/fish-shell/fish-shell/issues/5495))
- viバインディングでCPUを食い尽くすことがなくなりました([#5528](https://github.com/fish-shell/fish-shell/issues/5528))
- 異常終了する問題をいくつか修正しました ([#5550](https://github.com/fish-shell/fish-shell/issues/5550), [#5548](https://github.com/fish-shell/fish-shell/issues/5548), [#5479](https://github.com/fish-shell/fish-shell/issues/5479), [#5453](https://github.com/fish-shell/fish-shell/issues/5453))
- ドキュメントを改善しました。

### 既知の問題

リリース時には判明していなかった重要な問題があります。

- fishは Windows Services for Linux Windows 10 version 1809/17763以前では実行できません。また警告も表示されません ([#5619](https://github.com/fish-shell/fish-shell/issues/5619))

2.7.1以前のバージョンからアップグレードする場合は3.0b1, 3.0.0の変更点を確認してください。


# fish 3.0.0 (released December 28, 2018)

3.0b1からの差分は以下の通り。

- musl libcでビルドできるようになりました ([#5407](https://github.com/fish-shell/fish-shell/issues/5407))
- `test`コマンドの巨大な数字の扱いが正しくなりました ([#5414](https://github.com/fish-shell/fish-shell/issues/5414))
- 履歴のカラー表示を削除しました。正しくなかったので。

リリース時に判明している重要な課題は以下です。

- Cygwinでビルドはできるけど([#5423](https://github.com/fish-shell/fish-shell/issues/5423))、動きません ([#5426](https://github.com/fish-shell/fish-shell/issues/5426))。 実行するとターミナルがハングします。Cygwinをお使いの方は問題が解決するまで2.7.1をご利用ください。

# fish 3.0b1 (released December 11, 2018)

fish3はメジャーリリースであり機能改善とともに破壊的変更を含みます。既存のスクリプトのほとんどはそのまま動作するはずですが以下の変更点を確認してください。

## 主な非互換の変更

-  プロセスとジョブ展開はほぼ取り除かれました。`%`はカレントシェルのPIDを示す`%self`以外展開されません。ジョブ制御コマンドたち（`disown`,`wait`,`bg`,`fg`,`kill`)は`%`で始まるジョブ指定子を展開します。
- 配列の複数の要素を一度にセットする `set x[1] x[2] a b` が正しい構文ではなくなりました。
- 単体のリテラル`{}`は `{}` という文字列自身に展開されます。これによって`find -exec`の利用が簡単になります。
- 配列の0番目へのアクセスは許可されなくなりました。(fishのインデックスは1スタートです）
- ブレース展開中の連続したカンマの扱いはより自然なものになりました。例えば`{,,,}`は1個の空文字ではなく4個の空文字へと展開されます。
- `for`ループを制御するための変数は`for`ブロックのローカル変数ではなくなりました。
- `if`と`while`のブロックの中から外側の変数を変更できるようになりました。
- ローカルのエクスポートされた変数を関数内から参照できるようになりました。
- 組み込みの`math`コマンドは論理演算子をサポートしなくなりました。`test`コマンドを使用してください。
- 範囲展開に正の整数と負の整数を適用したとき(`$foo[5..-1]` ないし `$foo[-1..5]`)の挙動がいい感じになりました。リストの項目数が与えられた数より少ない場合にも方向を変更せずに存在するインデックスへ調節されます（訳注:わかるようなわからんような…）
    - 原文:Range expansion will now behave sensibly when given a single positive and negative index (`$foo[5..-1]` or `$foo[-1..5]`), clamping to the last valid index without changing direction if the list has fewer elements than expected.
- `read`の`-s`は`--silent`の短縮形の意味になりました（bash準拠)。`--shell`の短縮形は`-S`になります。
- 他のシェルにあわせて`cd`はsymlinkを解決しなくなりました。
- `source`にターミナルから入力したい場合は`-`が必要になりました。
- `end`コマンドに引数を与えるとエラーになるようになりました。
- `argparse`, `read`, `set`, `status`, `test`, `[` は予約語になり関数名として許容されなくなりました。これにより意図せず既存のコマンドを上書きすることを予防します。
- `fish_user_abbreviations`変数を使用しなくなりました。略語は自動的に新しい保存形式へ変換されます
- `FISH_READ_BYTE_LIMIT`変数は`fish_byte_limit`に変更されました。
- 環境変数は起動時に配列に展開されなくなりました。ただし変数名がPATHで終わる場合はコロン`:`で分割されます。
- `history`コマンドの`--with-time`オプションは削除されました。これは2.7.0から`--show-time`に置き換えられています。([#4403](https://github.com/fish-shell/fish-shell/issues/4403))
- 内部変数`__fish_datadir`と`__fish_sysconfdir`は、`__fish_data_dir`と`__fish_sysconf_dir`に置き換えられます。


## 非推奨になった機能

fish 3のリリースに際して多数の機能が将来的に削除されることになりました。ユーザーには代替の機能を利用することをおすすめします。少数の機能はフィーチャーフラグによってデフォルトでは無効になっています。

フューチャーフラグ機構は破壊的変更と機能削除のテスト用に追加されました。フィーチャーフラグは起動プション`fish --features ...`またはユニバーサル変数`fish_features`によって設定できます。

- `read`コマンド用の`IFS`変数は廃止されます。`read --delimiter`を使用してください。
- `function --on-process-exit`は廃止されます。`fish_exit`を使用してください（`function --on-event fish_exit`のように使います）
- `$_`は廃止されます。`status current-command`に置き換えてください。
- 標準エラーへリダイレクトするための`^`は廃止されます。`2>`を使用してください。フィーチャーフラグ`stderr-nocaret`によって切り替えることができます。
- グロブの`?`(ワイルドカード)は廃止されます。フィーチャーフラグ`qmark-noglob`によって切り替えることができます。

## 特筆すべき修正と改善
### シンタックスの変更と新しいコマンド
- POSIX互換シェルから移行しやすくするため、`&&` (`and`と同等)、 `||` (`or`と同等)、 `!` (`not`と同等) が使えるようになりました ([#4620](https://github.com/fish-shell/fish-shell/issues/4620))。
- 変数をコマンドとして使用できるようになりました（訳注:たとえば`set filelist ls;$filelist`とすると`ls`が実行できるようになる) 
- `fish --private`でプライベートモードになります。プラーベートモードではコマンド履歴ファイルにアクセスしませんし、あらゆるコマンドは他のセッションに影響しません（訳注:たぶんユニバーサル変数とかのことを言っている）。スクリプト中ではセッション変数`$fish_private_mode`によってプライベートモードかどうか判定できます。
- コマンドをバックグラウンドで実行して終了を待つ`wait`コマンドが追加されました。
- `math`コマンドは`bc`コマンドのラッパーではなく完全な組み込みコマンドになりました。数値はデフォルトで浮動小数点数として計算されます。`--scale`オプションによって制御可能です。
- `$PATH`に存在しないディレクトリを指定しても警告が出なくなりました。
- `while`の中身が実行されなかった場合に`$status`に非ゼロ値をセットするようになりました。
- コマンド置換で扱える出力の上限がデフォルトで10MBになりました。`fish_read_limit`変数によって変更できます。メモとして、この変数をOSの引数の限界以上に設定した場合、外部コマンドに渡してもうまく実行できません。
- マシンのホスト名が変数`$hostname`に設定されます。`hostname`に依存しません。
- config.fish中から直接`bind`を呼び出せるようになりました。`fish_user_key_bindings`関数を実行する必要はありません。が、現在のところ呼び出すことはできます。
- `%self`と`%last`は`$fish_pid`と`$last_pid`に置き換えられました。

### コマンドの新しいフィーチャー
- `alias`に関数として保存するための`--save`オプションが追加されました。
- `bind`に現在のターミナルで指定したキーがバインドできない場合のエラーを出力しない`--silent`オプションが追加されました。
- `complete`に自動的に生成された引数リストがアルファベット順ではなく同じ順序を保つようにするための`--keep-order`オプションが追加されました。
- バックグラウンドジョブが実行中の場合`exec`が警告を出すようになりました。
- `funced`に編集が成功した場合自動的に保存する`--saved`オプションが追加されました。
- `function`に登録済みのイベントハンドラを表示する`--handlers`オプションが追加されました。
- `history search`はワイルドカード検索にグロブパターンを使用するようになりました。また`--reverse`オプションでソート順を切り替え(古い/新しい順)ることができます。
- `jobs`コマンドに黙って動作する`--quiet`オプションが追加されました。
- `read`コマンドに入力を配列に分割する`--dewlimiter`オプションが追加されました。
- `read`コマンドは引数がなかったとき入力を標準出力に直接出力するようになりました。
- `read`コマンドに入力を消費せずに行を読み込む`--line`オプションが追加されました。（訳注:どういうこと？）
- `set` に新しく `--append` と `--prepend` オプションが追加されました ([#1326](https://github.com/fish-shell/fish-shell/issues/1326))。
- `set`コマンドに変数の詳細を表示する`--show`オプションが追加されました。
- `string match`に空のパターンと`--entire` オプションを指定したときグロブモードでは全体にマッチするようになりました。
- `string split`に`--no-empty`オプションが追加されました。処理結果から空文字が除去されます。
- `string`コマンドにヌル区切り出力するサブコマンドとして`split0`と`join0`が追加されました。
- `string`コマンドはテキスト中にヌル文字があっても処理を停止しなくなりました。
- `string escape`コマンドに`--style regex`オプションが追加されました。正規表現用にエスケープできます。
- `test`コマンドで浮動小数点数が使えるようになりました。

### インタラクティブな改善
- 行末にパイプがあるとき次の行にジョブを継続するようになりました。（訳注:入力の話？パイプで渡せるの？）
    - A pipe at the end of a line now allows the job to continue on the next line ([#1285](https://github.com/fish-shell/fish-shell/issues/1285)).
- OSXのTerminal.appとiTermで斜体とdim（訳注:書体？色？）をサポートするようになりました。
- `cd`のタブ補完で深すぎるパスへ下降しないようになりました。
- ページャーの操作が改善されました。特に一番上から上方向に移動したとき一番下にジャンプするようになりました。左右キーを押したときも下端・上端をループするようになりました。
- タブ補完が略語(abbrコマンド)も利用するようになりました ([#3233](https://github.com/fish-shell/fish-shell/issues/3233))
- 補完ページャが表示されているとき通常の文字を入力しても検索フィールドを表示しなくなりました。
- 入力バインディング`pager-toggle-search`が追加されました。補完時のページャ表示を切り替えます。デフォルトではCtrl-Sに割り当てられています。
- ページャーの検索が完全にファジー検索を行うようになりました。
- 補完結果が長いときページャーで表示するようになりました（訳注:超意訳。本当か？）
    - The pager will now show the full command instead of just its last line if the number of completions is large ([#4702](https://github.com/fish-shell/fish-shell/issues/4702)).
- ファイル名中のチルダが補完された場合でも正しくエスケープされるようになりました。
- ラッピング補完（`complete --wraps` または `function --wraps`による）が引数を許容するようになりました（たとえばgitのサブコマンドが使えるようになります）。`alias`コマンドも同じように変更されました。
- パス補完が「展開」をサポートするようになりました。たとえば`python ~/<TAB>`のようなことが展開も利用するようになります。（訳注:変数展開とかブレース展開を考慮してパス補完すると言っている気がする）
- すでに入力済みのオプション以外を自動サジェストするようになりました。
- コマンド置換中のプロセスのクラッシュを通知するようになりました。
- ベルのあとスクリーンをリセットしなくなりました。画面が崩れにくくなります。
- vi-modeで`;`と`,`が使えるようになりました。{forward,backward}-jump-tillと repeat-jump{,-reverse}を呼び出します。
- vi-modeで`*y`が使えるようになりました。
- 標準でneovimでTrueカラーが有効になりました。
- ターミナルサイズを取得するための変数(`$COLUMNS`/`$LINES`)は`fish_prompt`が実行される前に更新されるようになりました。
- ターミナルがリサイズされたとき複数行プロンプトが折り返されなくなりました。
- クリップボードの実装に`xclip`が追加されました。
- コマンドラインが空の場合Alt-Pを押すと最後のコマンドをページネイトします。(訳注：ヒストリのこと?ターミナル出力?)
- コマンドが実行されなかったとき（訳注:typoとか？）変数`$cmd_duration`はリセットされなくなりました。
- 1文字の単語を削除した時に次の単語が一緒に削除されなくなりました。([#4747](https://github.com/fish-shell/fish-shell/issues/4747))
- 履歴検索(Alt-Up)では重複したエントリが削除されるようになりました。([#4795](https://github.com/fish-shell/fish-shell/issues/4795))
- `fish_escape_delay_ms`によるタイムアウトはエスケープキーを他のコントロール文字と同じように操作の一環として受け入れるようになり、エスケープキー操作を削除できます。(訳注: 動作を全く理解しないで訳してます)
    - 原文: The `fish_escape_delay_ms` timeout, allowing the use of the escape key both on its own and as part of a control sequence, was applied to all control characters; this has been reduced to just the escape key.
- 関数を補完したとき正しく説明を表示するようになりました([#5206](https://github.com/fish-shell/fish-shell/issues/5206))
- 以下のコマンドの補完が追加されました
  - `ansible` と `ansible-galaxy`、`ansible-playbook`、`ansible-vault` ([#4697](https://github.com/fish-shell/fish-shell/issues/4697))
  - `bb-power` ([#4800](https://github.com/fish-shell/fish-shell/issues/4800))
  - `bd` ([#4472](https://github.com/fish-shell/fish-shell/issues/4472))
  - `bower`
  - `clang` and `clang++` ([#4174](https://github.com/fish-shell/fish-shell/issues/4174))
  - `conda` ([#4837](https://github.com/fish-shell/fish-shell/issues/4837))
  - `configure` (autoconfで生成されたもののみ)
  - `curl`
  - `doas` ([#5196](https://github.com/fish-shell/fish-shell/issues/5196))
  - `ebuild` ([#4911](https://github.com/fish-shell/fish-shell/issues/4911))
  - `emaint` ([#4758](https://github.com/fish-shell/fish-shell/issues/4758))
  - `eopkg` ([#4600](https://github.com/fish-shell/fish-shell/issues/4600))
  - `exercism` ([#4495](https://github.com/fish-shell/fish-shell/issues/4495))
  - `hjson`
  - `hugo` ([#4529](https://github.com/fish-shell/fish-shell/issues/4529))
  - `j` (autojumpのもの [#4344](https://github.com/fish-shell/fish-shell/issues/4344))
  - `jbake` ([#4814](https://github.com/fish-shell/fish-shell/issues/4814))
  - `jhipster` ([#4472](https://github.com/fish-shell/fish-shell/issues/4472))
  - `kitty`
  - `kldload`
  - `kldunload`
  - `makensis` ([#5242](https://github.com/fish-shell/fish-shell/issues/5242))
  - `meson`
  - `mkdocs` ([#4906](https://github.com/fish-shell/fish-shell/issues/4906))
  - `ngrok` ([#4642](https://github.com/fish-shell/fish-shell/issues/4642))
  - OpenBSD の `pkg_add`、`pkg_delete`、`pkg_info`、`pfctl`、`rcctl`、`signify`、`vmctl` ([#4584](https://github.com/fish-shell/fish-shell/issues/4584))
  - `openocd`
  - `optipng`
  - `opkg` ([#5168](https://github.com/fish-shell/fish-shell/issues/5168))
  - `pandoc` ([#2937](https://github.com/fish-shell/fish-shell/issues/2937))
  - `port` ([#4737](https://github.com/fish-shell/fish-shell/issues/4737))
  - `powerpill` ([#4800](https://github.com/fish-shell/fish-shell/issues/4800))
  - `pstack` ([#5135](https://github.com/fish-shell/fish-shell/issues/5135))
  - `serve` ([#5026](https://github.com/fish-shell/fish-shell/issues/5026))
  - `ttx`
  - `unzip`
  - `virsh` ([#5113](https://github.com/fish-shell/fish-shell/issues/5113))
  - `xclip` ([#5126](https://github.com/fish-shell/fish-shell/issues/5126))
  - `xsv`
  - `zfs` と `zpool` ([#4608](https://github.com/fish-shell/fish-shell/issues/4608))
- 補完の改善多数（特に`darcs`,`git`,`hg`,`sudo`）
- 　`yarn`と`npm`の補完を完全に使用するためにNPMモジュール`all-the-package-names`が必要になりました。
- `bower`、`yarn`の補完を完全に使用するために`jq`が必要になりました。
- フランス語の翻訳を改善しました。

### その他修正と改善
- `abbr`、変数の設定、関数の実行、グロブ、`string`の標準入力読み込み、ヒストリのスライスアクセス、のパフォーマンスが改善されました。
- Fish組み込みのwcwidth関数が新しいUnicodeに合わせて更新されました。いくつかの文字の幅は変数`fish_ambiguous_width`と`fish_emoji_width`によって変更できます。かわりとしてビルド時の`INTERNAL_WCWIDTH`オプションが追加されました。これはシステムのwcwidthを上書きします。
- `functions`の`--description`の短縮形として`-d`が追加されました。
- OSXのbashの`path_helper`のように`/etc/paths`をパースするようになりました。
- `for`で読み込み専用の変数を使用した時にエラーが起こるようになりました。
- ユニバーサル変数のファイル名にホスト名とMACアドレスを含まないようになりました。固定のパス`.config/fish/fish_variables`になります。
- グローバル/ユニバーサルスコープのエクスポート済変数はローカル変数のエクスポート状態の影響を受けません([#2611](https://github.com/fish-shell/fish-shell/issues/2611))
    - (訳注：実際どうなるんでしょうか)
- ターミナルとジョブ管理からバグを取り除くために大幅な変更を行いました([#3805](https://github.com/fish-shell/fish-shell/issues/3805), [#3952](https://github.com/fish-shell/fish-shell/issues/3952), [#4178](https://github.com/fish-shell/fish-shell/issues/4178), [#4235](https://github.com/fish-shell/fish-shell/issues/4235), [#4238](https://github.com/fish-shell/fish-shell/issues/4238), [#4540](https://github.com/fish-shell/fish-shell/issues/4540), [#4929](https://github.com/fish-shell/fish-shell/issues/4929), [#5210](https://github.com/fish-shell/fish-shell/issues/5210))
- man pageからの補完生成を改善しました([#2937](https://github.com/fish-shell/fish-shell/issues/2937), [#4313](https://github.com/fish-shell/fish-shell/issues/4313))
- `suspend --force`が正しく動作するようになりました([#4672](https://github.com/fish-shell/fish-shell/issues/4672))
- スクリプト実行中にCtrl-Cが押された場合、確実にfishを終了するようになりました([#5253](https://github.com/fish-shell/fish-shell/issues/5253))

### 頒布者と開発者向け情報
- fishはCMakeでビルドされるようになりました。最低でもCMake 3.2が必要になります。autotoolsによるMakefileとXcodeプロジェクトはこのリリースに含まれますが、近い将来削除されます。すべての頒布者と開発者はただちにCMakeでのビルドに移行してください。
- ビルドスクリプトからBash依存が削減され多くの環境でBashが不要になりました。
- fishの実行にhostnameコマンドが不要になりました。