【コラム】

漢のzsh

6 漢はだまって先方予測 - あなたはこの機能使いこなせるか

6/24

zshにすべておまかせ - 先方予測で驚愕と苛立ちを両ゲット

これまで4回にわたってzshの基本設定を説明してきた。実際問題、これくらい設定しておけばzshの恩恵に十分にあずかることができる。とくに「autoload -U compinit; compinit」を設定して補完機能が有効になっている場合、ケースバイケースを考慮したかなり賢い補完が実施されている。

ではそろそろzshの変態領域へ入っていくとしよう。

zshの変態っぷりを手っ取り早く感じるには、先方予測機能がわかりやすい。とりあえずだまってリスト1を実行だ。

リスト1 先方予測機能を有効に設定 - この機能を使いこなることができるか?

autoload predict-on
predict-on

リスト1を実施したあとの操作例を次に示しておく。ともかく、リスト1を実行したらzshを使ってみてほしい。そこには新しい世界が待っているはずだ。

プロンプト1 oと入力すると…

% autoload predict-on
% predict-on
%
% o

プロンプト2 自動的にoからはじまるコマンドの補完リストが表示される

% o
objcopy                             openoffice.org-2.1.0-swriter
objdump                             openssl
objformat                           opieinfo
oclock                              opiekey
ocspclnt                            opiepasswd
od                                  orbd
oidcalc                             orbit-idl-2
oil-bugreport                       orbit2-config
openRTSP                            orca
openoffice.org-2.1.0                otp-md4
openoffice.org-2.1.0-sbase          otp-md5
openoffice.org-2.1.0-scalc          otp-sha
openoffice.org-2.1.0-sdraw          outb
openoffice.org-2.1.0-setofficelang  outl
openoffice.org-2.1.0-simpress       outw
openoffice.org-2.1.0-smath          ownership
openoffice.org-2.1.0-spadmin        

プロンプト3 opまで入力すると、opではじまるコマンドの補完リストが表示される

% op
openRTSP                            openoffice.org-2.1.0-smath
openoffice.org-2.1.0                openoffice.org-2.1.0-spadmin
openoffice.org-2.1.0-sbase          openoffice.org-2.1.0-swriter
openoffice.org-2.1.0-scalc          openssl
openoffice.org-2.1.0-sdraw          opieinfo
openoffice.org-2.1.0-setofficelang  opiekey
openoffice.org-2.1.0-simpress       opiepasswd

プロンプト4 opeまで入力するとopenまで補完される

% open

プロンプト5 openofまで入力すると…

% openof

プロンプト6 openoffice.org-2.1.0まで補完される。ここで実行しておき、

% openoffice.org-2.1.0

プロンプト7 次にoを入力すると

% o

プロンプト8 自動的にopenoffice.org-2.1.0まで補完される

% openoffice.org-2.1.0

先方予測機能を有効にすると、ユーザの入力に対してzshができる限り予測して介入し、自動的に補完を実施するようになる。コマンド履歴から学習するので、こちらの動きに合わせて予測を実施してくれるわけだ。かな漢字変換システムにおける先方予測機能のようなもので、ばしっと先方予測が効いたときの快感はなんともえいない。zshとウマが合うならこの機能は有効にするべきだ。

便利は便利なのだが、先方予測が失敗した場合、zshがこちらの修正を思ったように受け付けてくれないことがある。このときのストレスはただならない。裏切られた!と感じる。一度でもzshが「許せない」と思ったら、この機能は使わないほうがいい。

ついでにエイリアス

基本設定で触れていなかったので、簡単にエイリアスについて説明しておく。エイリアスはコマンドのショートカットを設定するようなものだ。たとえばリスト2のように設定する。alias du="du -h"なら、duコマンドがdu -hとして実行されるようになる。

リスト2 エイリアスの設定例

alias where="command -v"
alias j="jobs -l"

alias ls="ls -G -w"
alias la="ls -a"
alias lf="ls -F"
alias ll="ls -l"

alias du="du -h"
alias df="df -h"

alias su="su -l"

たとえばalias du="du -h"が実行されていれば、プロンプト9のようにdfを実行すると-hが効いた状態で表示される。容量の表示がMやB、Gなど人間にとって理解しやすい表記になっていることがわかる。これをプロンプト10のように実行すれば、エイリアスは効かないから-hは有効にならず、バイト単位で表示される。

プロンプト9 エイリアスが効いているので、自動的にオプションが有効になる

% df
Filesystem     Size    Used   Avail Capacity  Mounted on
/dev/ad8s1a    496M     76M    380M    17%    /
devfs          1.0K    1.0K      0B   100%    /dev
/dev/ad8s1e    496M     60M    396M    13%    /tmp
/dev/ad8s1f    221G    142G     61G    70%    /usr
/dev/ad8s1d    1.9G    115M    1.6G     6%    /var
linprocfs      4.0K    4.0K      0B   100%    /usr/compat/linux/proc
%

