24
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

zshで範囲選択・削除・コピー・切り取りする

Last updated at Posted at 2014-12-08

概要

これはzsh Advent Calendar 2014の9日目のエントリです。

最近zshのコマンドラインで表題の範囲選択とかを出来ることを知りました。で、それ自体は便利なんですが、かゆいところに手が届かない感じだったので自分でwidget(zshのキーバインドに割り当てられる関数みたいなやつ)を書きました。
その内容を共有します。

範囲選択

control+@control+spaceでemacsのmarksetライクに範囲選択(set-mark-command)が出来ます。入力文字が変わる操作をすると範囲選択モードが終わります。

削除

範囲選択した状態でcontrol+hとか押したら選択したところ全部消えて欲しいんですけど、いつも通りの1文字削除しかしてくれません。しかも、あろうことか範囲選択したところを(切り取りではなく)削除する機能がデフォルトでないようでした(あれば教えて下さい)
というわけで、

  • control+hで普段は手前の1文字削除なんだけど範囲選択してたらその範囲を削除
  • control+dで普段は後ろの1文字削除なんだけど範囲選択してたらその範囲を削除

というのを出来るようwidget書きました。

function delete-region() {
    zle kill-region
    CUTBUFFER=$killring[1]
    shift killring
}
zle -N delete-region

function backward-delete-char-or-region() {
    if [ $REGION_ACTIVE -eq 0 ]; then
        zle backward-delete-char
    else
        zle delete-region
    fi
}
zle -N backward-delete-char-or-region

function delete-char-or-list-or-region() {
    if [ $REGION_ACTIVE -eq 0 ]; then
        zle delete-char-or-list
    else
        zle delete-region
    fi
}
zle -N delete-char-or-list-or-region

bindkey "^h" backward-delete-char-or-region
bindkey "^d" delete-char-or-list-or-region

コピー

範囲選択した状態でEscape押してからwを押すと選択範囲をコピー(copy-region-as-kill)が出来ます。
oh-my-zshを使っていると、Escape→wが切り取り(kill-region)に割り当てられてるので注意。

で、このcopy-region-as-killはコピーしても範囲選択状態が続くんですよね。コピーしたら範囲選択は終わってほしいので、これもwidget書きました。

function copy-region() {
    zle copy-region-as-kill
    REGION_ACTIVE=0
}
zle -N copy-region
bindkey "^[w" copy-region

ちなみに貼り付け(yank)はcontrol+yです。

切り取り

kill-regionというwidgetが用意されていて、これを呼ぶと選択範囲の切り取りが出来ます。しかしデフォルトではショートカットキーに割り当てられていません。で、単純にこのkill-regionをてきとうなキーに割り当てても良かったんですが、ちょっと工夫してみました。
Emacsだとcontrol+wが、このkill-regionと同等の機能に割り当てられてます。ですが、zshのデフォルトだとcontrol+wは単語切り取りです。
そこで、「普段は単語切り取り。範囲選択状態ならその範囲を切り取り」と言う挙動になるwidgetを書いてみました(と言うか僕のEmacsがそういう風にカスタマイズしてるんで同じにしたかっただけなんですけどね!)

function backward-kill-word-or-region() {
    if [ $REGION_ACTIVE -eq 0 ]; then
        zle backward-kill-word
    else
        zle kill-region
    fi
}
zle -N backward-kill-word-or-region
bindkey "^w" backward-kill-word-or-region

補足

24
21
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
24
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?