LoginSignup
6
5

More than 5 years have passed since last update.

zsh に shift+insert で貼り付けても URL escape したい

Last updated at Posted at 2016-11-22

はい

.zshrc
# 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 に使用する例があった。

.zshrc
zstyle :bracketed-paste-magic paste-init backward-extend-paste

これをやると貼り付けた地点のコンテキストを考慮して bracketed-paste-magic が有効になってくれる。URL の末尾にテキストを追加したい場合等に便利とあって、便利さを感じた。

6
5
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
6
5