LeafCage/yankround.vim

^Vの矩形選択のハイライトには未対応

Closed this issue · 10 comments

#2

region hl が矩形選択には未対応である。

t9md commented

ちょっとやりかけたメモだけ残しときます。
矩形選択ハイライト自体は以下の様にやればできました。
楽しみにしてます。

let [sl, sc] = [line("'["), col("'[")]
let [el, ec] = [line("']"), col("']")]
echo [sl, sc]
echo [el, ec]
let pat = printf('\v\c%%>%dl%%>%dc.*%%<%dl%%<%dc', sl-1, sc-1, el+1, ec+1)
call matchadd('Visual', pat)

すいません。ちょっと先ほどの発言の趣旨を理解していませんでした。
PRください。

t9md commented

ん、そうですか。なるほど。ちょっとやれるかどうかやってみます。
難しそうだったら断念するかも。。

何度も申し訳ありません。
こちらで実現できました。

t9md commented

https://github.com/LeafCage/yankround.vim/blob/master/autoload/yankround.vim#L10

ここgetregtype() にしないと初回 "xp とかの矩形が charwiseになっちゃいます。
引数空で v:register を見るとLeafCageさんがlingerで言ってましたよね。

t9md commented

それか getregtype(v:register) とした方わかりやすいかも

t9md commented

私の環境で、確認した限りだともうちょっと変更しないとちゃんととれなそうです。

function!  Sample(key)
  echo v:register
  echo getregtype(v:register)
  execute 'normal! ' . a:key
endfunction

nnoremap <silent><Plug>(yankround-p-new)  :<C-u>call Sample('p')<CR>
nmap p <Plug>(yankround-p-new)

みたいにして、Plugin内の関数で、最初の p するようにしないと、オリジナルの register が取れないです。
p:<C-u>call としてるところを、プラグイン内の関数内で normal! でやる方式に変えて、その normal の前(normal! の後だとオリジナルのレジスタはnormal! 時に使われちゃうので) に、getregtype(v:register) としないとダメでした。ちょっと大きめの変更になるのと、私自身はそれほど困らないので
pull req はしません。

今は、「初回の貼付け時にのリージョンハイライトは、default register( " or * or + depend on 'clipboard option ) が使われる」という状態ですね。
参考まで。

ありがとうございます。
とりあえずgetregtype()で取得するようにしました。
ただ、yankroundが最初のpを関数の外でやっているのには理由がありまして、そうしないとリピートに対応できないからです。
それを無理に対応させるにはrepeat.vimを使うなど、外部で色々やらないといけないのです。

あ、今、問題を正しく把握しました。
というか、今まで私はv:registerで取得できるだろうと勘違いしていました。
たしかに、これでは取得できませんね。
解決が難しい問題になりそうです。

t9md commented

リージョンハイライトの正確さよりも、repet 対応の方が大事だと思います。repeat.vim に依存したり、コードが複雑になるのはイヤですもんね。
どうもです。

関数の外でのexecuteコマンドだとリピートが反応することに気付いたので、それを利用して修正しました。
ついでにpを連続で使用した場合、前のハイライトが削除されずに残ってしまう問題にも対応しました。