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

vimでヴィジュアルモードの連続貼り付け

More than 5 years have passed since last update.

悩み

ヴィジュアルモード(visual mode)で単語を選択→yでコピー(copy)→適当な場所へ移動→ビジュアルモードで選択→pで置換貼り付け
とやると、最初の一回は意図したとおりに貼り付けれるが、2回目以降は、直前に置換した元の単語が貼り付けられてしまう。

多分、ビジュアルモードで貼り付ける際に、d→i→pみたいに途中でレジスタに入りコピーされてしまうのではないかと思われる。不便だ。

解決

function! Put_text_without_override_register()
  let line_len = strlen(getline('.'))
  execute "normal! `>"
  let col_loc = col('.')
  execute 'normal! gv"_x'
  if line_len == col_loc
    execute 'normal! p'
  else 
    execute 'normal! P'
  endif
endfunction
xnoremap <silent> p :call Put_text_without_override_register()<CR>

これを.vimrcに追記すれば解決(←これだけではだめ)

確かに解決はしたんだけど、こんな大仰なことしないでも、貼付け時のレジスタを変更すればいいだけだった。
というわけで以下でOKでした。
(←ダメだった)

vnoremap <silent> p "0p

ちなみに

vimのコピーをOSのクリップボードと一緒にする設定で

set clipboard=unnamed,autoselect

というのをよく見かけるが、これをやると前述のヴィジュアルモードを使った置換貼付けができなくなる

set clipboard=unnamed

とするとうまくいく。

組み合わせると、両立できる!!

がっ、だめっ・・・!

2014/07/07追記
これじゃ、v時のdでカットしたものを貼り付けできない。他のアプリでクリップボードにコピーしたものも貼り付けできない。やはり、長ったらしいスクリプト書くしか無いんじゃないか。

結論

結論は、最初に書いたスクリプトが一番良いということでした。↓

" vモードの置換連続ペースト用
function! Put_text_without_override_register()
  let line_len = strlen(getline('.'))
  execute "normal! `>"
  let col_loc = col('.')
  execute 'normal! gv"_x'
  if line_len == col_loc
    execute 'normal! p'
  else 
    execute 'normal! P'
  endif
endfunction
xnoremap <silent> p :call Put_text_without_override_register()<CR>

set clipboard=unnamed "ヤンクした時に自動でクリップボードにコピー(autoselectを指定するとvモードの置換連続ペーストができない)

参考

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
ユーザーは見つかりませんでした