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

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のよう略語展開 - (rubikitch loves (Emacs Ruby CUI Books))で紹介されているvimのiabと同じような動作をする略語展開の設定が有効。

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

現在は下のように設定している。

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

ネタ元:

おまけ

はてぶろに念願の予約投稿機能が追加されたので使ってみる。すごい嬉しい( ´_ゝ`)