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

zshで直前のコマンドラインの最後の単語を挿入する

More than 5 years have passed since last update.

zshでは、直前のコマンドラインの最後の単語を挿入する機能がある。1つのファイルに対して違うコマンドを実行するときに便利なので紹介する。

insert-last-wordを使う

標準でinsert-last-wordという機能がある。これを使うと、直前のコマンドラインの最後の単語がカーソル位置に挿入される。キーバインドはESC-_と ESC-.に割り当てられているので、ESCを押したあとに_、またはESCを押したあとに.で使える。

% git diff foo.txt
% git add # <= ここでESC-.
% git add foo.txt # <= 前のコマンドラインの末尾にある単語が挿入される

これを使ってもいいんだけど、次のsmart-insert-last-wordというやつをつかうともっと便利なので紹介する。

smart-insert-last-wordを使う

smart-insert-last-wordというのもある。これを有効にするための設定は次のとおり。

autoload -Uz smart-insert-last-word
zle -N insert-last-word smart-insert-last-word

これを使うと、標準のinsert-last-wordがスマートなやつに置き換わる。具体的には、[a-zA-Z], /, \ のうち少なくとも1文字を含む単語だけが挿入の対象になって、そうじゃない単語は読み飛ばされる。

キーバインドはinsert-last-wordと変わらないので、そのまま同じように使える。

% git diff foo.txt 2>&1
% git add # <= ここでESC-.
% git add foo.txt # <= 2>&1は出てこない

smart-insert-last-wordをカスタマイズする

「match」というスタイルを使うと、smart-insert-last-wordでどういう文字列を単語とみなすのかをカスタマイズできる。

標準は「[a-zA-Z], /, \ のうち少なくとも1文字を含む文字列」という条件になってる。

# [a-zA-Z], /, \ のうち少なくとも1文字を含む単語
zstyle :insert-last-word match '*[[:alpha:]/\\]*'

これを「[a-zA-Z], /, \ のうち少なくとも1文字を含む長さ2以上の文字列」というふうに変更する例は次のとおり。

# [a-zA-Z], /, \ のうち少なくとも1文字を含む長さ2以上の単語
zstyle :insert-last-word match '*([[:alpha:]/\\]?|?[[:alpha:]/\\])*'

これは1文字のグローバルエイリアスを使っているときに便利。末尾にHとかあってもそれは読み飛ばされるようになる。

# alias -g H='| head' というエイリアスを設定しているとする
% git diff foo.txt H
% git add # <= ここでESC-.
% git add foo.txt # <= Hは出てこない

キーバインドを変更する

もちろん、キーバインドは変更できる。次の例では^](Ctrlを押しながら])に変更している。

bindkey '^]' insert-last-word

標準のキーバインドはちょっと押しにくいので、よく使うなら変更しておいたほうが便利。

まとめ

最後に、今回紹介した設定をまとめておく。これを~/.zshrcに書いておけば今回紹介した機能が使用できる。

autoload -Uz smart-insert-last-word
# [a-zA-Z], /, \ のうち少なくとも1文字を含む長さ2以上の単語
zstyle :insert-last-word match '*([[:alpha:]/\\]?|?[[:alpha:]/\\])*'
zle -N insert-last-word smart-insert-last-word
bindkey '^]' insert-last-word
mollifier
zsh, vim, vimperator, JavaScript, iOS, .NET に興味があるプログラマ
http://mollifier.hatenablog.com/
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
ユーザーは見つかりませんでした