はい
# Setup:
autoload -Uz bracketed-paste-magic
zle -N bracketed-paste bracketed-paste-magic
# 便利
zstyle :bracketed-paste-magic paste-init backward-extend-paste
あとはポエムです。
経緯
macOS/OS X で zsh 使ってる時、URL の文脈で自動でエスケープかけてくれてることに気付いてマジ便利と思っていたものの、Windows/Linux でターミナルに shift-insert で貼り付けた場合に適用されていなくて辛い思いをしていた。よく考えると Mac では Cmd+V で貼りつけていたので、これはターミナル側の機能なのでは…?と考えたりもしたが、bash で貼り付けるとエスケープされなかったので zsh の機能だと当たりを付けて調べた。
Bracketed Paste Mode
shift-insert で貼り付けた部分がリージョン選択状態になっていたのでそれが原因かと思い、キーシーケンスがバッティングしてるのかとか適当なことを考えながら ^@
の bindkey を削除したりしている最中に shift-insert のキーシーケンス ^[[200~
に bracketed-paste というものが割り当てられているのに気付いた。
調べると xterm 拡張の Bracketed Paste Mode というものがあるらしく、これが関係しているらしい。適当に bindkey -r "^[[200~"
とかやったが全然違ったので定義されてる bracketed-paste について調べた。
bracketed-paste-magic
まあやっぱり既にどこかで検討されてるもので、bracketed-paste-magic というものがあった。
ざっくり説明を読むと、Zsh 5.1 から上記の Bracket Paste Mode を zsh が考慮するようになったものの、その為の ZLE widget である bracketed-paste が url-quote-magic のような widget を無効化してしまうと。URL が自動エスケープされるのはこの widget のおかげだった様子。というわけでそれを回避する為にはこの bracketed-paste-magic を利用するといいらしい。
zstyles
文脈補完の zstyle について、bracketed-paste-magic の動作を制御するもの。bracketed-paste-magic のコード 中のコメントに詳細な説明がある。
active-widgets
bracketed-paste-magic のコンテキスト内で有効にしたい widget 名のパターンのリストを与える。組み込み拡張用にデフォルトで self-* というパターンが与えられている。
inactive-keys
bracketed-paste-magic が有効な間で無視するキーシーケンスのリストを与える。これはパターンは受け付けないらしい。デフォルトは無し。
paste-init/paste-finish
関数名のリストを取って、それぞれのタイミングの hook でコールする。リスト順に非 0 を返すまで実行される。なんかパラメータの説明とかあったけど zsh の関数を書いたこと無いので詳しくなく、色々ありますねという気持ちになった。
実行例として bracketed-paste-magic が提供している関数を paste-init に使用する例があった。
zstyle :bracketed-paste-magic paste-init backward-extend-paste
これをやると貼り付けた地点のコンテキストを考慮して bracketed-paste-magic が有効になってくれる。URL の末尾にテキストを追加したい場合等に便利とあって、便利さを感じた。