プロンプト10 直接パスを入力するとエイリアスは有効にならない

% /bin/df    
Filesystem  1K-blocks      Used    Avail Capacity  Mounted on
/dev/ad8s1a    507630     77466   389554    17%    /
devfs               1         1        0   100%    /dev
/dev/ad8s1e    507630     61382   405638    13%    /tmp
/dev/ad8s1f 231522564 148813758 64187002    70%    /usr
/dev/ad8s1d   2000206    117346  1722844     6%    /var
linprocfs           4         4        0   100%    /usr/compat/linux/proc

alias組み込みコマンドを引数なしで実行すれば、現在設定されているエイリアスの一覧を表示させることができる。

プロンプト11 設定されているエイリアス一覧を表示

% alias
df='df -h'
du='du -h'
j='jobs -l'
la='ls -a'
lf='ls -F'
ll='ls -l'
ls='ls -G -w'
run-help=man
su='su -l'
where='command -v'
which-command=whence
%

設定ファイルは一般ユーザとrootとで分けたほうがいいのだが、実際問題として、分けると管理が面倒くさい。そこで細かいテクニックの話になるが、リスト3のようにrootのときだけ設定する内容を分岐させるといい。こうしておけばrootだけ別の設定ができる。

リスト3 rootのときだけ設定を分けてみる

case ${UID} in
0)
    alias checkports='pkg_version -v -l \<'
    alias updateports='cd /usr/ports && make update fetchindex && checkports'
    alias updateindex='cd /usr/ports && make index && portsdb -u'
    alias portsclean portsclean -CD
    ;;
esac

zshは補完が高度なのであまり素のエイリアスを使う必要性はない。zshのエイリアスはもっと変態なことができるので、そっちはおいおい取り上げるとする。

ついでにちょい管理テク

あとまぁこれも細かい話なんだが、これから設定をいぢっていくことを考えると、このタイミングで紹介していたほうがよさそうだ。

設定ファイルの書き方として、

  • ほかのユーザとある程度設定ファイルを共有している
  • ホストごとに設定ファイルを書いている

このような場合なんかは、リスト4の設定を~/.zshrcの最後の行に追加しておくといい。

リスト4 ~/.zshrcから~/.zshrc.mineファイルの内容を読み込んで実行する

[ -f ~/.zshrc.mine ] && source ~/.zshrc.mine

この設定を追加しておくと、~/.zshrc.mineがある場合に~/.zshrc.mineの設定も読み込んで実行するようになる。

~/.zshrcをそのままいぢる場合、往々にして最終的に変態ファイルができあがってしまう。いずれ管理はできなくなるだろう。なので、とりあえず前回までの基本設定ファイルを~/.zshrcに書き込んでおいて、それ以降の実験的な設定は~/.zshrc.mineに書き込んでおく。でもって実験的な設定が有用だとわかった場合には、~/.zshrcに設定をマージするという寸法だ。

このやりかたはいろんな利点があるのでお薦めだ。また、ホストに特有の設定なんかも~/.zshrc.mineに書く方がいい。どのホストでも同じように必要になる設定だけを~/.zshrcに書くようにすれば、ほかのホストやユーザとも設定が共有できるし、管理もしやすい。

6/24

インデックス

連載目次
第24回 グッバイ野郎ども! コピペではじめるzshファイナル
第23回 コマンド補完設定 - アーキテクチャタイプ編
第22回 もってけ泥棒! コピペで始めるzsh - リターンズ
第21回 コマンド補完設定 - ファイルシステムタイプ編
第20回 コマンド補完設定 - cal/ncalコマンド編
第19回 コマンド補完設定 - trafshowコマンド編
第18回 コマンド補完設定 - daemonコマンド編(2)
第17回 コマンド補完設定 - daemonコマンド編(1)
第16回 拡張子ごとにコマンドを自動実行 - 「alias -s」
第15回 **で簡単ヒット!!! - 漢達への熱いお願い付き
第14回 zshとscreenで最強のターミナル環境
第13回 タブキーは最強だ - ファイルグロブもサクっと展開
第12回 一時ファイルはもういらない - プロセス置換
第11回 zshはエディタか? - 「zed」でお手軽編集
第10回 もってけ泥棒! コピペで始めるzsh
第9回 世界はモノクロからカラーへ
第8回 これは既にシェルを超えている…… zshの算術演算
第7回 ひと味違うzshのリダイレクト
第6回 漢はだまって先方予測 - あなたはこの機能使いこなせるか
第5回 「あーっ!」というそのときのために - 備えあれば憂いなしの設定集
第4回 コマンド履歴の検索~EmacsとVi、どっちも設定できるぜzsh
第3回 同じことを2度するなんて…… 自分の過去は利用しましょう
第2回 取りあえず、プロンプトを整えておく。カッコつけたいからね
第1回 最強のシェル、それは「zsh」

もっと見る



人気記事

一覧

イチオシ記事

新着記事