[EMCAS] Emacs起動時のタイポを補完する

#概要
Emacsを使う時に頻繁にコマンドを打ち間違えてしまうので、emacsのタイポを補完するためのshell scriptを作りました。
EMCASという単語は、

- 自分が頻繁にemacsと打ち間違えるemcas
- EMCAS: EMacs Completion and AliaS

というのが由来です。

Github:
https://github.com/708yamaguchi/EMCAS

#インストール
上記のgithubリポジトリをcloneして、スクリプトファイルをsourceしてください。

```Bash
git clone https://github.com/708yamaguchi/EMCAS.git
cd EMCAS
source emacs.aliases.bash
```

#実行例
EMCASを使って打ち間違いを補間する様子です。
![emcas.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314585/d46ba480-8494-e1d3-1579-7aa5e68c9a5f.gif)

補間できる単語の例を示します。どの単語を補間できるかは、[ソースコード](https://github.com/708yamaguchi/EMCAS/blob/master/emacs.aliases.bash)をご覧ください。

```Bash
$ ./test.sh                                                                                          
emcas 0nw hoge        -> emacs -nw hoge                                                              
eamcs -wn foo -nw     -> emacs -nw foo -nw                                                           
ema -csw -f shell     -> emacs -nw -f shell                                                          
ems                   -> emacs                                                                       
emac s-nw fuga hoge   -> emacs -nw fuga hoge                                                         
emacs fuga -nw hoge   -> emacs fuga -nw hoge                                                         
emavs -f shell -nw    -> emacs -f shell -nw                                                          
emcs hoge fuga        -> emacs hoge fuga                                                             
emsc hoge s-nw fuga   -> emacs hoge s-nw fuga
```

#やっていること
EMCASの補間で行っていることは、大きく分けて2つです。以下で詳しく説明します。

1. タイポワードリスト作成
2. タイポ置き換え関数の呼び出し

### 1. タイポワードリスト作成
emacs -nwコマンドをemacs部と-nw部に分けて考え、それぞれに対して打ち間違いそうな単語リスト（タイポワードリスト）を作ります。
[ソースコード(emacs.aliases.bash)](https://github.com/708yamaguchi/EMCAS/blob/master/emacs.aliases.bash)の中では、以下のようなタイポワードリストを作っています。

- emacs部のタイポワードリスト

```Bash
EMCAS_ALIASES=(
    eamcs
    eamsc
    ema
    ems
    emac
    emacs
    emasc
    emavs
    emcs
    emsc
)
```
- nw部のタイポワードリスト

```Bash
NW_OPTIONS=(
    c-w
    n-w
    n0w
    s-
    s-n
    s-nw
    s-w
    s-wn
    w0n
    0nw
    0wn
    0sw-
    -csw
    -nw
    -s
    -snw
    -w
    -wn
)
```

### 2. タイポ置き換え関数の呼び出し

emacsの打ち間違いがあった時、すなわち上記の`EMCAS_ALIASES`配列に含まれるコマンドが実行された時、以下のaliasに従って自作のemcas関数を呼びます。

```Bash
for ((i = 0; i < ${#EMCAS_ALIASES[@]}; i++))
do
    alias ${EMCAS_ALIASES[$i]}="emcas"
done
```

emcas関数では、第一引数が上記の`NW_OPTIONS`配列に含まれていれば-nw部のタイポだと判定し、emacs -nwと補間します(下のelif節)。
そうでない場合は-nw部のタイポが存在しないと判定し、引数をそのままemacsコマンドに渡します。

```Bash
function emcas(){
    if [ $# -eq 0 ]; then
        COMMAND="emacs"
    elif echo "${NW_OPTIONS[@]}" | grep '\'$1 > /dev/null; then
        COMMAND="emacs -nw ${@:2}"
    else
        COMMAND="emacs ${@:1}"
    fi
    # if EMCAS_ECHO is set, only print the command
    if [ -v EMCAS_ECHO ]; then
        echo $COMMAND
    else
        command $COMMAND
    fi
}
```

# 問題点
EMCASでは、emacsコマンドもemcasにaliasしているので、例えば、

```Bash
emacs s0nw
```
と打った際、本当はs0nwというテキストを開きたかったとしても、s0nwは-nwのタイポだと判断して

```Bash
emacs -nw
```
を実行してしまいます。

これを避けるためには、emcas関数が第一引数のタイポしかチェックしないことを利用して、

```Bash
emacs -nw s0nw
```
とすれば、このコマンドはそのまま実行されるので、s0nwファイルを開けます。