この記事はなんとかアドベントカレンダーの何日目かの記事です。
なんかエイリアスってあるじゃないですか。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_handler
はmethod_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]
をせざるをえないっぽいので泣いてます。