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