Skip to content

Instantly share code, notes, and snippets.

@45deg
Last active December 16, 2019 13:59
Show Gist options
  • Save 45deg/a176a2a0451bd3aa5da76a7a1c56afdb to your computer and use it in GitHub Desktop.
Save 45deg/a176a2a0451bd3aa5da76a7a1c56afdb to your computer and use it in GitHub Desktop.

この記事はなんとかアドベントカレンダーの何日目かの記事です。

なんかエイリアスってあるじゃないですか。ll = ls -lah みたいな。

頻繁に使うコマンドを短く書けるのはいいんですけど、いちいち書くのダルくないですすか?

vim ~/.zshrc[Enter]Goalias ll='ls -lah'[ESC]:wq[ENTER]source ~/.zshrc[ENTER] ってやるんですよね。

あっこれエイリアス作りたいな~と思っても、IQが1なのでたぶんvim ~/.zshrc[Enter]Goって打った時点で「あれ、何のエイリアス作りたいんだっけ……」と忘れてしまいそうじゃないですか?

今回はそれを雑に解決します。

#!/usr/bin/zsh

function command_not_found_handler() {
  cmd=$1
  in_file=$(awk -F'=' "{ if (\$1 ~ /^alias $cmd/) print \$2 }" < ~/.aliases | sed "s/^'\|'$//g" | tail -1)
  if [ -n "$in_file" ]; then
    eval "$in_file"
  else
    echo "Command $cmd not found."
    echo -n "Register $cmd as:"
    read -r new
    if [ -n "$new" ]; then
      echo "alias $cmd='$new'" >> ~/.aliases
    fi
  fi
}

## Aliases

を ~/.aliases に保存してください。

そして source ~/.aliases.zshrcに追加してsource .zshrcをすれば完成です。

で、何ができるかというと、

$ iq1
Command iq1 not found.
Register iq1 as:echo IQが1

$ iq1
IQが1

というように、存在しないコマンドを入力したときにエイリアスを登録できるようになります。

これで vim ~/.zshrc[Enter]Goalias ll='ls -lah'[ESC]:wq[ENTER]source ~/.zshrc[ENTER] しなくても ll[Enter]ls -lah[Enter] で済むようになります。

テキトーに解説すると、

  • command_not_found_handlermethod_missingみたいなやつ
  • alias の定義を ~/.aliases に自己書き換えしている
  • シェルスクリプト内でaliasできないので暴挙(aliasをパースしてevalする)で解決している
    • なんか bash だともっとスマートに解決しそうな気がした

注意点として、zshでしか動かないのと、'がコマンドにはいると変になりそうなことです。使いづらいところ/バグは自分で改良してください。 Public DomainとするのでQiitaに改良版あげたりboothで10000円で売ったりしてもいいです。

ちなみに発想元はSKKの辞書登録です。

オチ

自分はzimfwを使っているのでcommand_not_found_handlerが潰されていて、 vim ~/.zshrc[Enter]Goalias ll='ls -lah'[ESC]:wq[ENTER]source ~/.zshrc[ENTER]をせざるをえないっぽいので泣いてます。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment