LoginSignup
11
10

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-06-17

悩み

ヴィジュアルモード(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モードの置換連続ペーストができない)

参考

11
10
3

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
11
10