Help us understand the problem. What is going on with this article?

zshにオプションや引数を補完できるキーバインドを設定しよう

More than 5 years have passed since last update.

はじめに

今回は、zshにオプションや引数を補完できるキーバインドを設定する方法を紹介します。

どういうことかというと、まずは、下記の画像を見てもらうのが分かりやすいと思います。

画像では、特定のキーを押すと、まだ、実行されていない状態でパッとコマンドが現れます。

ここで、Tabや設定によっては、を押すと、補完候補を選択できます。

何が便利か

このようなキーを設定すると、何が便利なのかというと、引数などをその場で設定しないといけない長いコマンドにも、ショートカットのようなものが使えるという点です。

例えば、git fast-import --active-branches=hogeというコマンドをhogeの部分を変更して、頻繁に使うような場合は、エイリアスでは、対応できないことがあります。

そんな時には、例えば、以下の様なキーバインドを設定してみましょう。下記は、コミットメッセージを登録するコマンドのショートカットを設定しています。

~/.zshrc
# コミットメッセージを送りやすくするキー[C-o]を設定する
function git_commit() {
        BUFFER="git commit -m '"
        CURSOR=$#BUFFER
        BUFFER=$BUFFER\'
}
zle -N git_commit
bindkey '^o' git_commit

有効にするには、設定ファイルを再読み込みします。

$ source ~/.zshrc

上記を設定すると、Ctrl+oを押すと、コミットメッセージを登録するコマンドがコマンドラインに表示されます。

では、一つずつ、設定ファイルに記述した内容を見て行きたいと思います。

設定ファイルの解説

function

functionというのは、今から命令の集まりを記述するという合図のことを言います。これを命令群や関数ということがあります。

そして、命令の記述がどこで始まり、どこで終わるのかは、{}で指定します。

つまり、命令群は、function { 命令の記述 }という形で成り立ちます。

次に、命令郡の名前を決めなければなりません。ここでは、git_commitという名前をつけました。

命令群の名前は、自由に決められます。ただし、使えない文字列もありますので、注意してください。

そして、頭にあるような括弧()の意味は、引数と言って、コマンド後に何かしらの文字や数字を引用する際に使います。普段は、空のままでよいです。

BUFFER

ここで、BUFFERは、変数と言って、数字や文字列を入れておいて後で使うことができる「箱」のようなものを用意するという命令です。

本来は、「箱」の名前は、何でも良いのですが、ここでは、BUFFERという名前を付けて「箱」を用意しました。

しかし、今回用意したBUFFERという箱は、バッファを意味し、zshが用意する特別な箱です。

ここでいうバッファとは何かというと、一時的にコマンドを退避させておく仕組みのようなもので、退避されたものは、1動作後に表に出てくるようになっています。

つまり、BUFFERという箱には、コマンドラインへ表示させるという命令がプラスされて入っていることになります。

そして、その後くる=の記述は、「箱に=の後にくるものを入れるよ」という合図なのです。

では、用意したBUFFERという箱に何を入れるのかというと、ここでは、git commit -m 'という文字列を入れました。

なお、空白を含む文字列を入れる際は、できるだけ"で囲うようにしています。

CURSOR

次に、CURSORという箱を用意しました。これも特別な箱で、中には、カーソルの位置情報が入っています。

ここで、「0」は行頭を意味し、「$」は行末を意味します。

つまり、上の命令は、「カーソルの位置は、BUFFERの行末に」というものです。

$BUFFER

実は、用意した変数は、そのままでは使えません。他の命令特別するため、変数名の前に「$」を付けなければなりません。

ここで、=により、BUFFERという箱は、今までのBUFFERの中身+「'」という文字列に書き換えられています。

ちなみに、「'」のような特殊文字は、¥エスケープという文字を直前に挿入することで、初めて文字列として認識されることを覚えておいてください。

bindkey

新たなキーバインドを設定するには、3つの要素が必要です。

具体的には、①参照するコマンドをラインエディタ上で有効にする、②登録するキー、③参照するコマンド、です。

ちなみに、登録するキーについてですが、^Ctrlキーの略です。キーについては、特殊な表現がありますので気をつけてください。

例えば、ここで、Macにシャットダウンのキーを設定したいとします。

この場合、以下の様な感じで書けばよいです。

~/.zshrc
# Macをシャットダウンするキー[C-S-s]を設定する
function shutdown-mac() {
osascript -e 'tell application "Finder" to shut down'
}
zle -N shutdown-mac
bindkey '^S' shutdown-mac

これで、Ctrl+Shift+sを押すことで、シャットダウンできるようになります。

zshの補完設定

もし補完設定を行っていない場合は、以下の様な感じで、設定ファイルに設定を記述してみてください。

~/.zshrc
# 補完を有効にする
autoload -U compinit
compinit -u

# 補完メッセージを読みやすくする
zstyle ':completion:*' verbose yes
zstyle ':completion:*' format '%B%d%b'
zstyle ':completion:*:warnings' format 'No matches for: %d'
zstyle ':completion:*' group-name ''

さいごに

皆様も、オプション補完や引数補完を行う必要があるコマンドは、エイリアスではなく、バッファを使って登録してみてはどうでしょう。

以下の書式で大体は対応できると思います。ここに〇〇という部分を変更して使ってください。

~/.zshrc
function ここに関数の名前() {
        BUFFER="ここにコマンド" #何をコマンドラインに表示するか
        CURSOR=$#BUFFER # カーソル位置を行末に設定
        # BUFFER=$BUFFER\' # カーソルを括弧内に移動する場合
}
zle -N ここに関数の名前
bindkey 'ここに設定したいキー' ここに関数の名前

次回は、補完関数を自作する方法でも紹介してみようかなと思っています。よろしくお願いします。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした