悩み
ヴィジュアルモード(visual mode)で単語を選択→yでコピー(copy)→適当な場所へ移動→ビジュアルモードで選択→pで置換貼り付け
とやると、最初の一回は意図したとおりに貼り付けれるが、2回目以降は、直前に置換した元の単語が貼り付けられてしまう。
多分、ビジュアルモードで貼り付ける際に、d→i→pみたいに途中でレジスタに入りコピーされてしまうのではないかと思われる。不便だ。
解決
.vimrc
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>
確かに解決はしたんだけど、こんな大仰なことしないでも、貼付け時のレジスタを変更すればいいだけだった。
というわけで以下でOKでした。
.vimrc
vnoremap <silent> p "0p
ちなみに
vimのコピーをOSのクリップボードと一緒にする設定で
.vimrc
set clipboard=unnamed,autoselect
というのをよく見かけるが、これをやると前述のヴィジュアルモードを使った置換貼付けができなくなる
.vimrc
set clipboard=unnamed
とするとうまくいく。
組み合わせると、両立できる!!
参考
- Vimで、文字列を別のところに「持って行って置換する」効率的な方法は? - Qiita http://qiita.com/hyuki/items/00c6aa71f299e9ce17e6
- vimの連続コピペできない問題 - Qiita http://qiita.com/fukajun/items/bd97a9b963dae40b63f5
- substitute text that selected on visual-mode without overriding register bug: multibyte charactor on line-end cannot be judged well https://gist.github.com/gimKondo/7989969
- 電脳柔術家はソースコードの夢を見るか vim http://gimkondo.blog98.fc2.com/blog-category-11.html