Edited at

zshの個人的に便利だと思った機能(suffix alias、略語展開)

More than 1 year has passed since last update.

zshデビューしたので、個人的に便利だと思った機能をまとめた。


suffix alias

alias -sを利用することで拡張子に応じたコマンドを実行してくれるようになる。


例えば

python hello.py # hello.

のような実行においても

alias -s py='python'

としておくと

./hello.py # hello.

のような形式で実行できる。

こちらで紹介されている.cファイルを実行すると自動でビルド->実行までしてくれるような設定が可能で、もはやなんでもできそうな感じがする。スゴイ

現在は下のように設定している。練習がてらjavaを追加。

alias -s txt='cat'

alias -s html='google-chrome'
alias -s rb='ruby'
alias -s py='python'
alias -s hs='runhaskell'
alias -s php='php -f'
alias -s {gz,tar,zip,rar,7z}='unarchive' # preztoのarchiveモジュールのコマンド(https://github.com/sorin-ionescu/prezto/tree/master/modules)
alias -s {gif,jpg,jpeg,png,bmp}='display'

function runcpp () {
g++ -O2 $1
shift
./a.out $@
}
alias -s {c,cpp}='runcpp'

function runjava () {
className=$1
className=${className%.java}
javac $1
shift
java $className $@
}
alias -s java='runjava'


ネタ元


略語展開(iab)

zshではalias -gとすることで、先頭以外でも展開されるエイリアス(グローバルエイリアス)の設定が可能だ。

ただ、(他のエイリアスと同じく)展開結果を目視することは不可能なので、グローバルに展開されるとなると少し不安が伴う場合がある。

不安で胃に穴が空きそう人やグローバルと聞くと蕁麻疹が出る人には、こちらで紹介されているvimのiabと同じような動作をする略語展開の設定が有効。

この設定で"G""| grep"あたりに設定しておくと、G␣(Gのあとにスペース)と入力すると| grepに自動で置換される。<C-x>を入力してからスペースを押せば展開させないことも可能だ。(もちろんhogeG␣で暴発みたいなことはない。スゴイ)

現在は下のように設定している。設定したいときは.zshrcあたりに下記をコピペして(または別ファイルに書いて .zshrcあたりでsource hogehogeとする。)、abbreviationsを好きなように書き換えればOK。

setopt extended_glob

typeset -A abbreviations
abbreviations=(
"G" "| grep"
"X" "| xargs"
"T" "| tail"
"C" "| cat"
"W" "| wc"
"A" "| awk"
"S" "| sed"
"E" "2>&1 > /dev/null"
"N" "> /dev/null"
)

magic-abbrev-expand() {
local MATCH
LBUFFER=${LBUFFER%%(#m)[-_a-zA-Z0-9]#}
LBUFFER+=${abbreviations[$MATCH]:-$MATCH}
zle self-insert

}

no-magic-abbrev-expand() {
LBUFFER+=' '

}

zle -N magic-abbrev-expand
zle -N no-magic-abbrev-expand
bindkey " " magic-abbrev-expand
bindkey "^x " no-magic-abbrev-expand

追記(fishの話)

fishにはabbrというコマンドがありますが暴発防止のために展開位置に制限があり、上記のようなパイプを展開する用途では利用できません。

同じような挙動になるように調節した関数を作ったので参考になれば幸いです。

https://gist.github.com/matsu-chara/cb7c3eb81ffd909e922db39e87fec873


ネタ元