fishでグローバルエイリアスっぽいもの

## tl;dr

zshのプラグイン[momo-lab/zsh-abbrev-alias](https://github.com/momo-lab/zsh-abbrev-alias)を参考に，fishでグローバルエイリアスっぽい略語展開ができるプラグインを作りました．

https://github.com/ryotako/fish-global-abbreviation

![demo.gif](https://qiita-image-store.s3.amazonaws.com/0/124405/3073bccc-0f85-b36e-6307-607d46d20ccb.gif)


## はじめに

zshからfishに移行したときに不便だと思ったことの一つに，グローバルエイリアスが使えなくなったことがあります．

```zsh
# fishでこういうことがしたい
alias -g G='| grep'
alias -g L='| less'
```

実際，fishでグローバルエイリアスを使いたい方は多いらしく，すでに様々な試みがあります．

- Enter(`\r`)にキーバインド: 
  [zshからfishに乗り換えてみた](http://qiita.com/masa0x80/items/346b4b9c0ff08205995e)
- Tab(`\t`)にキーバインド: [oh-my-fish/plugin-expand](https://github.com/oh-my-fish/plugin-expand)

今回は [zshで略語を展開する(vimのiabみたいなの)プラグイン作った](http://qiita.com/momo-lab/items/b1b1afee313e42ba687b) を参考にグローバルエイリアスっぽいものを作ってみました．

## 使い方

まずは適当なプラグインマネージャでインストールします．

```fish
fisher ryotako/fish-global-abbreviation
```

これで略語の展開，削除を行う`gabbr`というコマンドが使えるようになります．
基本的に，fish組み込みの`abbr`コマンドと同じ書式で略語の追加・確認・削除ができます．

- 略語の追加・削除
  
    ```
    gabbr --add G '| grep'
    gabbr --erase G

    gabbr G '| grep' # --add は省略可    
    ```
- 略語の確認

    ```
    gabbr --show
    gabbr # --show は省略可

    gabbr --list # 名前のみ
    gabbr --erase (gabbr --list) # 略語の全削除
    ```
- 略語の展開
    デフォルトでは，以下のように半角空白にキーバインドが設定されており，登録した単語のあとで半角空白を打つと展開されます．

    ```
    bind ' ' '__gabbr_expand; commandline -i " "'
    ```

    単語の区切りになりうる文字`;`, `>`, `<`, `(`, `)`にもキーバインドしておくともっと徹底した挙動になります．

    ```
    bind ';' '__gabbr_expand; commandline -i ";"'
    bind '>' '__gabbr_expand; commandline -i ">"'
    bind '<' '__gabbr_expand; commandline -i "<"'
    bind '(' '__gabbr_expand; commandline -i "("'
    bind ')' '__gabbr_expand; commandline -i ")"'
    ```

## ファンクションエイリアス

以前の[dotで上の階層に戻るプラグイン](http://qiita.com/ryotako/items/68c003afa365f84fe100#_reference-4094c47a26038ebad5e8)に引き続き，[アイデア](http://qiita.com/momo-lab/items/b1b1afee313e42ba687b)を拝借する形で恐縮なのですが，ファンクションエイリアスなる機能をつけました，

これは略語を展開時に評価します．

```
gabbr --function B "git symbolic-ref --short HEAD" # その時のブランチ名に展開
gabbr --function D "date +%Y/%m/%d" # その時の日付に展開
```

便利．

## fish 組み込みのabbrとの比較

上記の`gabbr`コマンドの使い方をまとめます．基本的に，組み込みの`abbr`コマンドと同じ使い方ができます．

|   |abbr|gabbr|
|:-:|:--:|:---:|
| 登録 | abbr L ls | gabbr L '&#124; less' |
| 削除 | abbr --erase  L | gabbr --erase L |
| 一覧 | abbr --show | gabbr --show |
| 一覧(名称のみ) | abbr --list | gabbr --list|
| 情報の保存先 | ユニバーサル変数 fish_user_abbreviations | ユニバーサル変数 global_abbreviations
| ファンクションエイリアス | なし | gabbr --function D 'date' 

このエントリの冒頭で挙げた，fishにおけるglobal aliasっぽいものと比較をすると

- [zshからfishに乗り換えてみた](http://qiita.com/masa0x80/items/346b4b9c0ff08205995e#%E6%9C%80%E7%B5%82%E7%9A%84%E3%81%AB%E8%87%AA%E4%BD%9C%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%81%AB)で紹介されている__execute_wrapper : 改行`\r`で展開．zshのglobal aliasに最も近い使用感．
- [oh-my-fish/plugin-expand](https://github.com/oh-my-fish/plugin-expand) : Tabで展開．補完やIMEでの変換に近い使用感．一つの略語に複数の展開先を指定でき，`peco`や`fzf`で絞り込みすることが可能．
- [ryotako/fish-global-abbreviation](https://github.com/ryotako/fish-global-abbreviation) : 空白文字で展開．組み込みの`abbr`コマンドに似せた使用感．

となります．

## おわりに

fishでglobal aliasっぽいもの，すでに色々考案されているのですが，gabbrが一つの選択肢になれば幸いです.

## 追記1

プルリクをいただきまして，略語の設定をファイルに書き出し & 読み込みする機能が追加されました！
変数`gabbr_config`にファイル名を指定すると略語の設定が書き出されます[^conf]．
これで略語設定をgit管理できるようになります．

[^conf]: デフォルトではこの変数は定義されておらず，ファイルは作られません．

```
set -U gabbr_config ~/.config/fish/.gabbr.config
```

`gabbr --reload`すると外部ファイルから設定を読み込み直すことができます．

## 追記2
zshのsuffix aliasっぽい機能を追加しました．コマンドラインの最初の単語の拡張子を見て，適当なコマンドを前置できます．オプションは`-s`をすでに使ってしまっているので，`-x (--suffix)`となります．

```
gabbr --suffix py python # test.py と打って空白を入力すると python test.py に展開される．
```

![suffix_abbreviation.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/124405/04286fef-733d-7630-c4a8-182cb7868c41.gif)