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


概要

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

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

というのが由来です。

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

インストール

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

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

実行例

EMCASを使って打ち間違いを補間する様子です。

補間できる単語の例を示します。どの単語を補間できるかは、ソースコードをご覧ください。

$ ./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)の中では、以下のようなタイポワードリストを作っています。

  • emacs部のタイポワードリスト
EMCAS_ALIASES=(
    eamcs
    eamsc
    ema
    ems
    emac
    emacs
    emasc
    emavs
    emcs
    emsc
)
  • nw部のタイポワードリスト
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関数を呼びます。

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

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

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しているので、例えば、

emacs s0nw

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

emacs -nw

を実行してしまいます。

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

emacs -nw s0nw

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